最近好多小伙伴后台留言询问关于playwright的一些问题,在这里我大概说一下我自己的感受。
最开始我是没怎么看文档的,就是凭自己的感觉在浪,有问题去看度娘。结果发现度娘上的东西都是最简单入门的,告诉你如何安装,如何录制就完事了。 自己在使用的过程中,发现我有两个问题不太好解决。
第一个是弹框子, 第二个是获取某个元素的text。 这个是度娘上搜不到的,自己折腾了很久,差点放弃了。 然后我去看文档: https://playwright.dev/python/docs/intro/ 发现文档上很全 然后还是没解决我的问题,后面我又去看源码: https://github.com/2926295173/playwright-python/blob/master/playwright/page.py 终于发现如果获取text,可以用:
代码语言:javascript复制page.innerText()
想想大名鼎鼎的microsoft,不会做出这么粗糙的东西,只是我们没找到它的方法。
如果要学一个东西,最好是看官方文档或者是源码。 文档是英文的,我这里简单总结一下。
定位元素:
可以看这一章
Playwright可以使用CSS选择器、XPath选择器、HTML属性(如id、data-test-id,甚至文本内容)来搜索元素。只需直接使用即可,可以自动探测
简写 选择器以// 或者..开头,则会默认为是xpath=selector 例子:page.click('//html') 可转换为 page.click('xpath=//html') 选择器开始和结束以引号("或者'),则默认为text=selector 例子:page.click(' "foo" ') 可转换为 page.click('text="foo"') 其他的默认为是css=selector 例子:page.click('div') 可转换为 page.click('css=div') 链式选择器 选择器可以与>>组合使用,例如selector1 >> selector2 >> selectors3。当选择器被链接时,下一个选择器会相对于前一个选择器的结果进行查询。
例如:
代码语言:javascript复制page.querySelector('css=article >> css=.bar > .baz >> css=span[attr=value]')
等同于:
代码语言:javascript复制page.querySelector('article').querySelector('.bar > .baz').querySelector('span[attr=value]')
css=article >> text=Hello查找文本为Hello的 article 元素;*css=article >> text=Hello查找包含文本Hello的 article 元素. 你可以用browser的inspect工具来查看元素。 感觉playwright查找元素更灵活,省去了各种find_element_by_xxx
等待:
playwright比webdriver好用的地方,就是各种等待不需要自己去指定,selenium有的,它都有,感觉它就是集成了各种框架的优点 如果查找元素,可以用
代码语言:javascript复制page.query_selector()
page.query_selector_all()
如果你想要一个超时时间:
代码语言:javascript复制page.wait_for_selector("text=Generate Security Code",timeout=1000):
这里的时间是毫秒。 你也可以根据状态来判断元素是否加载,看这块的文档
弹框:
我最开始遇到就是这个拦路虎,虽然录制时有代码,但是运行的时候总是不通过。 文档这句话提醒了我. By default, dialogs are auto-dismissed by Playwright, so you don't have to handle them. However, you can register a dialog handler before the action that triggers the dialog to accept or decline it.
代码语言:javascript复制page.on("dialog", lambda dialog: dialog.accept())
page.click("button")
我在录制的基础上,然后又加了代码点击了一下,出来了框子,然后再处理的。后面发现不是很稳定,运行速度太快了,加了等待一秒,彻底解决问题。
调试
运行的时候,看看哪里除了问题,可以用来调试:
代码语言:javascript复制# Linux/macOS
$ PWDEBUG=1 pytest -s
# Windows
$ set PWDEBUG=1
$ pytest -s
其实在录制的时候,就有调试界面。 这个对定位问题,还是很有帮助的,有点像cypress
单步执行,就可以定位到问题。
运行
这个框架默认是pytest的,你可以这样安装
代码语言:javascript复制pip install pytest-playwright
运行时就可以:
代码语言:javascript复制# Run tests (Chromium and headless by default)
pytest
# Run tests in headful mode
pytest --headful
# Run tests in a different browser (chromium, firefox, webkit)
pytest --browser firefox
# Run tests in multiple browsers
pytest --browser chromium --browser webkit
当然你也可以不用框架,运行的时候直接用python也是可以的。debug也可以,亲自实验且通过的。
最后
其实你扫一遍文档,就知道这个工具的使用了。如果需要查方法,或者东西,可以去文档搜。
相关的东西都能列出来,比去源码里面搜要高效很多。 playwright有微软这棵大树,估计会发展得很好。当然它还在完善,我们期待它能更加完美。也许它发展好了,好多人会被淘汰了。 Stay Hungry, Stay Foolish! 坚持学习,争取不被淘汰。