<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[stay hungry stay foolish]]></title><description><![CDATA[程序媛 | 测试+前端开发 | 学习全栈中 | B站地址:https://space.bilibili.com/72570625]]></description><link>https://blog.youkuaiyun.com/u013716535</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; u013716535]]></copyright><item><title><![CDATA[[Playwright ][16]Playwright + TypeScript API 自动化测试实战：API测试]]></title><link>https://blog.youkuaiyun.com/u013716535/article/details/169849416</link><guid>https://blog.youkuaiyun.com/u013716535/article/details/169849416</guid><author>u013716535</author><pubDate>Tue, 03 Nov 2026 13:30:07 +0800</pubDate><description><![CDATA[页面报错，到底是前端还是后端背锅？这篇用 Playwright 的request直连后端，带你从跑通第一条/health测试开始，一步步搞懂。全程，新手照着抄就能跑。]]></description><category></category></item><item><title><![CDATA[[Playwright] [15]CI/CD 实战：Docker Compose + GitHub Actions 自动运行 E2E 测试]]></title><link>https://blog.youkuaiyun.com/u013716535/article/details/169466306</link><guid>https://blog.youkuaiyun.com/u013716535/article/details/169466306</guid><author>u013716535</author><pubDate>Mon, 02 Nov 2026 00:31:01 +0800</pubDate><description><![CDATA[手动触发 GitHub Actions → Docker Compose 启动应用 → 检查服务就绪 → Playwright 执行 E2E 测试 → 上传报告 → 清理环境。通过这套流程，我不再需要每次手动启动应用并执行测试，也可以在 GitHub Actions 中查看测试结果。目前 Workflow 使用手动触发。如果有权限，理想中应该增加push或触发条件，让代码每次git push更新时自动执行 E2E 测试。]]></description><category></category></item><item><title><![CDATA[[Playwright] [14]playwright.config.ts 实战：Project Dependencies 与 Teardown]]></title><link>https://blog.youkuaiyun.com/u013716535/article/details/169465949</link><guid>https://blog.youkuaiyun.com/u013716535/article/details/169465949</guid><author>u013716535</author><pubDate>Mon, 02 Nov 2026 00:30:19 +0800</pubDate><description><![CDATA[通过，我将多个测试模块组织为独立的 Projects，并使用 Project Dependencies 管理执行依赖，通过 Teardown 安排测试数据清理。自动化测试不仅需要保证单个用例正确，还需要考虑整个测试套件的执行顺序和数据生命周期。相比依靠测试文件的排列顺序，显式声明依赖关系更加清晰，也更方便后续集成到 CI/CD 流程中。]]></description><category></category></item><item><title><![CDATA[[Playwright][13] 测试数据管理：如何自动清理 E2E 测试数据？]]></title><link>https://blog.youkuaiyun.com/u013716535/article/details/169465807</link><guid>https://blog.youkuaiyun.com/u013716535/article/details/169465807</guid><author>u013716535</author><pubDate>Sun, 01 Nov 2026 04:13:41 +0800</pubDate><description><![CDATA[为保障HPC Dashboard E2E测试环境纯净，编写clearTestData-validation.spec.ts清理自动化测试数据。通过统一前缀（如playwright-job-）标识测试数据，利用while循环结合XPath与定位器作用域逐条删除Job及Recurring Job，并通过toHaveCount(0)验证删除成功。删除Recurring Job时配合page.once('dialog')处理确认弹窗。该方案基于UI操作，简洁有效，适用于当前项目规模，未来可升级为API清理以提升效率]]></description><category></category></item><item><title><![CDATA[[Playwright][12] 踩坑记录：为什么 locator.count() 不会自动等待]]></title><link>https://blog.youkuaiyun.com/u013716535/article/details/169465582</link><guid>https://blog.youkuaiyun.com/u013716535/article/details/169465582</guid><author>u013716535</author><pubDate>Sun, 01 Nov 2026 04:12:55 +0800</pubDate><description><![CDATA[这次实践让我认识到，Playwright 的 Locator 方法和自动重试断言并不是一回事。对于异步加载或动态更新的页面，应该优先使用expect()提供的自动重试断言，而不是通过固定等待时间或立即读取数量来判断页面状态。]]></description><category></category></item><item><title><![CDATA[用 AI 对话造出一个网页应用：WorkBuddy 全程驱动「破冰卡片」开发实录]]></title><link>https://blog.youkuaiyun.com/u013716535/article/details/169671466</link><guid>https://blog.youkuaiyun.com/u013716535/article/details/169671466</guid><author>u013716535</author><pubDate>Sun, 01 Nov 2026 04:06:30 +0800</pubDate><description><![CDATA[本文记录了作者在1024程序员节用AI编程搭档WorkBuddy，全程通过自然语言对话，零手写代码打造微信小程序“破冰卡片”的全过程。项目实现双人实时同步抽卡、默契报告生成、海报图鉴与主题系统等完整功能。借助WorkBuddy的Agent模式，从架构搭建到细节打磨均由AI自动完成，极大降低开发门槛，提升迭代效率。文章揭示了AI编程正重塑开发者角色——从写代码转向定义需求，真正实现“说清楚，它就做”。]]></description><category></category></item><item><title><![CDATA[[Playwright][11]事件监听实战：Download 下载与 Dialog 弹窗处理]]></title><link>https://blog.youkuaiyun.com/u013716535/article/details/169465350</link><guid>https://blog.youkuaiyun.com/u013716535/article/details/169465350</guid><author>u013716535</author><pubDate>Sat, 31 Oct 2026 00:15:46 +0800</pubDate><description><![CDATA[这两种操作都需要在触发事件之前做好准备，但处理方式有所不同。]]></description><category></category></item><item><title><![CDATA[[Playwright][10]Locator 实战：使用 XPath ancestor 精准定位 Job Card]]></title><link>https://blog.youkuaiyun.com/u013716535/article/details/169465204</link><guid>https://blog.youkuaiyun.com/u013716535/article/details/169465204</guid><author>u013716535</author><pubDate>Sat, 31 Oct 2026 00:15:11 +0800</pubDate><description><![CDATA[在 HPC Dashboard 的 Job Explorer 模块中，页面会展示多个 Job Card，每个卡片都有等操作按钮。如果直接定位按钮，可能匹配多个元素。因此，我采用了的方式。]]></description><category></category></item><item><title><![CDATA[[Playwright] [09]测试代码重构：提取公共方法，减少重复代码]]></title><link>https://blog.youkuaiyun.com/u013716535/article/details/169464967</link><guid>https://blog.youkuaiyun.com/u013716535/article/details/169464967</guid><author>u013716535</author><pubDate>Sat, 31 Oct 2026 00:14:43 +0800</pubDate><description><![CDATA[在 HPC Dashboard 的 Upload 模块自动化测试中，我编写了五条测试用例。随着测试增加，我发现文件上传、Job 提交等操作反复出现。如果每条用例都重复编写，不仅代码冗长，后续修改也比较麻烦。因此，我开始将重复操作提取为公共方法（Helper Functions）。接下俩的其他模块也是类似逻辑，先把逻辑跑通，然后把一些反复出现的代码提取出来，封装起来，直接调用。]]></description><category></category></item><item><title><![CDATA[[Playwright][08] Upload 模块自动化：如何设计真实业务测试用例？]]></title><link>https://blog.youkuaiyun.com/u013716535/article/details/169462535</link><guid>https://blog.youkuaiyun.com/u013716535/article/details/169462535</guid><author>u013716535</author><pubDate>Fri, 30 Oct 2026 00:06:47 +0800</pubDate><description><![CDATA[本文记录HPC Dashboard Upload模块E2E测试的开发过程。基于业务流程，设计五条测试用例，覆盖表单校验、普通Job提交及Recurring Job关联等核心场景。采用Playwright+TypeScript实现，封装文件上传与提交逻辑，重点验证提交后跨页面业务结果（如任务可见性、运行次数统计）。测试中发现定位精准性、等待机制与数据清理等问题，为后续优化提供方向。强调：自动化测试应验证业务结果，而非仅操作执行成功。]]></description><category></category></item><item><title><![CDATA[[Playwright][07] E2E 自动化测试项目实战：从框架搭建到 CI/CD]]></title><link>https://blog.youkuaiyun.com/u013716535/article/details/169462227</link><guid>https://blog.youkuaiyun.com/u013716535/article/details/169462227</guid><author>u013716535</author><pubDate>Fri, 30 Oct 2026 00:06:17 +0800</pubDate><description><![CDATA[这次实践让我重新走了一遍从编写测试用例，到组织测试代码、管理测试数据，再到搭建 CI/CD 环境的完整过程。项目还不算完善，但我希望通过持续记录，把开发中遇到的问题和解决思路整理下来。先把测试跑起来，再让它变得更可靠、更容易维护。]]></description><category></category></item><item><title><![CDATA[[Playwright][06]自动等待与断言：如何减少 Flaky Tests？]]></title><link>https://blog.youkuaiyun.com/u013716535/article/details/169460533</link><guid>https://blog.youkuaiyun.com/u013716535/article/details/169460533</guid><author>u013716535</author><pubDate>Fri, 30 Oct 2026 00:05:51 +0800</pubDate><description><![CDATA[这次用两个简单的动态页面，分别模拟了按钮延迟出现和保存结果延迟返回。操作之前：元素真的可以操作了吗？操作之后：页面真的达到预期状态了吗？Playwright 的 Auto-waiting 和自动重试断言，正好分别帮助我们处理这两个问题。相比到处添加固定等待，明确地等待元素状态和业务结果，通常更可靠，也更方便排查失败原因。当然，Flaky Test 还可能与测试数据、执行顺序、网络和环境有关。自动等待只能解决其中一部分问题。]]></description><category></category></item><item><title><![CDATA[[Playwright][05]元素定位实战：Locator、CSS 与 getByRole]]></title><link>https://blog.youkuaiyun.com/u013716535/article/details/169459717</link><guid>https://blog.youkuaiyun.com/u013716535/article/details/169459717</guid><author>u013716535</author><pubDate>Thu, 29 Oct 2026 16:38:58 +0800</pubDate><description><![CDATA[优先考虑定位条件是否稳定、唯一，而不是单纯追求某一种 API。有明确语义的按钮和链接，可以优先尝试。自己控制的 Web 项目，可以为复杂组件添加稳定的。CSS 选择器完全可以使用，但尽量避免依赖深层 DOM 结构和元素位置。遇到定位失败时，先区分是找不到元素、匹配多个元素，还是元素暂时不可操作。不要依赖随意增加等待时间来掩盖定位问题。]]></description><category></category></item><item><title><![CDATA[[Playwright][04]Playwright.config.ts 配置详解：浏览器、超时、重试]]></title><link>https://blog.youkuaiyun.com/u013716535/article/details/169368685</link><guid>https://blog.youkuaiyun.com/u013716535/article/details/169368685</guid><author>u013716535</author><pubDate>Thu, 29 Oct 2026 00:59:43 +0800</pubDate><description><![CDATA[浏览器：本地先跑 Chromium，需要时再做跨浏览器测试。超时：区分整个测试的超时和单次断言的等待时间。重试：本地失败及时暴露问题，CI 环境允许有限次数的重试。不需要一开始就写得特别复杂。真正重要的是，遇到问题时知道应该检查哪个配置，而不是靠不断增加超时和重试次数让测试“看起来通过”。]]></description><category></category></item><item><title><![CDATA[[Playwright][03] Trace Viewer 实战：3 个常见错误的调试方法]]></title><link>https://blog.youkuaiyun.com/u013716535/article/details/169368402</link><guid>https://blog.youkuaiyun.com/u013716535/article/details/169368402</guid><author>u013716535</author><pubDate>Thu, 29 Oct 2026 00:14:53 +0800</pubDate><description><![CDATA[最近写了一篇playwright debug，感觉trace很好用。。来看看 Trace Viewer 怎么帮我们定位问题。]]></description><category></category></item><item><title><![CDATA[[Playwright] [02]常用命令与调试：Debug UI、Mode和 Trace Viewer]]></title><link>https://blog.youkuaiyun.com/u013716535/article/details/169367567</link><guid>https://blog.youkuaiyun.com/u013716535/article/details/169367567</guid><author>u013716535</author><pubDate>Wed, 28 Oct 2026 23:23:43 +0800</pubDate><description><![CDATA[写自动化测试最头疼的是什么？不是写代码，而是测试突然失败了，还不知道怎么debug，一步步加console.log好烦。明明昨天还能跑，今天就红了。终端甩过来一大段报错，翻了半天，结果可能只是定位器写错了，或者断言写得太死。好在 Playwright 自带了不少调试工具。这篇就拿 Bing 搜索做个小实验，让测试失败，看看怎么一步步找到问题。这次故意写错 Bing 搜索测试的断言，分别体验了几种调试方式。想看看浏览器在干什么，用--headed。想一步一步执行代码，用--debug。]]></description><category></category></item><item><title><![CDATA[[Playwright][01] 从 Puppeteer 到 Playwright：为什么选择 Playwright + TypeScript？]]></title><link>https://blog.youkuaiyun.com/u013716535/article/details/169366917</link><guid>https://blog.youkuaiyun.com/u013716535/article/details/169366917</guid><author>u013716535</author><pubDate>Wed, 28 Oct 2026 22:25:27 +0800</pubDate><description><![CDATA[之前做 Web 自动化测试时，我主要使用 JavaScript + Puppeteer，基于已有开源框架进行二次开发，并逐步将手工回归测试转化为自动化测试。最近重新整理自己的自动化测试项目，发现大量自动化测试招聘需要Playwright技术，所以决定使用做一个Demo。为什么没有继续使用熟悉的 Puppeteer？主要原因不是 Puppeteer 不好用，而是对于一个新的 E2E 自动化测试项目，我更希望测试框架本身能够提供完整的测试运行、断言、报告和 CI/CD 集成能力。]]></description><category></category></item><item><title><![CDATA[[centos7][ansible ]yum install ansible no package avaliable]]></title><link>https://blog.youkuaiyun.com/u013716535/article/details/123064253</link><guid>https://blog.youkuaiyun.com/u013716535/article/details/123064253</guid><author>u013716535</author><pubDate>Tue, 22 Feb 2022 11:24:27 +0800</pubDate><description><![CDATA[目录背景原因操作
背景
centos7 使用命令安装ansible失败，报错 no package avaliable

原因
Ansible是属于Extra Packages for Enterprise Linux (EPEL)库的一部分，因此要先安装EPEL
操作
 yum install epel-release
 yum repolist
 yum install ansible



...]]></description><category></category></item><item><title><![CDATA[[vmware][centos]centos网络连接]]></title><link>https://blog.youkuaiyun.com/u013716535/article/details/123055495</link><guid>https://blog.youkuaiyun.com/u013716535/article/details/123055495</guid><author>u013716535</author><pubDate>Mon, 21 Feb 2022 21:08:18 +0800</pubDate><description><![CDATA[目录背景解决方案步骤
背景
学习ansible，使用vmware搭centos环境，网络连接失败

原因:公司的网络对ip可能有限制的，桥接模式(Bridged Adapter)不行。因为会分配和宿主机同样的ip，

解决方案
使用NAT的方式来联网，访问外发
Host-only的adapter来实现宿主机通信
步骤


看guide



配置vi /etc/sysconfig/network-scrips/ifcfg-enp0s3



配置vi /etc/sysconfig/network-scrip]]></description><category></category></item><item><title><![CDATA[[Node]Cannot set headers after they are sent to the client]]></title><link>https://blog.youkuaiyun.com/u013716535/article/details/122706240</link><guid>https://blog.youkuaiyun.com/u013716535/article/details/122706240</guid><author>u013716535</author><pubDate>Wed, 26 Jan 2022 17:45:19 +0800</pubDate><description><![CDATA[目录背景操作
背景
npm start 后
Cannot set headers after they are sent to the client

操作

写了两个res.send()，删除一个就好
原code

exports.getArticleCates = (req, res) =&gt; {
  const sql = 'select * from ev_article_cate where is_delete=0 order by id asc'
  db.query(sql, (err, ]]></description><category></category></item></channel></rss>