搞了大半个月的Playwright自动化,爬了100多个网站、做了20多个自动化任务,踩的坑数都数不过来。今天挑最常见的5个说,帮你少走弯路。
为什么我要折腾Playwright
以前用Selenium,各种驱动版本不匹配,启动慢的要死,经常无缘无故崩溃。直到上个月试了Playwright,真香。
自动等待、多浏览器支持、内置截图录屏,基本上你需要的功能它都有。
不过好用归好用,坑还是不少的,尤其是刚上手的时候,很多问题官方文档根本不提。
坑1:默认代理导致访问失败
很多人第一次运行Playwright脚本的时候,会碰到ERR_PROXY_CONNECTION_FAILED的错误,死活访问不了网站。
我当时卡了半小时,最后发现是Playwright默认继承了系统代理,而我本地开的代理刚好挂了。
解决方法也简单,启动浏览器的时候加上--proxy none参数就行:
browser = await p.chromium.launch(args=['--proxy none'])

坑2:headless模式下元素定位不到
这个坑我踩了无数次:本地有头浏览器运行好好的,放到服务器headless模式就找不到元素。
原因很简单:headless模式下的默认窗口尺寸很小,很多元素被挤到视口外面了,或者响应式布局变了。
解决方法:启动的时候指定窗口大小,或者用force参数强制点击:
page = await context.new_page(viewport={'width': 1920, 'height': 1080})
# 或者点击的时候强制
await locator.click(force=True)

坑3:动态内容加载不出来
很多网站是懒加载的,或者内容是JS动态渲染的,你直接访问的话拿到的是空页面。
以前我用time.sleep(5)硬等,效率低还不稳定。其实Playwright有自带的等待机制:
# 等待元素出现
await page.wait_for_selector('.content-item', timeout=10000)
# 等待网络空闲
await page.wait_for_load_state('networkidle')

坑4:iframe里的元素找不到
很多网站会用iframe嵌入内容,比如登录框、广告,这时候直接用选择器是找不到里面的元素的。
你需要先定位到iframe,再在里面查找:
iframe = page.frame_locator('#login-iframe')
await iframe.locator('#username').fill('我的账号')
坑5:点击后页面跳转但后续操作失败
这个坑最隐蔽:你点击了一个按钮,页面要跳转,你直接操作下一个页面的元素,结果报错找不到。
原因是点击后还没等页面加载完成,你就开始操作了。正确的做法是等待导航完成:
async with page.expect_navigation():
await page.locator('#submit-btn').click()
# 导航完成后再操作
await page.locator('#success').wait_for()
写在最后
其实Playwright的坑远不止这5个,但这几个是我刚上手的时候最常碰到的,基本上每个人都会踩一遍。
现在我写Playwright脚本的时候,都会把这些坑提前规避掉,效率比以前高太多了。
如果你也在玩Playwright,碰到什么问题欢迎评论区交流,我能帮的一定帮。

1247

被折叠的 条评论
为什么被折叠?



