PlayWright简介
我是在知乎上看到这个项目的介绍的,比较好奇,就找资料看了一下,试着玩一玩。
Github地址:playwright-python
根据官方页面的介绍,PlayWright是一个“用于Chromium, Firefox 和WebKit浏览器(引擎?内核?)自动化的,提供统一API的python库”(翻译水平不行,大致是这么个意思)。
所以,PlayWright的优势在于
- 浏览器支持全面
- 操作系统平台支持全面
- 支持脚本录制
试用过程
安装步骤参考官网(本文的测试环境是64位win7,python 3.7.8):
pip install playwright
python -m playwright install
安装包不小,加起来几百MB。
录制脚本的过程,打开命令行窗口输入
python -m playwright codegen --target python -o "e:\test.py" -b chromium https://baidu.com
这行命令会启动一个浏览器窗口(chromium),录制的步骤非常简单,在百度的首页搜索输入框输入“哈哈哈”并回车,生成代码如下:
from playwright import sync_playwright
def run(playwright):
browser = playwright.firefox.launch(headless=False)
context = browser.newContext()
# Open new page
page = context.newPage()
# Go to https://www.baidu.com/
page.goto("https://www.baidu.com/")
# Fill input[name="wd"]
page.fill("input[name=\"wd\"]", "哈哈哈")
# Go to https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E5%93%88%E5%93%88%E5%93%88&fenlei=256&rsv_pq=a55ce9c00013ecec&rsv_t=a3a4dir1PDtu9KDZByHqjL9pw77Lyg0YWU5VG53igl1o9LyxwAhSZeJKR80&rqlang=cn&rsv_enter=0&rsv_dl=tb&rsv_sug3=1&rsv_sug1=1&rsv_sug7=100&rsv_btype=i&prefixsug=%25E5%2593%2588%25E5%2593%2588%25E5%2593%2588&rsp=6&inputT=4173&rsv_sug4=4173
page.goto("https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E5%93%88%E5%93%88%E5%93%88&fenlei=256&rsv_pq=a55ce9c00013ecec&rsv_t=a3a4dir1PDtu9KDZByHqjL9pw77Lyg0YWU5VG53igl1o9LyxwAhSZeJKR80&rqlang=cn&rsv_enter=0&rsv_dl=tb&rsv_sug3=1&rsv_sug1=1&rsv_sug7=100&rsv_btype=i&prefixsug=%25E5%2593%2588%25E5%2593%2588%25E5%2593%2588&rsp=6&inputT=4173&rsv_sug4=4173")
# Close page
page.close()
# ---------------------
context.close()
browser.close()
with sync_playwright() as playwright:
run(playwright)
然后运行生成的文件(E:\test.py)
python e:\test.py
之前手动操作的过程就会完整的复现一遍,包括打开浏览器窗口,访问百度,输入“哈哈哈”,并跳转。
———————分割线————————
OK,以上是目前许多宣传文章的举例大致步骤,是用于证明用playwright是“不用写一行代码”的。其实但凡看看github的简介,也能发现这东西远没有那么简单。如果我们阅读上面这段生成的python代码,不难发现——运行完这段代码,我们啥也没记下来,那跑它有啥意义呢?
假设我现在想知道访问百度是否成功了,最起码应该对服务器的响应做一些处理吧?于是就需要对第一个page.goto做一下修改:
# Go to https://www.baidu.com/
r = page.goto("https://www.baidu.com/")
print(r.status)
再次运行,就会打印出200, 表示请求成功了。
本来是想基于这东西做个UI测试自动化的平台的,所以又仔细研究了一段时间,发现这东西潜力是有的,缺点也是大大的,想让不会写代码的小白能用好这东西是不现实的。
虽然宣传上都在吹它有多么简易,但真正要运用的UI测试自动化里去,还是有相当的门槛,仅仅靠录制的代码远远不够。放到实际的需求中,我们需要处理的内容会更多,比如body的内容,都是跟业务场景直接挂钩的,这部分的代码肯定还得需要人来补,像页面截图、保存、传输的操作,也是得单独写的。
举个现实点的例子,比如将status、body中的部分字段,提取出来,保存到数据库(写到文件、发送到消息队列)等等,以备后续的筛选、查询、分析等等。也就是说,要满足实用的要求,录制操作生成的代码只能起到一个提纲的作用。
另外代码录制过程中卡顿、未知异常、遗漏等情况也时有发生,而且竟然在I7 8700的CentOS(Hyper-V虚拟机)和Win10上运行,比在I7-3520M的Win7笔记本上还卡……尤其是在比较复杂的页面上,浏览器卡得动都动不了了,简直难以理解。期待在后续版本中能解决。
话说回来,如果反正都要写代码,我个人倒更倾向于录C#脚本了,改下–target选项即可。毕竟写C#的体验比Python可好多了,运行效率更是不知高出多少倍。【PlayWright-Sharp】