UI自动化-Playwright - 图1
Playwright 是微软在 2020 年初开源的新一代自动化测试工具,它的功能类似于 Selenium、Pyppeteer 等,都可以驱动浏览器进行各种自动化操作。它的功能也非常强大,对市面上的主流浏览器都提供了支持,API 功能简洁又强大。虽然诞生比较晚,但是现在发展得非常火热。

自动化测试

UI自动化

侧重于页面操作,模拟用户的真实行为,不过容易受其他原因影响(浏览器卡顿、网络卡顿、电脑卡顿)导致脚本执行失败,且依赖于界面的稳定。
基本流程:

  • 进行元素定位
  • 模拟手动操作
  • 输入测试数据
  • 获取输出结果

    接口自动化

    侧重于业务流程串联,较适用于全流程的回归测试和冒烟测试,也可形成造数平台。
    基本流程:

  • 模拟发送请求

  • 传入接口参数
  • 获取响应结果

    对比Selenium

    Selenium

    优势:上手很快,使用者广泛,社区活跃,遇到问题随时可以找到一大堆相关的网页给你提供帮助。
    弊端:
  1. 依赖多种不同的driver,需手动下载,浏览器的不断更新,就要不断去维护这些driver,以及处理相应的适用性问题。
  2. 稳定性不够好。Selenium本身提供的方法,并不能保证test case稳定通过,因为element状态有时候并不可用,这个时候的actions肯定会有问题。只能加入一些等待,甚至是元素状态轮询判断,但是稳定性增加的同时,运行时间也同时大幅增加。
  3. 录制代码不稳定。因为Selenium IDE录制的代码是基于coordinate 或者DOM 层级结构,所以极其不稳定,也就导致IDE基本无人问津。

    Playwright特点

  4. 自动下载Chromium,Firefox和WebKit,单个API可自动执行Chromium,Firefox和WebKit。

  5. 页面操作自动等待机制。
  6. 录制浏览器操作并自动生成代码,极大减少编码时间。
  7. 支持无头浏览器模式,可在无头有头之间自由切换。
  8. 可拦截网络请求与响应。
  9. 单个浏览器实例可以创建多个隔离的浏览器上下文。

    Playwright特性

    支持所有浏览器

  • 在Chromium, Firefox 和 WebKit上运行测试:Google Chrome和Microsoft Edge都是基于Chromium项目,Apple Safari基于WebKit,还有Mozilla 的Firefox。

from playwright.sync_api import Playwright, sync_playwright
def run(playwright: Playwright) -> None:
browser = playwright.chromium.launch(headless=False)
# browser = playwright.firefox.launch(headless=False)
# browser = playwright.webkit.launch(headless=False)
context = browser.new_context(record_video_dir=”./videos”)

# Open new page
page = context.new_page()

# Go to http://www.baidu.com/
page.goto(“http://www.baidu.com/“)

# ——————————-
context.close()
browser.close()

模拟移动端

  • 通过设置驱动模式可以模拟移动浏览器的效果。

from playwright.sync_api import sync_playwright
with sync_playwright() as p:
iphone = p.devices[‘iPhone 12 Pro Max’]
browser = p.webkit.launch(headless=False)
context = browser.new_context(**iphone, locale=’zh-CN’, record_video_dir=”./videos”)
page = context.new_page()
page.goto(‘https://www.baidu.com‘)
page.wait_for_load_state(state=’networkidle’)
page.screenshot(path=’browser-iphone.png’)
browser.close()
暂时无法在文档外展示此内容

Headless 和 Headful

  • Headful非常适合调试。Headless运行更快,也可以更方便的在CI/云平台上运行。

browser = playwright.chromium.launch(headless=False)

录制脚本

  • 通过codegen录制,自动生成代码,极大的减少编码时间。
  • 很方便的获取元素定位。

暂时无法在文档外展示此内容

元素自动等待

  • 对元素执行前,会进行一系列可操作性检查,以确保这些行动按预期运行。它会自动等待所有相关检查通过,然后才执行请求的操作。如果所需的检查未在给定的范围内通过则抛出timeout,操作将失败并显示TimeoutError。

鼠标点击
page.click(“#header >> text=Sign in”)
#内容填充
page.locator(“input[name=\”email\”]”)fill(“xxxx@anker-in.com”)
#鼠标放在按钮上,此方法针对那种浮框操作
page.hover(“text=Login Sign in / Sign up Order Track Get $40”)
# 获取元素并聚焦它。 如果没有匹配的元素,则方法等待匹配元素出现在 DOM 中。
page.focus(‘#su’)

浏览器上下文并行

  • 比如第一条用例在第一个page执行了登录,第二条用例通过浏览器上下文创建一个新的page去执行登录之后的功能,即保证了用例的相对独立性,又减少了用例的重复操作。

实战:Playwright + Pytest

参考资料:
集成框架:https://github.com/tomoyachen/playwright-test
playwright官方手册:https://playwright.dev/python/docs/intro

这个框架能做什么?

  • Playwright负责UI层操作,Pytest负责用例执行,加上Pytest丰富的第三方插件,加强可扩展性。
  • 抽取数据层、page层、testcase层,可维护性强。
  • 抽取公共函数,适应分层思想,分工协作。

    框架目录结构

    UI自动化-Playwright - 图2

    安装

    clone 或 下载

    clone 项目
    git clone https://github.com/tomoyachen/playwright-test.git

    安装依赖

    本地安装 poetry
    pip install poetry

    # 创建虚拟环境并安装依赖 (在项目根目录执行)
    poetry install

    # PlayWright 安装浏览器驱动
    poetry run playwright install
    避坑指南:

  • Python 装3.9的

  • poetry install 安装的依赖需更新至最新版本

    Tips

  1. 页面操作放在page目录下,page下的类名和方法名没有要求;
  2. 测试用例放在testcase目录下,测试用例文件名格式:xxxtest.py,测试用例类名格式:*Test,测试用例方法名格式:test*;
  3. 测试数据放在fixtures/dev目录下,使用pytest的fixture机制读取就行;
  4. url环境信息放在config目录下;
  5. 公共函数放在common/tools.py文件;
  6. 默认是浏览器方式执行,如需无头浏览器方式执行,删除pytest.ini文件里的—headed,然后命令行执行pytest XXX_test.py -s -v;

    实战1: mulpass登录

    Anker账号登录

    UI自动化-Playwright - 图3
    暂时无法在文档外展示此内容

    Google登录

    UI自动化-Playwright - 图4
    暂时无法在文档外展示此内容

    Facebook登录

    暂时无法在文档外展示此内容

    移动端登录

    from playwright.sync_api import sync_playwright, BrowserType
    @pytest.fixture(scope=”class”, autouse=True)
    def context(
    playwright: sync_playwright(),
    browser_type: BrowserType,
    browser_type_launch_args: Dict,
    browser_context_args: Dict
    ):
    browser_context_args = playwright.devices[‘iPhone 12 Pro Max’]
    context = browser_type.launch_persistent_context(“./foobar”, {
    browser_type_launch_args,
    **browser_context_args,
    “locale”: “zh-CN”
    })
    yield context
    context.close()
    暂时无法在文档外展示此内容

    实战2:购物车添加/删除

    暂时无法在文档外展示此内容

    后续计划

  • UI自动化覆盖核心官网流程,提升回归测试效率
  • jenkins集成,定时构建,及时发现问题
  • 丰富测试报告,邮件发送