使用 Playwright 录制功能快速生成脚本
Playwright 的录制功能非常强大,可以实时记录你的操作并生成代码。下面是详细的使用指南:
1. 安装与基本使用
安装 Playwright Python 包
pip install playwright
安装浏览器驱动
playwright install chromium
playwright install firefox
playwright install webkit
如何使用 Playwright 录制功能快速生成 Python RPA 脚本。内容包括安装配置、基础录制命令、iframe 操作技巧及代码生成示例。重点讲解了如何处理 iframe 嵌套、跨域限制和动态 ID 等常见问题,提供了自动优化脚本和企业级工作流模板。此外,还总结了录制前后的最佳实践,包括清理缓存、慢速操作、添加等待策略及错误处理,帮助开发者构建稳定可靠的自动化测试与业务流程脚本。
Playwright 的录制功能非常强大,可以实时记录你的操作并生成代码。下面是详细的使用指南:
pip install playwright
playwright install chromium
playwright install firefox
playwright install webkit
playwright codegen
playwright codegen https://example.com
playwright codegen --browser=chromium https://example.com
playwright codegen -o recorded_script.py https://example.com
playwright codegen --device="iPhone 12" https://example.com
当页面包含 iframe 时,录制需要特殊处理:
playwright codegen --timeout=30000 https://your-target-site.com
录制操作后,Playwright 会生成类似这样的代码:
from playwright.sync_api import sync_playwright, expect
def run(playwright):
browser = playwright.chromium.launch(headless=False)
context = browser.new_context(
viewport={"width": 1920, "height": 1080},
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
)
# 开启自动等待
context.set_default_timeout(30000)
page = context.new_page()
# 访问目标网站
page.goto("https://example.com/login")
# 登录操作(如果需先登录)
page.locator("#username").fill("admin")
page.locator("#password").fill("password")
page.locator("button[type='submit']").click()
# 等待主页面加载完成
page.wait_for_url("**/dashboard")
# 等待 iframe 出现
page.wait_for_selector("iframe.content-frame")
# 方法 1:使用 frame_locator (推荐)
frame = page.frame_locator("iframe.content-frame")
# 点击 iframe 内的按钮
frame.locator("button.submit").click()
# 或者方法 2:直接录制会生成这样的代码
# page.frame(name="content").click("button.submit")
# 处理弹窗或结果
page.wait_for_timeout(2000)
# 截图验证
page.screenshot(path="after_click.png")
# 关闭浏览器
context.close()
browser.close()
with sync_playwright() as playwright:
run(playwright)
playwright codegen --load-storage=auth.json https://admin.site.com
playwright codegen --save-storage=auth.json https://admin.site.com
playwright codegen --target=python-pytest https://example.com
playwright codegen --target=javascript https://example.com
from playwright.sync_api import sync_playwright
import time
class RecordedScriptOptimizer:
"""优化录制生成的代码"""
def __init__(self):
self.playwright = sync_playwright().start()
self.browser = self.playwright.chromium.launch(
headless=False,
args=['--disable-blink-features=AutomationControlled', '--start-maximized']
)
def optimize_iframe_operations(self, url, iframe_selector):
"""优化 iframe 操作"""
context = self.browser.new_context(
ignore_https_errors=True,
java_script_enabled=True
)
page = context.new_page()
try:
# 1. 增加智能等待
page.goto(url, wait_until="networkidle")
# 2. 等待 iframe 加载的多种策略
page.wait_for_selector(iframe_selector, state="attached")
# 3. 自动重试机制
max_retries = 3
for attempt in range(max_retries):
try:
# 4. 多种方式定位 iframe
frame = page.frame_locator(iframe_selector)
# 5. 验证 iframe 内容已加载
frame.locator("body").wait_for(state="visible")
# 这里是录制的主要操作
# 例如点击按钮
frame.locator("button#confirm").click()
# 6. 等待操作反馈
page.wait_for_timeout(1000)
# 7. 验证操作成功
success_indicator = frame.locator(".success-message")
expect(success_indicator).to_be_visible()
print(f"操作成功,尝试次数:{attempt + 1}")
break
except Exception as e:
if attempt == max_retries - 1:
raise
print(f"尝试 {attempt + 1} 失败,重试...")
page.wait_for_timeout(2000)
except Exception as e:
# 8. 错误处理和截图
page.screenshot(path=f"error_{int(time.time())}.png")
raise
finally:
context.close()
def close(self):
self.browser.close()
self.playwright.stop()
if __name__ == "__main__":
optimizer = RecordedScriptOptimizer()
optimizer.optimize_iframe_operations(
url="https://your-app.com",
iframe_selector="iframe.main-content"
)
optimizer.close()
import logging
from datetime import datetime
from pathlib import Path
from playwright.sync_api import sync_playwright, TimeoutError as PlaywrightTimeoutError
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('automation.log'),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
class AutomatedWorkflow:
def __init__(self, config):
self.config = config
self.screenshots_dir = Path("screenshots")
self.screenshots_dir.mkdir(exist_ok=True)
def take_screenshot(self, page, name):
"""记录关键步骤截图"""
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
path = self.screenshots_dir / f"{name}_{timestamp}.png"
page.screenshot(path=path, full_page=True)
logger.info(f"截图已保存:{path}")
def execute_iframe_workflow(self):
"""执行录制的 iframe 工作流"""
with sync_playwright() as p:
# 启动浏览器
browser = p.chromium.launch(
headless=self.config.get("headless", False),
slow_mo=500 # 减慢操作,便于观察
)
# 创建上下文
context = browser.new_context(
viewport={"width": 1920, "height": 1080},
ignore_https_errors=True
)
page = context.new_page()
try:
logger.info("开始自动化流程")
# 步骤 1:登录(如果需要)
if self.config.get("login_required"):
self._login(page)
self.take_screenshot(page, "after_login")
# 步骤 2:导航到目标页面
page.goto(
self.config["target_url"],
wait_until="networkidle",
timeout=60000
)
self.take_screenshot(page, "page_loaded")
# 步骤 3:处理 iframe
logger.info("定位 iframe")
iframe_selector = self.config["iframe_selector"]
page.wait_for_selector(iframe_selector, timeout=30000)
# 切换到 iframe
frame = page.frame_locator(iframe_selector)
# 步骤 4:在 iframe 内执行录制操作
logger.info("在 iframe 内执行操作")
# 示例操作:填写表单
frame.locator("input[name='username']").fill("test_user")
frame.locator("input[type='password']").fill("test_pass")
self.take_screenshot(page, "form_filled")
# 示例操作:点击提交按钮
submit_button = frame.locator("button.submit-btn")
submit_button.click()
# 步骤 5:等待结果
logger.info("等待操作结果")
page.wait_for_timeout(3000)
# 步骤 6:验证结果
success_msg = frame.locator(".alert-success")
if success_msg.count() > 0:
logger.info("操作成功完成")
else:
logger.warning("未检测到成功提示")
self.take_screenshot(page, "final_result")
logger.info("自动化流程完成")
except PlaywrightTimeoutError:
logger.error("操作超时")
self.take_screenshot(page, "timeout_error")
raise
except Exception as e:
logger.error(f"执行失败:{e}")
self.take_screenshot(page, "execution_error")
raise
finally:
# 清理资源
context.close()
browser.close()
def _login(self, page):
"""登录流程"""
login_url = self.config.get("login_url")
if login_url:
page.goto(login_url)
page.fill("#username", self.config["credentials"]["username"])
page.fill("#password", self.config["credentials"]["password"])
page.click("#login-btn")
page.wait_for_url("**/dashboard")
config = {
"headless": False,
"login_required": True,
"login_url": "https://example.com/login",
"credentials": {
"username": "your_username",
"password": "your_password"
},
"target_url": "https://example.com/app",
"iframe_selector": "iframe.main-iframe",
"actions": [
{"type": "fill", "selector": "input.name", "value": "Test User"},
{"type": "click", "selector": "button.submit"}
]
}
if __name__ == "__main__":
workflow = AutomatedWorkflow(config)
workflow.execute_iframe_workflow()
wait_for_timeout。解决方案:
page.wait_for_function("""
() => {
const iframe = document.querySelector('iframe');
return iframe && iframe.contentWindow.document.readyState === 'complete';
}
""")
**解决方案:**使用 try-catch 处理
try:
frame = page.frame(name="target_frame")
except:
# 备用方案:通过 URL 匹配
frame = page.frame(url="**/target-path/**")
**解决方案:**使用部分属性匹配
frame = page.frame_locator("iframe[title*='目标']")
playwright codegen --debug https://example.com
playwright codegen --verbose https://example.com
通过以上方法,你可以快速生成并优化操作 iframe 的自动化脚本。录制功能是一个很好的起点,结合手动优化可以创建出稳定可靠的企业级自动化脚本。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online