测试工具 Playwright 简介,再见 Selenium,虽然我依然爱你"/>
浏览器自动化测试工具 Playwright 简介,再见 Selenium,虽然我依然爱你
Based playwright 1.17
发布时间:2021-12-01
作为一个兴趣驱动的代码农场主,我用 python 的原因真的是“人生苦短”,能省一点时间就省一点,本着能用就行的态度对待一切,但我依然无法忍受 Selenium 是不是冒一些小强出来。在网上冲浪的时候发现了 Playwright(aka 剧作家,没错微软就是这么文采斐然)。
1. Playwright 是什么
官网 h1 是这么写的:Playwright enables reliable end-to-end testing for modern web apps. 翻译成中国话就是“Playwright 为现代网络应用程序提供可靠的端到端测试”,说人话就是一个测试工具,当然大家都懂要用测试工具做什么。
这玩意名字里有个 play,那么,有什么好玩的呢?
- 适用于常见的现代化浏览器(官网说所有浏览器,这口气这自信)
- 可以用简单的 API 调用 Chromium、Firefox 和 WebKit 内核进行自动化操作。
- 可以模拟移动端访问。
- 跨平台测试。
- 可以以有头或无头模式调用(我哔好吓人,其实就是有没有浏览器窗口而已)
- 执行快速而可靠
- 可以为现代化的单页网络应用(哪里现代化?)进行自动化操作。
- 浏览器隔离:多个执行环境通过 browser contexts 进行隔离,使用重用的同一个浏览器实例。
- 自动超时控制:网络堵塞时,不用再 sleep 阻塞线程了,剧作家会自动等待超时。
- 元素选择器:可以依靠文本内容或辅助标签选择元素(美丽汤下岗了)
- 多语言支持
- JavaScript & TypeScript, Python, .NET and, Java 可用。
- 还有一大堆,懒得翻了,总之一个字,好!
.NET 就是个折翼的天使,我现在都不敢相信我曾经认真学过。随着年龄增长,我面对问题的解决方案越来越功利,所以 python。
2. python 库安装
pip
pip install --upgrade pip
pip install playwright
playwright install
第一行看心情。
Conda
conda config --add channels conda-forge
conda config --add channels microsoft
conda install playwright
playwright install
浏览器内核安装
playwright install
会安装可用的全部 3 种内核,也可以传参只安其中的一个或几个:
playwright install webkit
3. 基础用法
from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch()page = browser.new_page()page.goto("")print(page.title())browser.close()
还有异步调用,代码方面 Docs 内容还相对可以,自行查看就好。
比较关键的就是选择器,除了 focus click dblclick hover
等操作以外,
# 通过文本选择元素,这是 Playwright 自定义的一种表达式
page.click("text=登陆")# 直接通过 id 选择
page.click("id=login")# 通过 CSS 选择元素
page.click("#search")
# 除了常用的 CSS 表达式外,Playwright 还支持了几个新的伪类
# :has 表示包含某个元素的元素
page.click("article:has(div.prome)")
# :is 用来对自身做断言
page.click("button:is(:text('sign in'), :text('log in'))")
# :text 表示包含某个文本的元素
page.click("button:text('Sign in')") # 包含
page.click("button:text-is('Sign is')") # 严格匹配
page.click("button:text-matches('\w+')") # 正则
# 还可以根据方位匹配
page.click("button:right-of(#search)") # 右边
page.click("button:left-of(#search)") # 左边
page.click("button:above(#search)") # 上边
page.click("button:below(#search)") # 下边
page.click("button:near(#search)") # 50px 之内的元素# 通过 XPath 选择
page.click("//button[@id='search'])")
# 所有 // 或者 .. 开头的表达式都会默认为 XPath 表达式
4. 命令行工具
4.1 codegen
重头戏来了。
codegen 是懒人福音。通过记录用户操作自动生成代码括弧笑。
4.1.1 基础用法
自动打开一个记录窗口、一个浏览器窗口,并访问某度:
playwright codegen /
进阶玩法,指定生成代码的语言,自动把生成的代码保存为 baidu_test.py,并指定浏览器内核。
其实不用这么复杂,记录窗口上可以直接操作生成的代码:)
playwright codegen --target python -o baidu_test.py -b chromium /
4.1.2 进阶操作
4.1.2.1 保留认证状态
需要登录的那些货,颤抖吧!
使用 --save-storage
参数指定文件名,可以保存网站的 cookie 和 localStorage 以便将来复用:
playwright codegen --save-storage=auth.json
重用:
playwright open --load-storage=auth.json my.web.app
playwright codegen --load-storage=auth.json my.web.app
4.2 open
4.2.1 用不同的内核打开
# Open page in WebKit
playwright wk example
4.2.2 模拟设备
模拟爱疯 11:
# Emulate iPhone 11.
playwright open --device="iPhone 11" /
模拟色彩模式和网页视口大小:
# Emulate screen size and color scheme.
playwright open --viewport-size=800,600 --color-scheme=dark /
模拟地理位置、语言和时区,牛哔(破音):
# Emulate timezone, language & location
# 页面打开后,点击“我的位置”(意大利语),官方例子定位在罗马斗兽场……
playwright open --timezone="Europe/Rome" --geolocation="41.890221,12.492348" --lang="it-IT" /
4.3 选择器
使用 open
或 codegen
期间(codegen 要先取消录制模式),可以 F12
打开开发人员工具,在 console
窗口输入选择器选择页面元素:
常用选择器:
playwright.$(selector)
:基本选择器,选择符合的第一个元素playwright.$$(selector)
:与基本选择器一致,返回所有匹配的对象playwright.inspect(selector)
:在元素(Elements)窗口中查看元素,如果开发人员工具支持playwright.selector(element)
:从给定的元素生成选择器
4.4 网页截屏
# See command help
playwright screenshot --help
# Wait 3 seconds before capturing a screenshot after page loads ('load' event fires)
playwright screenshot \--device="iPhone 11" \--color-scheme=dark \--wait-for-timeout=3000 \twitter twitter-iphone.png
# Capture a full page screenshot
playwright screenshot --full-page /python/docs/cli doc-full.png
4.5 生成 PDF
只有无头 Chromium 可以生成 PDF 文件。
# See command help
playwright pdf wiki.pdf
5. 获取百度首页链接的代码
from playwright.sync_api import sync_playwrightURI = '/'def get_links(uri):with sync_playwright() as p:browser = p.chromium.launch(headless=True)page = browser.new_page()page.goto(uri)all_links = page.query_selector_all('a')for i in all_links:print(f'Link name : {i.inner_text()}', end='\t')print(f'addr : {i.get_attribute("href")}')browser.close()returnget_links(URI)
先这样吧,挺有意思。
更多推荐
浏览器自动化测试工具 Playwright 简介,再见 Selenium,虽然我依然爱你
发布评论