功能与竞品对比
web 自动化测试, 是指 用运行代码的方式, 在浏览器中操作网页, 解放双手与眼睛. 可以用来做
- 自己网页的测试验收
- 办公自动化, 比如把 excel 中的信息录入到 web系统.
- 外挂, 抢票什么的.
Q:为什么不直接用 http 框架完成以上任务?
A: 用户操作的网页并不是 http 请求返回的 原始 html, 而是经过了 js在浏览器中的运行, 被修改后的 html. 所以我们需要真实的 浏览器环境.
selenium 是经典的存在, playwright 是近几年才推出的.
python下的安装使用
playwright 是用 js (type script) 开发的, 但也提供了 python 语言接口.
# 安装 playwright 库
pip install pytest-playwright
# 安装 chrome 浏览器及配套driver等, 注意 install 后没有宾语, 就是看起来较别扭.
playwright install
常用api
playwright -> browser -> context -> page 的流程是模板化的, 业务逻辑主要在 元素选择,动作触发, 信息回收上.
图像截屏
page.screenshot(path='xx.png')
Locator & selector
页面中的元素定位是自动化的核心, 对应的就是 Page.locator(selector:str)-> Locator
.
selector 有多种使用风格, 最常用的就是 css 选择器. 详见参考[3]. 因为 css 是业界标准, playwright 没有赘述, 所以可去 参考[4] 作语法学习.
图: 在此列出部分语法
测试例子
使用 测试组件, assert 等.
todo.
仿真例子
import time
from playwright.sync_api import Playwright, sync_playwright, expect
def run(playwright: Playwright) -> None:
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
# Open new page
page = context.new_page()
page.goto("https://www.baidu.com")
time.sleep(3)
# ---------------------
context.close()
browser.close()
with sync_playwright() as playwright:
run(playwright)
脚本录制
用户使用键鼠在浏览器上操作网页, 这些步骤由 playwright 转译为 py脚本. 往后运行转译后的脚本, 就得到了等价的操作.python -m playwright codegen --target python -o '脚本录制.py' -b chromium https://www.baidu.com
使用场景: 相比从空白源文件从头自己写, 转录后再二次开发, 代码量大为减少.
表单控件输入
input 的常见 type 及 属性搭配, 见 参考[5].
文本框
page.locator("input[name=\"问候语\"]").fill("你好呀")
单选按钮与复选框
page.locator("#RadioButtonRLEye_1").check()
下拉列表
page.locator("select[name=\"DropDownKIndex\"]").select_option("1.3315")
按钮点击
page.locator("#button_id").click()
等待与时机
一般地, 页面控件操作要等待网页加载完毕后才进行. 但网页的完全加载很复杂, {css,js,picture} 都要处理. 特别是有些js资源需要从境外的 google.com 加载,过于缓慢,但它并不影响控件操作, 怎么跳过这样的等待呢? 可以结合 page.goto(wait_until='domcontentloaded')
与 page.wait_for_selector("#控件id")
二者使用. 前者可以绕过 <script async>
这样的资源等待, 后者可以等待至目标元素渲染完成.
page.goto(self, url: str, *, timeout: float = None, wait_until:str=load)
wait_until 参数就是用来控制等待时机的. 上述场景下可以选dom content loaded
.'domcontentloaded'
- consider operation to be finished when theDOMContentLoaded
event is fired.'load'
- consider operation to be finished when theload
event is fired.'networkidle'
- consider operation to be finished when there are no network connections for at least500
ms.'commit'
- consider operation to be finished when network response is received and the document started loading.
参考
- playwright, 官方文档
- playwright教程, 表单输入
- playwright教程, css selector
- 菜鸟教程, css selectors
- my blog, html 表单控件