[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-lucgagan--auto-playwright":3,"tool-lucgagan--auto-playwright":61},[4,18,26,36,44,53],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":17},4358,"openclaw","openclaw\u002Fopenclaw","OpenClaw 是一款专为个人打造的本地化 AI 助手，旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚，能够直接接入你日常使用的各类通讯渠道，包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息，OpenClaw 都能即时响应，甚至支持在 macOS、iOS 和 Android 设备上进行语音交互，并提供实时的画布渲染功能供你操控。\n\n这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地，用户无需依赖云端服务即可享受快速、私密的智能辅助，真正实现了“你的数据，你做主”。其独特的技术亮点在于强大的网关架构，将控制平面与核心助手分离，确保跨平台通信的流畅性与扩展性。\n\nOpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者，以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力（支持 macOS、Linux 及 Windows WSL2），即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你",349277,3,"2026-04-06T06:32:30",[13,14,15,16],"Agent","开发框架","图像","数据工具","ready",{"id":19,"name":20,"github_repo":21,"description_zh":22,"stars":23,"difficulty_score":10,"last_commit_at":24,"category_tags":25,"status":17},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,"2026-04-05T11:01:52",[14,15,13],{"id":27,"name":28,"github_repo":29,"description_zh":30,"stars":31,"difficulty_score":32,"last_commit_at":33,"category_tags":34,"status":17},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",141543,2,"2026-04-06T11:32:54",[14,13,35],"语言模型",{"id":37,"name":38,"github_repo":39,"description_zh":40,"stars":41,"difficulty_score":32,"last_commit_at":42,"category_tags":43,"status":17},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",107888,"2026-04-06T11:32:50",[14,15,13],{"id":45,"name":46,"github_repo":47,"description_zh":48,"stars":49,"difficulty_score":32,"last_commit_at":50,"category_tags":51,"status":17},4721,"markitdown","microsoft\u002Fmarkitdown","MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具，专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片（含 OCR）、音频（含语音转录）、HTML 乃至 YouTube 链接等多种格式的解析，能够精准提取文档中的标题、列表、表格和链接等关键结构信息。\n\n在人工智能应用日益普及的今天，大语言模型（LLM）虽擅长处理文本，却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点，它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式，成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外，它还提供了 MCP（模型上下文协议）服务器，可无缝集成到 Claude Desktop 等 LLM 应用中。\n\n这款工具特别适合开发者、数据科学家及 AI 研究人员使用，尤其是那些需要构建文档检索增强生成（RAG）系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性，但其核心优势在于为机器",93400,"2026-04-06T19:52:38",[52,14],"插件",{"id":54,"name":55,"github_repo":56,"description_zh":57,"stars":58,"difficulty_score":10,"last_commit_at":59,"category_tags":60,"status":17},4487,"LLMs-from-scratch","rasbt\u002FLLMs-from-scratch","LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目，旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型（LLM）。它不仅是同名技术著作的官方代码库，更提供了一套完整的实践方案，涵盖模型开发、预训练及微调的全过程。\n\n该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型，却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码，用户能够透彻掌握 Transformer 架构、注意力机制等关键原理，从而真正理解大模型是如何“思考”的。此外，项目还包含了加载大型预训练权重进行微调的代码，帮助用户将理论知识延伸至实际应用。\n\nLLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API，而是渴望探究模型构建细节的技术人员而言，这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计：将复杂的系统工程拆解为清晰的步骤，配合详细的图表与示例，让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础，还是为未来研发更大规模的模型做准备",90106,"2026-04-06T11:19:32",[35,15,13,14],{"id":62,"github_repo":63,"name":64,"description_en":65,"description_zh":66,"ai_summary_zh":67,"readme_en":68,"readme_zh":69,"quickstart_zh":70,"use_case_zh":71,"hero_image_url":72,"owner_login":73,"owner_name":74,"owner_avatar_url":75,"owner_bio":76,"owner_company":77,"owner_location":78,"owner_email":77,"owner_twitter":73,"owner_website":79,"owner_url":80,"languages":81,"stars":90,"forks":91,"last_commit_at":92,"license":93,"difficulty_score":32,"env_os":94,"env_gpu":95,"env_ram":94,"env_deps":96,"category_tags":102,"github_topics":103,"view_count":32,"oss_zip_url":77,"oss_zip_packed_at":77,"status":17,"created_at":106,"updated_at":107,"faqs":108,"releases":138},4662,"lucgagan\u002Fauto-playwright","auto-playwright","Automating Playwright steps using ChatGPT.","auto-playwright 是一款创新的开源工具，旨在利用人工智能（如 ChatGPT）自动化执行 Playwright 浏览器测试步骤。传统的前端自动化测试往往需要开发者编写大量繁琐的选择器代码和交互逻辑，不仅耗时且容易因页面结构变动而失效。auto-playwright 通过引入自然语言处理技术，让测试人员只需使用通俗的中文或英文指令（例如“获取标题文本”或“在搜索框输入内容”），AI 即可自动识别页面元素并生成相应的操作代码，从而大幅降低编写和维护测试脚本的门槛。\n\n这款工具特别适合前端开发者、测试工程师以及希望快速构建自动化流程的技术团队使用。其核心亮点在于将复杂的 DOM 查询与操作抽象为简单的自然语言提示，支持数据提取、界面交互及状态断言等多种功能。此外，auto-playwright 具备良好的灵活性，既兼容标准的 OpenAI 接口，也支持 Azure OpenAI 部署，并提供调试模式以透明展示 AI 的执行逻辑。它支持所有 Playwright 适用的浏览器环境，能够帮助用户更高效地专注于测试策略本身，而非底层的代码实现细节，是提升 Web 自动化测试效率的有力","auto-playwright 是一款创新的开源工具，旨在利用人工智能（如 ChatGPT）自动化执行 Playwright 浏览器测试步骤。传统的前端自动化测试往往需要开发者编写大量繁琐的选择器代码和交互逻辑，不仅耗时且容易因页面结构变动而失效。auto-playwright 通过引入自然语言处理技术，让测试人员只需使用通俗的中文或英文指令（例如“获取标题文本”或“在搜索框输入内容”），AI 即可自动识别页面元素并生成相应的操作代码，从而大幅降低编写和维护测试脚本的门槛。\n\n这款工具特别适合前端开发者、测试工程师以及希望快速构建自动化流程的技术团队使用。其核心亮点在于将复杂的 DOM 查询与操作抽象为简单的自然语言提示，支持数据提取、界面交互及状态断言等多种功能。此外，auto-playwright 具备良好的灵活性，既兼容标准的 OpenAI 接口，也支持 Azure OpenAI 部署，并提供调试模式以透明展示 AI 的执行逻辑。它支持所有 Playwright 适用的浏览器环境，能够帮助用户更高效地专注于测试策略本身，而非底层的代码实现细节，是提升 Web 自动化测试效率的有力助手。","# Auto Playwright\n\nRun Playwright tests using AI.\n\n## Setup\n\n1. Install `auto-playwright` dependency:\n\n```bash\nnpm install auto-playwright -D\n```\n\n2. This package relies on talking with OpenAI (https:\u002F\u002Fopenai.com\u002F). You must export the API token as an enviroment variable or add it to your `.env` file:\n\n```bash\nexport OPENAI_API_KEY='sk-...\"\n```\n\n3. Import and use the `auto` function:\n\n```ts\nimport { test, expect } from \"@playwright\u002Ftest\";\nimport { auto } from \"auto-playwright\";\n\ntest(\"auto Playwright example\", async ({ page }) => {\n  await page.goto(\"\u002F\");\n\n  \u002F\u002F `auto` can query data\n  \u002F\u002F In this case, the result is plain-text contents of the header\n  const headerText = await auto(\"get the header text\", { page, test });\n\n  \u002F\u002F `auto` can perform actions\n  \u002F\u002F In this case, auto will find and fill in the search text input\n  await auto(`Type \"${headerText}\" in the search box`, { page, test });\n\n  \u002F\u002F `auto` can assert the state of the website\n  \u002F\u002F In this case, the result is a boolean outcome\n  const searchInputHasHeaderText = await auto(\n    `Is the contents of the search box equal to \"${headerText}\"?`,\n    { page, test },\n  );\n\n  expect(searchInputHasHeaderText).toBe(true);\n});\n```\n\n### Setup with Azure OpenAI\n\nInclude the StepOptions type with the values needed for connecting to Azure OpenAI.\n\n```ts\nimport { test, expect } from \"@playwright\u002Ftest\";\nimport { auto } from \"auto-playwright\";\nimport { StepOptions } from \"..\u002Fsrc\u002Ftypes\";\n\nconst apiKey = \"apikey\";\nconst resource = \"azure-resource-name\";\nconst model = \"model-deployment-name\";\n\nconst options: StepOptions = {\n  model: model,\n  openaiApiKey: apiKey,\n  openaiBaseUrl: `https:\u002F\u002F${resource}.openai.azure.com\u002Fopenai\u002Fdeployments\u002F${model}`,\n  openaiDefaultQuery: { \"api-version\": \"2023-07-01-preview\" },\n  openaiDefaultHeaders: { \"api-key\": apiKey },\n};\n\ntest(\"auto Playwright example\", async ({ page }) => {\n  await page.goto(\"\u002F\");\n\n  \u002F\u002F `auto` can query data\n  \u002F\u002F In this case, the result is plain-text contents of the header\n  const headerText = await auto(\"get the header text\", { page, test }, options);\n\n  \u002F\u002F `auto` can perform actions\n  \u002F\u002F In this case, auto will find and fill in the search text input\n  await auto(`Type \"${headerText}\" in the search box`, { page, test }, options);\n\n  \u002F\u002F `auto` can assert the state of the website\n  \u002F\u002F In this case, the result is a boolean outcome\n  const searchInputHasHeaderText = await auto(\n    `Is the contents of the search box equal to \"${headerText}\"?`,\n    { page, test },\n    options,\n  );\n\n  expect(searchInputHasHeaderText).toBe(true);\n});\n```\n\n## Usage\n\nAt minimum, the `auto` function requires a _plain text prompt_ and an _argument_ that contains your `page` and `test` (optional) objects.\n\n```ts\nauto(\"\u003Cyour prompt>\", { page, test });\n```\n\n### Browser automation\n\nRunning without the `test` parameter:\n\n```ts\nimport { chromium } from \"playwright\";\nimport { auto } from \"auto-playwright\";\n\n(async () => {\n  const browser = await chromium.launch({ headless: true });\n  const context = await browser.newContext();\n  const page = await context.newPage();\n  \u002F\u002F Navigate to a website\n  await page.goto(\"https:\u002F\u002Fwww.example.com\");\n\n  \u002F\u002F `auto` can query data\n  \u002F\u002F In this case, the result is plain-text contents of the header\n  const res = await auto(\"get the header text\", { page });\n\n  \u002F\u002F use res.query to get a query result.\n  console.log(res);\n  await page.close();\n})();\n```\n\n### Debug\n\nYou may pass a `debug` attribute as the third parameter to the `auto` function. This will print the prompt and the commands executed by OpenAI.\n\n```ts\nawait auto(\"get the header text\", { page, test }, { debug: true });\n```\n\nYou may also set environment variable `AUTO_PLAYWRIGHT_DEBUG=true`, which will enable debugging for all `auto` calls.\n\n```bash\nexport AUTO_PLAYWRIGHT_DEBUG=true\n```\n\n## Supported Browsers\n\nEvery browser that Playwright supports.\n\n## Additional Options\n\nThere are additional options you can pass as a third argument:\n\n```ts\nconst options = {\n  \u002F\u002F If true, debugging information is printed in the console.\n  debug: boolean,\n  \u002F\u002F The OpenAI model (https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fmodels\u002Foverview)\n  model: \"gpt-4-1106-preview\",\n  \u002F\u002F The OpenAI API key\n  openaiApiKey: \"sk-...\",\n};\n\nauto(\"\u003Cyour prompt>\", { page, test }, options);\n```\n\n## Supported Actions & Return Values\n\nDepending on the `type` of action (inferred by the `auto` function), there are different behaviors and return types.\n\n### Action\n\nAn action (e.g. \"click\") is some simulated user interaction with the page, e.g. a click on a link. Actions will return `undefined`` if they were successful and will throw an error if they failed, e.g.\n\n```ts\ntry {\n  await auto(\"click the link\", { page, test });\n} catch (e) {\n  console.error(\"failed to click the link\");\n}\n```\n\n### Query\n\nA query will return requested data from the page as a string, e.g.\n\n```ts\nconst linkText = await auto(\"Get the text of the first link\", { page, test });\n\nconsole.log(\"The link text is\", linkText);\n```\n\n### Assert\n\nAn assertion is a question that will return `true` or `false`, e.g.\n\n```ts\nconst thereAreThreeLinks = await auto(\"Are there 3 links on the page?\", {\n  page,\n  test,\n});\n\nconsole.log(`\"There are 3 links\" is a ${thereAreThreeLinks} statement`);\n```\n\n## Why use Auto Playwright?\n\n| Aspect                         | Conventional Approach                                                               | Testing with Auto Playwright                                                                                                 |\n| ------------------------------ | ----------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |\n| **Coupling with Markup**       | Strongly linked to the application's markup.                                        | Eliminates the use of selectors; actions are determined by the AI assistant at runtime.                                      |\n| **Speed of Implementation**    | Slower implementation due to the need for precise code translation for each action. | Rapid test creation using simple, plain text instructions for actions and assertions.                                        |\n| **Handling Complex Scenarios** | Automating complex scenarios is challenging and prone to frequent failures.         | Facilitates testing of complex scenarios by focusing on the intended test outcomes.                                          |\n| **Test Writing Timing**        | Can only write tests after the complete development of the functionality.           | Enables a Test-Driven Development (TDD) approach, allowing test writing concurrent with or before functionality development. |\n\n## Supported Playwright Actions\n\n- `locator.blur`\n- `locator.boundingBox`\n- `locator.check`\n- `locator.clear`\n- `locator.click`\n- `locator.count`\n- `locator.fill`\n- `locator.getAttribute`\n- `locator.innerHTML`\n- `locator.innerText`\n- `locator.inputValue`\n- `locator.isChecked`\n- `locator.isEditable`\n- `locator.isEnabled`\n- `locator.isVisible`\n- `locator.pressKey`\n- `locator.selectOption`\n- `locator.textContent`\n- `locator.uncheck`\n- `page.goto`\n- `page.keyboard.press`\n\nAdding new actions is easy: just update the `functions` in [`src\u002FcompleteTask.ts`](src\u002FcompleteTask.ts).\n\n## Pricing\n\nThis library is free. However, there are costs associated with using OpenAI. You can find more information about pricing here: https:\u002F\u002Fopenai.com\u002Fpricing\u002F.\n\n\u003Cdetails>\n  \u003Csummary>Example\u003C\u002Fsummary>\n\nUsing https:\u002F\u002Fray.run\u002F as an example, the cost of running a test step is approximately $0.01 using GPT-4 Turbo (and $0.001 using GPT-3.5 Turbo).\n\nThe low cost is in part because `auto-playwright` uses HTML sanitization to reduce the payload size, e.g. What follows is the payload that would be submitted for https:\u002F\u002Fray.run\u002F.\n\nNaturally, the price will vary dramatically depending on the payload.\n\n```html\n\u003Cdiv class=\"cYdhWw dKnOgO geGbZz bGoBgk jkEels\">\n  \u003Cdiv class=\"kSmiQp fPSBzf bnYmbW dXscgu xJzwH jTWvec gzBMzy\">\n    \u003Ch1 class=\"fwYeZS fwlORb pdjVK bccLBY fsAQjR fyszFl WNJim fzozfU\">\n      Learn Playwright\n    \u003C\u002Fh1>\n    \u003Ch2 class=\"cakMWc ptfck bBmAxp hSiiri xJzwS gnfYng jTWvec fzozfU\">\n      Resources for learning end-to-end testing using Playwright automation\n      framework\n    \u003C\u002Fh2>\n    \u003Cdiv\n      class=\"bLTbYS gvHvKe cHEBuD ddgODW jsxhGC kdTEUJ ilCTXp iQHbtH yuxBn ilIXfy gPeiPq ivcdqp isDTsq jyZWmS ivdkBK cERSkX hdAwi ezvbLT jNrAaV jsxhGJ fzozCb\"\n    >\u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"cYdhWw dpjphg cqUdSC fasMpP\">\n    \u003Ca\n      class=\"gacSWM dCgFix conipm knkqUc bddCnd dTKJOB leOtqz hEzNkW fNBBKe jTWvec fIMbrO fzozfU group\"\n      href=\"\u002Fblog\"\n      >\u003Cdiv class=\"plfYl bccLBY hSiiri fNBpvX\">Blog\u003C\u002Fdiv>\n      \u003Cdiv class=\"jqqjPD fWDXZB pKTba bBmAxp hSiiri evbPEu\">\n        \u003Cp>Learn in depth subjects about end-to-end testing.\u003C\u002Fp>\n      \u003C\u002Fdiv>\u003C\u002Fa\n    >\u003Ca\n      class=\"gacSWM dCgFix conipm knkqUc bddCnd dTKJOB leOtqz hEzNkW fNBBKe jTWvec fIMbrO fzozfU group\"\n      href=\"\u002Fask\"\n      >\u003Cdiv class=\"plfYl bccLBY hSiiri fNBpvX\">Ask AI\u003C\u002Fdiv>\n      \u003Cdiv class=\"jqqjPD fWDXZB pKTba bBmAxp hSiiri evbPEu\">\n        \u003Cp>Ask ChatGPT Playwright questions.\u003C\u002Fp>\n      \u003C\u002Fdiv>\u003C\u002Fa\n    >\u003Ca\n      class=\"gacSWM dCgFix conipm knkqUc bddCnd dTKJOB leOtqz hEzNkW fNBBKe jTWvec fIMbrO fzozfU group\"\n      href=\"\u002Ftools\"\n      >\u003Cdiv class=\"plfYl bccLBY hSiiri fNBpvX\">Dev Tools\u003C\u002Fdiv>\n      \u003Cdiv class=\"jqqjPD fWDXZB pKTba bBmAxp hSiiri evbPEu\">\n        \u003Cp>All-in-one toolbox for QA engineers.\u003C\u002Fp>\n      \u003C\u002Fdiv>\u003C\u002Fa\n    >\u003Ca\n      class=\"gacSWM dCgFix conipm knkqUc bddCnd dTKJOB leOtqz hEzNkW fNBBKe jTWvec fIMbrO fzozfU group\"\n      href=\"\u002Fjobs\"\n      >\u003Cdiv class=\"plfYl bccLBY hSiiri fNBpvX\">QA Jobs\u003C\u002Fdiv>\n      \u003Cdiv class=\"jqqjPD fWDXZB pKTba bBmAxp hSiiri evbPEu\">\n        \u003Cp>Handpicked QA and Automation opportunities.\u003C\u002Fp>\n      \u003C\u002Fdiv>\u003C\u002Fa\n    >\u003Ca\n      class=\"gacSWM dCgFix conipm knkqUc bddCnd dTKJOB leOtqz hEzNkW fNBBKe jTWvec fIMbrO fzozfU group\"\n      href=\"\u002Fquestions\"\n      >\u003Cdiv class=\"plfYl bccLBY hSiiri fNBpvX\">Questions\u003C\u002Fdiv>\n      \u003Cdiv class=\"jqqjPD fWDXZB pKTba bBmAxp hSiiri evbPEu\">\n        \u003Cp>Ask AI answered questions about Playwright.\u003C\u002Fp>\n      \u003C\u002Fdiv>\u003C\u002Fa\n    >\u003Ca\n      class=\"gacSWM dCgFix conipm knkqUc bddCnd dTKJOB leOtqz hEzNkW fNBBKe jTWvec fIMbrO fzozfU group\"\n      href=\"\u002Fdiscord-forum\"\n      >\u003Cdiv class=\"plfYl bccLBY hSiiri fNBpvX\">Discord Forum\u003C\u002Fdiv>\n      \u003Cdiv class=\"jqqjPD fWDXZB pKTba bBmAxp hSiiri evbPEu\">\n        \u003Cp>Archive of Discord Forum posts about Playwright.\u003C\u002Fp>\n      \u003C\u002Fdiv>\u003C\u002Fa\n    >\u003Ca\n      class=\"gacSWM dCgFix conipm knkqUc bddCnd dTKJOB leOtqz hEzNkW fNBBKe jTWvec fIMbrO fzozfU group\"\n      href=\"\u002Fvideos\"\n      >\u003Cdiv class=\"plfYl bccLBY hSiiri fNBpvX\">Videos\u003C\u002Fdiv>\n      \u003Cdiv class=\"jqqjPD fWDXZB pKTba bBmAxp hSiiri evbPEu\">\n        \u003Cp>Tutorials, conference talks, and release videos.\u003C\u002Fp>\n      \u003C\u002Fdiv>\u003C\u002Fa\n    >\u003Ca\n      class=\"gacSWM dCgFix conipm knkqUc bddCnd dTKJOB leOtqz hEzNkW fNBBKe jTWvec fIMbrO fzozfU group\"\n      href=\"\u002Fbrowser-extension\"\n      >\u003Cdiv class=\"plfYl bccLBY hSiiri fNBpvX\">Browser Extension\u003C\u002Fdiv>\n      \u003Cdiv class=\"jqqjPD fWDXZB pKTba bBmAxp hSiiri evbPEu\">\n        \u003Cp>GUI for generating Playwright locators.\u003C\u002Fp>\n      \u003C\u002Fdiv>\u003C\u002Fa\n    >\u003Ca\n      class=\"gacSWM dCgFix conipm knkqUc bddCnd dTKJOB leOtqz hEzNkW fNBBKe jTWvec fIMbrO fzozfU group\"\n      href=\"\u002Fwiki\"\n      >\u003Cdiv class=\"plfYl bccLBY hSiiri fNBpvX\">QA Wiki\u003C\u002Fdiv>\n      \u003Cdiv class=\"jqqjPD fWDXZB pKTba bBmAxp hSiiri evbPEu\">\n        \u003Cp>Definitions of common end-to-end testing terms.\u003C\u002Fp>\n      \u003C\u002Fdiv>\u003C\u002Fa\n    >\n  \u003C\u002Fdiv>\n  \u003Cdiv\n    class=\"kSmiQp fPSBzf pKTba eTDpsp legDhJ hSiiri hdaZLM jTWvec gzBMzy bGySga fzoybr\"\n  >\n    \u003Cp class=\"dXhlDK leOtqz glpWRZ fNCcFz\">\n      Use \u003Ckbd class=\"bWhrAL XAzZz cakMWc bUyOMB bmOrOm fyszFl dTmriP\">⌘\u003C\u002Fkbd> +\n      \u003Ckbd>k\u003C\u002Fkbd> + \"Tools\" to quickly access all tools.\n    \u003C\u002Fp>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\n```\n\n\u003C\u002Fdetails>\n\n## Implementation\n\n### HTML Sanitization\n\nThe `auto` function uses [sanitize-html](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fsanitize-html) to sanitize the HTML of the page before sending it to OpenAI. This is done to reduce cost and improve the quality of the generated text.\n\n## ZeroStep\n\nThis project draws its inspiration from [ZeroStep](https:\u002F\u002Fzerostep.com\u002F). ZeroStep offers a similar API but with a more robust implementation through its proprietary backend. Auto Playwright was created with the aim of exploring the underlying technology of ZeroStep and establishing a basis for an open-source version of their software. For production environments, I suggest opting for ZeroStep.\n\nHere's a side-by-side comparison of Auto Playwright and ZeroStep:\n\n| Criteria                                                                              | Auto Playwright | ZeroStep |\n| ------------------------------------------------------------------------------------- | --------------- | -------- |\n| Uses OpenAI API                                                                       | Yes             | No[^3]   |\n| Uses plain-text prompts                                                               | Yes             | No       |\n| Uses [`functions`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fopenai#automated-function-calls) SDK | Yes             | No       |\n| Uses HTML sanitization                                                                | Yes             | No       |\n| Uses Playwright API                                                                   | Yes             | No[^4]   |\n| Uses screenshots                                                                      | No              | Yes      |\n| Uses queue                                                                            | No              | Yes      |\n| Uses WebSockets                                                                       | No              | Yes      |\n| Snapshots                                                                             | HTML            | DOM      |\n| Implements parallelism                                                                | No              | Yes      |\n| Allows scrolling                                                                      | No              | Yes      |\n| Provides fixtures                                                                     | No              | Yes      |\n| License                                                                               | MIT             | MIT      |\n\n[^3]: Uses ZeroStep proprietary API.\n\n[^4]: Uses _some_ Playwright API, but predominantly relies on Chrome DevTools Protocol (CDP).\n\n\u003Cdetails>\n  \u003Csummary>Zero Step License\u003C\u002Fsummary>\n\n```\nMIT License\n\nCopyright (c) 2023 Reflect Software Inc\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and\u002For sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n```\n\n\u003C\u002Fdetails>\n","# Auto Playwright\n\n使用 AI 运行 Playwright 测试。\n\n## 设置\n\n1. 安装 `auto-playwright` 依赖：\n\n```bash\nnpm install auto-playwright -D\n```\n\n2. 本包依赖于与 OpenAI（https:\u002F\u002Fopenai.com\u002F）的交互。您必须将 API 密钥导出为环境变量，或将其添加到您的 `.env` 文件中：\n\n```bash\nexport OPENAI_API_KEY='sk-...'\n```\n\n3. 导入并使用 `auto` 函数：\n\n```ts\nimport { test, expect } from \"@playwright\u002Ftest\";\nimport { auto } from \"auto-playwright\";\n\ntest(\"auto Playwright 示例\", async ({ page }) => {\n  await page.goto(\"\u002F\");\n\n  \u002F\u002F `auto` 可以查询数据\n  \u002F\u002F 在此例中，结果是标题的纯文本内容。\n  const headerText = await auto(\"获取标题文本\", { page, test });\n\n  \u002F\u002F `auto` 可以执行操作\n  \u002F\u002F 在此例中，`auto` 会找到搜索框并输入文本。\n  await auto(`在搜索框中输入 \"${headerText}\"`, { page, test });\n\n  \u002F\u002F `auto` 可以断言页面状态\n  \u002F\u002F 在此例中，结果是一个布尔值。\n  const searchInputHasHeaderText = await auto(\n    `搜索框的内容是否等于 \"${headerText}\"？`,\n    { page, test },\n  );\n\n  expect(searchInputHasHeaderText).toBe(true);\n});\n```\n\n### 使用 Azure OpenAI 进行设置\n\n包含 `StepOptions` 类型，并提供连接 Azure OpenAI 所需的值。\n\n```ts\nimport { test, expect } from \"@playwright\u002Ftest\";\nimport { auto } from \"auto-playwright\";\nimport { StepOptions } from \"..\u002Fsrc\u002Ftypes\";\n\nconst apiKey = \"apikey\";\nconst resource = \"azure-resource-name\";\nconst model = \"model-deployment-name\";\n\nconst options: StepOptions = {\n  model: model,\n  openaiApiKey: apiKey,\n  openaiBaseUrl: `https:\u002F\u002F${resource}.openai.azure.com\u002Fopenai\u002Fdeployments\u002F${model}`,\n  openaiDefaultQuery: { \"api-version\": \"2023-07-01-preview\" },\n  openaiDefaultHeaders: { \"api-key\": apiKey },\n};\n\ntest(\"auto Playwright 示例\", async ({ page }) => {\n  await page.goto(\"\u002F\");\n\n  \u002F\u002F `auto` 可以查询数据\n  \u002F\u002F 在此例中，结果是标题的纯文本内容。\n  const headerText = await auto(\"获取标题文本\", { page, test }, options);\n\n  \u002F\u002F `auto` 可以执行操作\n  \u002F\u002F 在此例中，`auto` 会找到搜索框并输入文本。\n  await auto(`在搜索框中输入 \"${headerText}\"`, { page, test }, options);\n\n  \u002F\u002F `auto` 可以断言页面状态\n  \u002F\u002F 在此例中，结果是一个布尔值。\n  const searchInputHasHeaderText = await auto(\n    `搜索框的内容是否等于 \"${headerText}\"？`,\n    { page, test },\n    options,\n  );\n\n  expect(searchInputHasHeaderText).toBe(true);\n});\n```\n\n## 使用方法\n\n至少，`auto` 函数需要一个 _纯文本提示_ 和一个包含 `page` 和 `test` 对象（可选）的 _参数_。\n\n```ts\nauto(\"\u003C你的提示>\", { page, test });\n```\n\n### 浏览器自动化\n\n不带 `test` 参数运行：\n\n```ts\nimport { chromium } from \"playwright\";\nimport { auto } from \"auto-playwright\";\n\n(async () => {\n  const browser = await chromium.launch({ headless: true });\n  const context = await browser.newContext();\n  const page = await context.newPage();\n  \u002F\u002F 导航到某个网站\n  await page.goto(\"https:\u002F\u002Fwww.example.com\");\n\n  \u002F\u002F `auto` 可以查询数据\n  \u002F\u002F 在此例中，结果是标题的纯文本内容。\n  const res = await auto(\"获取标题文本\", { page });\n\n  \u002F\u002F 使用 res.query 获取查询结果。\n  console.log(res);\n  await page.close();\n})();\n```\n\n### 调试\n\n您可以将 `debug` 属性作为第三个参数传递给 `auto` 函数。这将打印提示以及 OpenAI 执行的命令。\n\n```ts\nawait auto(\"获取标题文本\", { page, test }, { debug: true });\n```\n\n您也可以设置环境变量 `AUTO_PLAYWRIGHT_DEBUG=true`，这将为所有 `auto` 调用启用调试模式。\n\n```bash\nexport AUTO_PLAYWRIGHT_DEBUG=true\n```\n\n## 支持的浏览器\n\nPlaywright 支持的所有浏览器。\n\n## 其他选项\n\n您可以作为第三个参数传递其他选项：\n\n```ts\nconst options = {\n  \u002F\u002F 如果为 true，则会在控制台打印调试信息。\n  debug: boolean,\n  \u002F\u002F OpenAI 模型（https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fmodels\u002Foverview）\n  model: \"gpt-4-1106-preview\",\n  \u002F\u002F OpenAI 的 API 密钥\n  openaiApiKey: \"sk-...\",\n};\n\nauto(\"\u003C你的提示>\", { page, test }, options);\n```\n\n## 支持的操作与返回值\n\n根据操作的 _类型_（由 `auto` 函数推断），会有不同的行为和返回类型。\n\n### 操作\n\n操作（例如“点击”）是指模拟用户与页面的交互，比如点击链接。如果操作成功，将返回 `undefined`；如果失败，则会抛出错误，例如：\n\n```ts\ntry {\n  await auto(\"点击链接\", { page, test });\n} catch (e) {\n  console.error(\"点击链接失败\");\n}\n```\n\n### 查询\n\n查询会以字符串形式返回页面上请求的数据，例如：\n\n```ts\nconst linkText = await auto(\"获取第一个链接的文本\", { page, test });\n\nconsole.log(\"链接文本是\", linkText);\n```\n\n### 断言\n\n断言是一个问题，它会返回 `true` 或 `false`，例如：\n\n```ts\nconst thereAreThreeLinks = await auto(\"页面上有 3 个链接吗？\", {\n  page,\n  test,\n});\n\nconsole.log(`\"页面上有 3 个链接\" 是一个 ${thereAreThreeLinks} 的陈述`);\n```\n\n## 为什么使用 Auto Playwright？\n\n| 方面                         | 常规方法                                                               | 使用 Auto Playwright 测试                                                                                                 |\n| ------------------------------ | ------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |\n| **与标记的耦合**       | 与应用程序的标记紧密相关。                                        | 消除了对选择器的依赖；操作由 AI 助手在运行时决定。                                      |\n| **实现速度**    | 由于需要为每个操作精确编写代码，实现速度较慢。 | 使用简单、纯文本指令即可快速创建测试，用于执行操作和进行断言。                                        |\n| **处理复杂场景** | 自动化复杂场景具有挑战性，且容易频繁失败。         | 通过关注预期的测试结果，可以更轻松地测试复杂场景。                                          |\n| **编写测试的时间点**        | 只能在功能完全开发完成后才能编写测试。           | 支持测试驱动开发（TDD）模式，允许在功能开发的同时或之前编写测试。 |\n\n## 支持的 Playwright 操作\n\n- `locator.blur`\n- `locator.boundingBox`\n- `locator.check`\n- `locator.clear`\n- `locator.click`\n- `locator.count`\n- `locator.fill`\n- `locator.getAttribute`\n- `locator.innerHTML`\n- `locator.innerText`\n- `locator.inputValue`\n- `locator.isChecked`\n- `locator.isEditable`\n- `locator.isEnabled`\n- `locator.isVisible`\n- `locator.pressKey`\n- `locator.selectOption`\n- `locator.textContent`\n- `locator.uncheck`\n- `page.goto`\n- `page.keyboard.press`\n\n添加新的操作非常简单：只需更新 [`src\u002FcompleteTask.ts`](src\u002FcompleteTask.ts) 中的 `functions`。\n\n## 定价\n\n本库是免费的。然而，使用 OpenAI 会产生费用。有关定价的更多信息，请参阅：https:\u002F\u002Fopenai.com\u002Fpricing\u002F。\n\n\u003Cdetails>\n  \u003Csummary>示例\u003C\u002Fsummary>\n\n以 https:\u002F\u002Fray.run\u002F 为例，使用 GPT-4 Turbo 运行一个测试步骤的成本大约为 0.01 美元（而使用 GPT-3.5 Turbo 则为 0.001 美元）。\n\n成本较低的部分原因在于 `auto-playwright` 使用 HTML 净化来减少负载大小，例如，以下是针对 https:\u002F\u002Fray.run\u002F 将被提交的负载内容。\n\n当然，价格会根据负载的不同而有很大差异。\n\n```html\n\u003Cdiv class=\"cYdhWw dKnOgO geGbZz bGoBgk jkEels\">\n  \u003Cdiv class=\"kSmiQp fPSBzf bnYmbW dXscgu xJzwH jTWvec gzBMzy\">\n    \u003Ch1 class=\"fwYeZS fwlORb pdjVK bccLBY fsAQjR fyszFl WNJim fzozfU\">\n      学习 Playwright\n    \u003C\u002Fh1>\n    \u003Ch2 class=\"cakMWc ptfck bBmAxp hSiiri xJzwS gnfYng jTWvec fzozfU\">\n      使用 Playwright 自动化框架学习端到端测试的资源\n    \u003C\u002Fh2>\n    \u003Cdiv\n      class=\"bLTbYS gvHvKe cHEBuD ddgODW jsxhGC kdTEUJ ilCTXp iQHbtH yuxBn ilIXfy gPeiPq ivcdqp isDTsq jyZWmS ivdkBK cERSkX hdAwi ezvbLT jNrAaV jsxhGJ fzozCb\"\n    >\u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"cYdhWw dpjphg cqUdSC fasMpP\">\n    \u003Ca\n      class=\"gacSWM dCgFix conipm knkqUc bddCnd dTKJOB leOtqz hEzNkW fNBBKe jTWvec fIMbrO fzozfU group\"\n      href=\"\u002Fblog\"\n      >\u003Cdiv class=\"plfYl bccLBY hSiiri fNBpvX\">博客\u003C\u002Fdiv>\n      \u003Cdiv class=\"jqqjPD fWDXZB pKTba bBmAxp hSiiri evbPEu\">\n        \u003Cp>深入了解端到端测试的相关主题。\u003C\u002Fp>\n      \u003C\u002Fdiv>\u003C\u002Fa\n    >\u003Ca\n      class=\"gacSWM dCgFix conipm knkqUc bddCnd dTKJOB leOtqz hEzNkW fNBBKe jTWvec fIMbrO fzozfU group\"\n      href=\"\u002Fask\"\n      >\u003Cdiv class=\"plfYl bccLBY hSiiri fNBpvX\">向 AI 提问\u003C\u002Fdiv>\n      \u003Cdiv class=\"jqqjPD fWDXZB pKTba bBmAxp hSiiri evbPEu\">\n        \u003Cp>向 ChatGPT 提出关于 Playwright 的问题。\u003C\u002Fp>\n      \u003C\u002Fdiv>\u003C\u002Fa\n    >\u003Ca\n      class=\"gacSWM dCgFix conipm knkqUc bddCnd dTKJOB leOtqz hEzNkW fNBBKe jTWvec fIMbrO fzozfU group\"\n      href=\"\u002Ftools\"\n      >\u003Cdiv class=\"plfYl bccLBY hSiiri fNBpvX\">开发工具\u003C\u002Fdiv>\n      \u003Cdiv class=\"jqqjPD fWDXZB pKTba bBmAxp hSiiri evbPEu\">\n        \u003Cp>面向 QA 工程师的一体化工具箱。\u003C\u002Fp>\n      \u003C\u002Fdiv>\u003C\u002Fa\n    >\u003Ca\n      class=\"gacSWM dCgFix conipm knkqUc bddCnd dTKJOB leOtqz hEzNkW fNBBKe jTWvec fIMbrO fzozfU group\"\n      href=\"\u002Fjobs\"\n      >\u003Cdiv class=\"plfYl bccLBY hSiiri fNBpvX\">QA 职位\u003C\u002Fdiv>\n      \u003Cdiv class=\"jqqjPD fWDXZB pKTba bBmAxp hSiiri evbPEu\">\n        \u003Cp>精心挑选的 QA 和自动化相关机会。\u003C\u002Fp>\n      \u003C\u002Fdiv>\u003C\u002Fa\n    >\u003Ca\n      class=\"gacSWM dCgFix conipm knkqUc bddCnd dTKJOB leOtqz hEzNkW fNBBKe jTWvec fIMbrO fzozfU group\"\n      href=\"\u002Fquestions\"\n      >\u003Cdiv class=\"plfYl bccLBY hSiiri fNBpvX\">问题\u003C\u002Fdiv>\n      \u003Cdiv class=\"jqqjPD fWDXZB pKTba bBmAxp hSiiri evbPEu\">\n        \u003Cp>向 AI 提问并获得关于 Playwright 的解答。\u003C\u002Fp>\n      \u003C\u002Fdiv>\u003C\u002Fa\n    >\u003Ca\n      class=\"gacSWM dCgFix conipm knkqUc bddCnd dTKJOB leOtqz hEzNkW fNBBKe jTWvec fIMbrO fzozfU group\"\n      href=\"\u002Fdiscord-forum\"\n      >\u003Cdiv class=\"plfYl bccLBY hSiiri fNBpvX\">Discord 论坛\u003C\u002Fdiv>\n      \u003Cdiv class=\"jqqjPD fWDXZB pKTba bBmAxp hSiiri evbPEu\">\n        \u003Cp>关于 Playwright 的 Discord 论坛帖子存档。\u003C\u002Fp>\n      \u003C\u002Fdiv>\u003C\u002Fa\n    >\u003Ca\n      class=\"gacSWM dCgFix conipm knkqUc bddCnd dTKJOB leOtqz hEzNkW fNBBKe jTWvec fIMbrO fzozfU group\"\n      href=\"\u002Fvideos\"\n      >\u003Cdiv class=\"plfYl bccLBY hSiiri fNBpvX\">视频\u003C\u002Fdiv>\n      \u003Cdiv class=\"jqqjPD fWDXZB pKTba bBmAxp hSiiri evbPEu\">\n        \u003Cp>教程、会议演讲以及发布视频。\u003C\u002Fp>\n      \u003C\u002Fdiv>\u003C\u002Fa\n    >\u003Ca\n      class=\"gacSWM dCgFix conipm knkqUc bddCnd dTKJOB leOtqz hEzNkW fNBBKe jTWvec fIMbrO fzozfU group\"\n      href=\"\u002Fbrowser-extension\"\n      >\u003Cdiv class=\"plfYl bccLBY hSiiri fNBpvX\">浏览器扩展\u003C\u002Fdiv>\n      \u003Cdiv class=\"jqqjPD fWDXZB pKTba bBmAxp hSiiri evbPEu\">\n        \u003Cp>用于生成 Playwright 定位器的图形界面。\u003C\u002Fp>\n      \u003C\u002Fdiv>\u003C\u002Fa\n    >\u003Ca\n      class=\"gacSWM dCgFix conipm knkqUc bddCnd dTKJOB leOtqz hEzNkW fNBBKe jTWvec fIMbrO fzozfU group\"\n      href=\"\u002Fwiki\"\n      >\u003Cdiv class=\"plfYl bccLBY hSiiri fNBpvX\">QA 百科\u003C\u002Fdiv>\n      \u003Cdiv class=\"jqqjPD fWDXZB pKTba bBmAxp hSiiri evbPEu\">\n        \u003Cp>常见端到端测试术语的定义。\u003C\u002Fp>\n      \u003C\u002Fdiv>\u003C\u002Fa\n    >\n  \u003C\u002Fdiv>\n  \u003Cdiv\n    class=\"kSmiQp fPSBzf pKTba eTDpsp legDhJ hSiiri hdaZLM jTWvec gzBMzy bGySga fzoybr\"\n  >\n    \u003Cp class=\"dXhlDK leOtqz glpWRZ fNCcFz\">\n      使用 \u003Ckbd class=\"bWhrAL XAzZz cakMWc bUyOMB bmOrOm fyszFl dTmriP\">⌘\u003C\u002Fkbd> +\n      \u003Ckbd>k\u003C\u002Fkbd> + “工具”可快速访问所有工具。\n    \u003C\u002Fp>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\n```\n\n\u003C\u002Fdetails>\n\n## 实现\n\n### HTML 净化\n\n`auto` 函数使用 [sanitize-html](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fsanitize-html) 对页面的 HTML 进行净化，然后再将其发送给 OpenAI。这样做是为了降低成本并提高生成文本的质量。\n\n## ZeroStep\n\n该项目的灵感来源于 [ZeroStep](https:\u002F\u002Fzerostep.com\u002F)。ZeroStep 提供类似的 API，但通过其专有的后端实现了更为健壮的功能。Auto Playwright 的诞生旨在探索 ZeroStep 的底层技术，并为其软件的开源版本奠定基础。对于生产环境，我建议选择使用 ZeroStep。\n\n以下是 Auto Playwright 和 ZeroStep 的对比：\n\n| 标准                                                                              | Auto Playwright | ZeroStep |\n| ------------------------------------------------------------------------------------- | --------------- | -------- |\n| 是否使用 OpenAI API                                                                       | 是             | 否[^3]   |\n| 是否使用纯文本提示                                                               | 是             | 否       |\n| 是否使用 [`functions`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fopenai#automated-function-calls) SDK | 是             | 否       |\n| 是否进行 HTML 转义                                                                | 是             | 否       |\n| 是否使用 Playwright API                                                                   | 是             | 否[^4]   |\n| 是否使用截图                                                                      | 否              | 是      |\n| 是否使用队列                                                                            | 否              | 是      |\n| 是否使用 WebSockets                                                                       | 否              | 是      |\n| 快照格式                                                                             | HTML            | DOM      |\n| 是否实现并行处理                                                                | 否              | 是      |\n| 是否支持滚动                                                                      | 否              | 是      |\n| 是否提供测试夹具                                                                     | 否              | 是      |\n| 许可证                                                                               | MIT             | MIT      |\n\n[^3]: 使用 ZeroStep 专有 API。\n\n[^4]: 使用 _部分_ Playwright API，但主要依赖 Chrome 开发者工具协议 (CDP)。\n\n\u003Cdetails>\n  \u003Csummary>Zero Step 许可证\u003C\u002Fsummary>\n\n```\nMIT 许可证\n\n版权所有 © 2023 Reflect Software Inc\n\n特此授予任何人免费获取本软件及其相关文档文件（以下简称“软件”）副本的权利，允许在不受限制的情况下处理该软件，包括但不限于使用、复制、修改、合并、发布、分发、再许可和\u002F或销售该软件副本的权利；同时允许向任何获得本软件的人提供服务，但须遵守以下条件：\n\n上述版权声明及本许可声明应包含在所有副本或本软件的重要部分中。\n\n本软件按“原样”提供，不提供任何形式的明示或暗示保证，包括但不限于适销性、特定用途适用性和非侵权性。在任何情况下，作者或版权所有者均不对因合同、侵权或其他原因引起的任何索赔、损害赔偿或其他责任负责，无论这些责任是基于本软件还是基于对本软件的使用或其他方式而产生的。\n```\n\n\u003C\u002Fdetails>","# Auto Playwright 快速上手指南\n\nAuto Playwright 是一个利用 AI（OpenAI）自动执行 Playwright 测试的工具。它允许开发者使用自然语言描述操作（如“点击登录按钮”或“获取标题文本”），而无需编写繁琐的选择器代码，从而降低测试维护成本并加速测试编写。\n\n## 环境准备\n\n在开始之前，请确保满足以下要求：\n\n*   **Node.js**: 已安装 Node.js (推荐 v16+) 和 npm。\n*   **Playwright**: 项目中已安装 `@playwright\u002Ftest`。\n*   **OpenAI API Key**: 你需要一个有效的 OpenAI API 密钥。\n    *   *注意：由于网络原因，国内开发者可能需要配置代理或使用支持 OpenAI 接口的国内大模型服务（需兼容 OpenAI API 格式）。*\n\n## 安装步骤\n\n1.  **安装依赖**\n    在项目根目录下运行以下命令安装 `auto-playwright` 作为开发依赖：\n\n    ```bash\n    npm install auto-playwright -D\n    ```\n\n2.  **配置 API 密钥**\n    该工具依赖 OpenAI 接口。你需要将 API Key 设置为环境变量，或者添加到项目的 `.env` 文件中：\n\n    ```bash\n    export OPENAI_API_KEY='sk-...'\n    ```\n\n    *(Windows PowerShell 用户可使用 `$env:OPENAI_API_KEY=\"sk-...\"`)*\n\n## 基本使用\n\n### 1. 在 Playwright 测试中使用\n\n这是最推荐的用法，可以直接集成到现有的 Playwright 测试套件中。\n\n创建一个测试文件（例如 `example.spec.ts`）：\n\n```ts\nimport { test, expect } from \"@playwright\u002Ftest\";\nimport { auto } from \"auto-playwright\";\n\ntest(\"auto Playwright example\", async ({ page }) => {\n  await page.goto(\"\u002F\");\n\n  \u002F\u002F 查询数据：获取 header 的文本内容\n  const headerText = await auto(\"get the header text\", { page, test });\n\n  \u002F\u002F 执行动作：在搜索框中输入刚才获取的文本\n  await auto(`Type \"${headerText}\" in the search box`, { page, test });\n\n  \u002F\u002F 断言状态：检查搜索框内容是否等于 header 文本\n  const searchInputHasHeaderText = await auto(\n    `Is the contents of the search box equal to \"${headerText}\"?`,\n    { page, test },\n  );\n\n  expect(searchInputHasHeaderText).toBe(true);\n});\n```\n\n### 2. 独立浏览器自动化使用\n\n如果不使用 Playwright Test Runner，也可以直接在脚本中使用：\n\n```ts\nimport { chromium } from \"playwright\";\nimport { auto } from \"auto-playwright\";\n\n(async () => {\n  const browser = await chromium.launch({ headless: true });\n  const context = await browser.newContext();\n  const page = await context.newPage();\n  \n  await page.goto(\"https:\u002F\u002Fwww.example.com\");\n\n  \u002F\u002F 执行查询\n  const res = await auto(\"get the header text\", { page });\n\n  console.log(res);\n  \n  await page.close();\n  await browser.close();\n})();\n```\n\n### 3. 调试模式\n\n如果需要查看 AI 生成的具体提示词和执行命令，可以开启调试模式：\n\n**方法一：代码中开启**\n```ts\nawait auto(\"get the header text\", { page, test }, { debug: true });\n```\n\n**方法二：环境变量开启**\n```bash\nexport AUTO_PLAYWRIGHT_DEBUG=true\n```\n\n### 核心概念说明\n\n`auto` 函数会根据你的自然语言提示自动推断操作类型：\n\n*   **Action (动作)**: 如 \"click the link\"。成功返回 `undefined`，失败抛出错误。\n*   **Query (查询)**: 如 \"Get the text of the first link\"。返回字符串结果。\n*   **Assert (断言)**: 如 \"Are there 3 links on the page?\"。返回 `true` 或 `false`。","某电商团队的测试工程师正在为频繁变动的商品详情页编写自动化回归测试脚本，需验证页面标题、搜索框填充及结果一致性。\n\n### 没有 auto-playwright 时\n- 每次前端微调 DOM 结构（如修改类名或嵌套层级），硬编码的选择器立即失效，导致测试报错，维护成本极高。\n- 编写断言逻辑繁琐，工程师需手动查找元素路径并编写复杂的定位代码，耗时且容易出错。\n- 面对动态内容（如随机生成的促销标语），难以快速提取文本并用于后续步骤的输入验证，流程经常中断。\n- 新加入的测试人员需要深入学习 Playwright 的高级 API 才能上手，团队整体效率受限于个人技术熟练度。\n\n### 使用 auto-playwright 后\n- 只需输入自然语言指令（如“获取标题文本”），auto-playwright 利用 AI 自动识别元素，即使 DOM 结构变化也能智能适应，大幅减少脚本维护。\n- 将“在搜索框输入刚才获取的标题”这类复杂操作简化为一行代码，AI 自动完成元素查找与交互，开发速度显著提升。\n- 直接通过自然语言提问（如“搜索框内容是否等于标题？”）即可完成状态断言，无需关心底层实现细节，逻辑清晰直观。\n- 降低了自动化门槛，业务测试人员也能通过描述需求快速生成测试步骤，加速了测试用例的覆盖与迭代。\n\nauto-playwright 通过将自然语言转化为可靠的浏览器操作，让自动化测试从“维护选择器”的泥潭中解放出来，真正实现了敏捷高效的智能测试。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Flucgagan_auto-playwright_ded0adad.png","lucgagan","Luc Gagan","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Flucgagan_7c4d3678.png","Crafting bug-free software with an enjoyable touch.",null,"SF","https:\u002F\u002Fray.run\u002F","https:\u002F\u002Fgithub.com\u002Flucgagan",[82,86],{"name":83,"color":84,"percentage":85},"TypeScript","#3178c6",98.5,{"name":87,"color":88,"percentage":89},"HTML","#e34c26",1.5,837,135,"2026-04-02T16:29:12","MIT","未说明","不需要",{"notes":97,"python":95,"dependencies":98},"该工具基于 Node.js 运行，非 Python 项目。核心依赖是 OpenAI API（或 Azure OpenAI），需配置有效的 API Key。支持所有 Playwright 支持的浏览器（Chromium, Firefox, WebKit）。使用成本取决于调用的大模型（如 GPT-4），而非本地硬件算力。",[99,100,101,64],"nodejs","npm","@playwright\u002Ftest",[15,14,13],[104,105],"ai","playwright","2026-03-27T02:49:30.150509","2026-04-07T07:01:34.217620",[109,114,119,124,129,134],{"id":110,"question_zh":111,"answer_zh":112,"source_url":113},21203,"遇到错误 'TypeError: Cannot read properties of undefined (reading 'defaults')' 该如何解决？","这是一个与 `sanitize-html` 库类型定义相关的已知问题。在新版本发布前，您可以手动修改本地文件进行修复：\n1. 找到文件：`node_modules\u002Fauto-playwright\u002Fdist\u002FsanitizeHtml.js`\n2. 将该文件内容替换为以下代码（确保正确引入 sanitize-html）：\n\n```javascript\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.sanitizeHtml = void 0;\nconst sanitize = require(\"sanitize-html\");\n\nconst sanitizeHtml = (subject) => {\n  return sanitize(subject, {\n    allowedTags: sanitize.defaults.allowedTags.concat([\n      \"button\", \"form\", \"img\", \"input\", \"select\", \"textarea\",\n    ]),\n    allowedAttributes: false,\n  });\n};\nexports.sanitizeHtml = sanitizeHtml;\n```\n\n或者，您可以直接安装包含此修复的 PR 分支或等待官方新版本发布（该问题已在 v1.12.2 中修复过，但可能在后续版本回归）。","https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fissues\u002F36",{"id":115,"question_zh":116,"answer_zh":117,"source_url":118},21204,"在使用 Crawlee 结合 auto-playwright 时抛出 'defaults' 未定义的错误，有解决方法吗？","是的，这是由于 `sanitize-html` 的导入方式导致的。临时解决方案是手动修补 `node_modules\u002Fauto-playwright\u002Fdist\u002FsanitizeHtml.js` 文件。请将文件内容替换为显式调用 `require(\"sanitize-html\")` 并使用其 `.defaults` 属性的代码。已有用户确认通过直接使用仓库代码或应用此补丁可以解决问题。维护者已收到相关 PR（#40），建议关注后续版本更新以获取官方修复。","https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fissues\u002F33",{"id":120,"question_zh":121,"answer_zh":122,"source_url":123},21205,"为什么升级 auto-playwright 后会出现 'Cannot read properties of undefined (reading 'defaults')' 错误？","这是因为 TypeScript 编译后的 JavaScript 代码在访问 `sanitize-html` 的默认导出时出现了兼容性问题。生成的代码试图访问 `sanitize_html_1.default.defaults`，但在某些环境下 `default` 属性未正确定义。\n解决方案：\n1. 降级到稳定版本（如 1.14.0 或更早的 1.12.2）。\n2. 或者手动修改 `node_modules\u002Fauto-playwright\u002Fdist\u002FsanitizeHtml.js`，将导入和调用方式改为 CommonJS 标准写法（参考 issue #36 中的代码片段）。\n3. 检查您的 `tsconfig.json` 配置，确保模块解析设置与库的期望一致。","https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fissues\u002F7",{"id":125,"question_zh":126,"answer_zh":127,"source_url":128},21206,"我已经设置了 OPENAI_API_KEY 环境变量，但仍然报错，这是为什么？","如果报错信息是 `TypeError: Cannot read properties of undefined (reading 'defaults')`，那么问题通常不在于 API Key 的配置，而在于 `auto-playwright` 内部依赖的 `sanitize-html` 库加载失败。即使环境变量设置正确，代码在执行到 HTML 清理步骤时也会崩溃。请优先参考上述关于修复 `sanitizeHtml.js` 文件的方案。一旦该类型错误解决，如果仍有 API 相关错误，再检查 Key 的有效性。","https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fissues\u002F52",{"id":130,"question_zh":131,"answer_zh":132,"source_url":133},21207,"是否有针对 Azure OpenAI 用户的特定修复方案来解决 'defaults' 错误？","Azure OpenAI 用户遇到的 `TypeError: Cannot read properties of undefined (reading 'defaults')` 错误与其他用户遇到的本质相同，都是库内部的 `sanitize-html` 兼容性问题，与使用的 OpenAI 服务端点（Azure 或官方）无关。因此，解决方案是一样的：手动修补 `node_modules\u002Fauto-playwright\u002Fdist\u002FsanitizeHtml.js` 文件，或者等待维护者发布包含修复的新版本。不要误以为是 Azure 配置导致的问题。","https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fissues\u002F51",{"id":135,"question_zh":136,"answer_zh":137,"source_url":118},21208,"如何验证 'defaults' 错误是否已被修复，或者是否有官方版本可用？","您可以查看项目的 Release 页面或 npm 包版本历史。该问题曾在 v1.12.2 版本中被标记为已解决。如果您使用的是更高版本（如 1.15.0 或 1.16.0）且问题重现，说明可能存在回归。您可以尝试:\n1. 暂时降级到 `npm install auto-playwright@1.12.2` 测试是否恢复正常。\n2. 关注 GitHub Issue #40 的合并状态，该 PR 旨在永久修复此问题。\n3. 在等待期间，使用社区提供的 `sanitizeHtml.js` 补丁代码覆盖本地文件是最快的验证和解决方法。",[139,144,149,154,159,164,169,174,179,184,189,194,199,204,209,214,219,224,229,234],{"id":140,"version":141,"summary_zh":142,"released_at":143},127212,"v1.16.1","## [1.16.1](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcompare\u002Fv1.16.0...v1.16.1) (2025-05-01)\n\n\n### 错误修复\n\n* 移除未使用的导出 ([80846a1](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002F80846a11825e9617e15ee212a7dc9845edac7572))\n\n\n\n","2025-05-01T13:52:33",{"id":145,"version":146,"summary_zh":147,"released_at":148},127213,"v1.16.0","# [1.16.0](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcompare\u002Fv1.15.1...v1.16.0) (2024-07-09)\n\n\n### 功能\n\n* 默认使用 gpt-4o ([8d9a9bf](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002F8d9a9bfa4c2d5f62c2adb193756056f5474579ed))\n\n\n\n","2024-07-09T17:06:09",{"id":150,"version":151,"summary_zh":152,"released_at":153},127214,"v1.15.1","## [1.15.1](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcompare\u002Fv1.15.0...v1.15.1)（2024-07-09）\n\n\n### 错误修复\n\n* 更新至 4o ([5db16bc](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002F5db16bc724d9e56a5fbafbc78366bc6846336e83))\n\n\n\n","2024-07-09T05:37:56",{"id":155,"version":156,"summary_zh":157,"released_at":158},127215,"v1.15.0","# [1.15.0](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcompare\u002Fv1.14.0...v1.15.0) (2024-06-04)\n\n\n### 功能\n\n* 添加对 Azure OpenAI 的支持 ([9c19164](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002F9c191647ddbc80ef607f5e12fba9b83e34bdf912))\n\n\n\n","2024-06-04T14:57:01",{"id":160,"version":161,"summary_zh":162,"released_at":163},127216,"v1.14.0","# [1.14.0](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcompare\u002Fv1.13.0...v1.14.0) (2023-11-17)\n\n\n### 功能\n\n* 允许将 OpenAI API 密钥作为选项传递 ([7cc05b9](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002F7cc05b9423a0f005c1c5584c3029a79073219c82))\n\n\n\n","2023-11-17T20:07:30",{"id":165,"version":166,"summary_zh":167,"released_at":168},127217,"v1.13.0","# [1.13.0](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcompare\u002Fv1.12.2...v1.13.0) (2023-11-15)\n\n\n### 功能\n\n* 增加无需 `test` 参数即可运行的能力 ([62f41a3](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002F62f41a30f8d81ce20438cbf0652b741b10f6b9ff))\n\n\n\n","2023-11-15T05:04:40",{"id":170,"version":171,"summary_zh":172,"released_at":173},127218,"v1.12.2","## [1.12.2](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcompare\u002Fv1.12.1...v1.12.2) (2023-11-15)\n\n\n### 错误修复\n\n* 发布变更 ([a91884b](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002Fa91884b74c0cbd482c2ae4c437722704ae85925f))\n\n\n\n","2023-11-15T04:13:31",{"id":175,"version":176,"summary_zh":177,"released_at":178},127219,"v1.12.1","## [1.12.1](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcompare\u002Fv1.12.0...v1.12.1) (2023-11-15)\n\n\n### 错误修复\n\n* 透传模型（修复 [#9](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fissues\u002F9)）([08d4539](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002F08d45391112a6e105a2617d386132c5f0fcb6af3))\n\n\n\n","2023-11-15T02:01:42",{"id":180,"version":181,"summary_zh":182,"released_at":183},127220,"v1.12.0","# [1.12.0](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcompare\u002Fv1.11.1...v1.12.0) (2023-11-14)\n\n\n### 错误修复\n\n* 移除泄露的快照实现 ([3cef04a](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002F3cef04a06bdcc01d3499c2a96f246486e19a57c8))\n\n\n### 功能新增\n\n* 添加 locator_evaluate 方法 ([#1](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fissues\u002F1)) ([0fc3e36](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002F0fc3e3602c0a198e5960f7dc5ad39ca586ef8e53))\n* 在错误中包含 elementId ([7e1e6ec](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002F7e1e6ec6150c456918940ca080ce2a4817667666))\n\n\n\n","2023-11-14T16:12:41",{"id":185,"version":186,"summary_zh":187,"released_at":188},127221,"v1.11.1","## [1.11.1](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcompare\u002Fv1.11.0...v1.11.1) (2023-11-14)\n\n\n### 错误修复\n\n* 未引用 RunnableFunctionWithoutParse ([706069e](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002F706069ed4ac6c8a3a23286803e506b1ed959f409))\n\n\n\n","2023-11-14T15:54:43",{"id":190,"version":191,"summary_zh":192,"released_at":193},127222,"v1.11.0","# [1.11.0](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcompare\u002Fv1.10.0...v1.11.0) (2023-11-14)\n\n\n### Features\n\n* add assertion methods ([#1](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fissues\u002F1)) ([01fc156](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002F01fc156df96a4fac807b63d1c756b4c64ddb3047))\n* add AUTO_PLAYWRIGHT_DEBUG ([663c8b2](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002F663c8b243f79ce09cab15c4180c7b42dcfccdf4a))\n\n\n\n","2023-11-14T15:31:09",{"id":195,"version":196,"summary_zh":197,"released_at":198},127223,"v1.10.0","# [1.10.0](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcompare\u002Fv1.9.0...v1.10.0) (2023-11-14)\n\n\n### Features\n\n* expand instructions to ensure unique selectors are used ([75cc7c2](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002F75cc7c284031646b012b50f4135249982f161bb5))\n\n\n\n","2023-11-14T14:58:06",{"id":200,"version":201,"summary_zh":202,"released_at":203},127224,"v1.9.0","# [1.9.0](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcompare\u002Fv1.8.1...v1.9.0) (2023-11-14)\n\n\n### Bug Fixes\n\n* remove unnecessary wrapping ([cec143f](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002Fcec143f1c9f17f0c17c4061609d67b84d9cc71f3))\n\n\n### Features\n\n* rename cssLocator to cssSelector ([c8e6205](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002Fc8e620509679553674c1f15439f5455777091a50))\n\n\n\n","2023-11-14T14:54:14",{"id":205,"version":206,"summary_zh":207,"released_at":208},127225,"v1.8.1","## [1.8.1](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcompare\u002Fv1.8.0...v1.8.1) (2023-11-12)\n\n\n### Bug Fixes\n\n* output commonjs ([e0fa770](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002Fe0fa770599afd8bee069b51e10d7e926233c500a))\n* remove tests from dist ([c9bd9c5](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002Fc9bd9c5b0790cb3541ffdf7dd1d13bfbf79503c6))\n\n\n\n","2023-11-12T20:43:51",{"id":210,"version":211,"summary_zh":212,"released_at":213},127226,"v1.8.0","# [1.8.0](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcompare\u002Fv1.7.0...v1.8.0) (2023-11-12)\n\n\n### Bug Fixes\n\n* move @playwright\u002Ftest to peer dependencies ([a71d0d9](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002Fa71d0d937fad40d424efe17b6bffbdf507910745))\n\n\n### Features\n\n* add knip ([2815501](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002F281550112cab07fa2d37c9f39e6895e837da1326))\n* remove playwright-core ([02d8ea7](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002F02d8ea7b701b083f245b1fd5286bea78fc414f5a))\n\n\n\n","2023-11-12T18:41:05",{"id":215,"version":216,"summary_zh":217,"released_at":218},127227,"v1.7.0","# [1.7.0](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcompare\u002Fv1.6.1...v1.7.0) (2023-11-12)\n\n\n### Features\n\n* add select, textarea and img to the list of allowed tags ([aead59f](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002Faead59f3e523c0fffc9a1a07e8c1d55cd69c9f7b))\n\n\n\n","2023-11-12T18:11:29",{"id":220,"version":221,"summary_zh":222,"released_at":223},127228,"v1.6.1","## [1.6.1](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcompare\u002Fv1.6.0...v1.6.1) (2023-11-12)\n\n\n### Bug Fixes\n\n* correct export (fixes [#4](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fissues\u002F4)) ([e90d1fb](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002Fe90d1fb734e11053953c4fad632f8ddfff36ba91))\n\n\n\n","2023-11-12T05:48:08",{"id":225,"version":226,"summary_zh":227,"released_at":228},127229,"v1.6.0","# [1.6.0](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcompare\u002Fv1.5.0...v1.6.0) (2023-11-12)\n\n\n### Features\n\n* add isEditable ([372252d](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002F372252d398c87e6113fa239eb963dfb326b81f55))\n* add locator.isEnabled ([e7b67eb](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002Fe7b67eb5234587be6efc42dc5157f5cc3b5fc63f))\n* add locator.textContent ([d03fcd7](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002Fd03fcd7455ef4010f3f7050d6aa63c609fa17b2d))\n* wrap function response types ([4c95f48](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002F4c95f48c0418b6315b4701ca84cece361d161767))\n\n\n\n","2023-11-12T04:13:50",{"id":230,"version":231,"summary_zh":232,"released_at":233},127230,"v1.5.0","# [1.5.0](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcompare\u002Fv1.4.0...v1.5.0) (2023-11-11)\n\n\n### Features\n\n* add isVisible ([42c780b](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002F42c780b77c9addb774832779ce58534d5474948c))\n\n\n\n","2023-11-11T23:05:23",{"id":235,"version":236,"summary_zh":237,"released_at":238},127231,"v1.4.0","# [1.4.0](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcompare\u002Fv1.3.0...v1.4.0) (2023-11-11)\n\n\n### Features\n\n* add check, uncheck and isChecked ([071fafd](https:\u002F\u002Fgithub.com\u002Flucgagan\u002Fauto-playwright\u002Fcommit\u002F071fafd49ee3ab67c15462e181771e754bd1d3c8))\n\n\n\n","2023-11-11T23:01:42"]