功能与竞品对比

web 自动化测试, 是指 用运行代码的方式, 在浏览器中操作网页, 解放双手与眼睛. 可以用来做

  1. 自己网页的测试验收
  2. 办公自动化, 比如把 excel 中的信息录入到 web系统.
  3. 外挂, 抢票什么的.

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] 作语法学习.

手机浏览器自动化python_css


图: 在此列出部分语法

测试例子

使用 测试组件, 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 the DOMContentLoaded event is fired.
    • 'load' - consider operation to be finished when the load event is fired.
    • 'networkidle' - consider operation to be finished when there are no network connections for at least 500 ms.
    • 'commit' - consider operation to be finished when network response is received and the document started loading.

参考

  1. playwright, 官方文档
  2. playwright教程, 表单输入
  3. playwright教程, css selector
  4. 菜鸟教程, css selectors
  5. my blog, html 表单控件