用Playwright做了100次自动化任务,我总结了这5个必踩的坑

搞了大半个月的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,碰到什么问题欢迎评论区交流,我能帮的一定帮。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

telllong

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值