python+playwright 学习-10.pytest-playwright插件编写测试用例
前言
pytest-playwright插件完美的继承了pytest 用例框架和playwright基础使用的封装,基本能满足工作中的常规需求了,不需要我们再做额外的插件开发。
pytest-playwright 环境准备
Playwright 建议使用官方的 pytest-playwright 插件来编写端到端测试。它提供上下文隔离,开箱即用地在多个浏览器配置上运行。或者,您可以使用该库使用您喜欢的测试运行程序手动编写测试基础设施。Pytest 插件使用 Playwright 的同步版本,还有一个可通过库访问的异步版本。
开始安装 Playwright 并运行示例测试以查看它的实际效果。
pip install pytest-playwright
安装所需的浏览器:
playwright install
仅需这一步即可安装所需的浏览器,并且不需要安装驱动包了,解决了selenium启动浏览器,总是要找对应驱动包的痛点。
快速开始
test_my_application.py 使用以下代码在当前工作目录或子目录中创建一个文件:
import re
from playwright.sync_api import Page, expect
# 上海悠悠 wx:283340479
# blog:https://www.cnblogs.com/yoyoketang/def test_homepage(page: Page):page.goto("https://playwright.dev/")# Expect a title "to contain" a substring.expect(page).to_have_title(re.compile("Playwright"))# create a locatorget_started = page.get_by_role("link", name="Get started")# Expect an attribute "to be strictly equal" to the value.expect(get_started).to_have_attribute("href", "/docs/intro")# Click the get started link.get_started.click()# Expects the URL to contain intro.expect(page).to_have_url(re.compile(".*intro"))
默认情况下,测试将在 chromium 上运行。这可以通过 CLI 选项进行配置。
测试以无头模式运行,这意味着在运行测试时不会打开浏览器 UI。测试结果和测试日志将显示在终端中。
>pytest test_my_application.py
=========== test session starts ==============
platform win32 -- Python 3.8.5, pytest-7.2.1, pluggy-1.0.0
rootdir: D:\demo\play_web\cases
plugins: base-url-2.0.0, playwright-0.3.0
collected 1 item test_my_application.py . [100%]============ 1 passed in 2.40s ===
如果想看到打开的浏览器运行,可以加上--headed
参数
>pytest test_my_application.py --headed
编写用例
Playwright 提供了expect
将等待直到满足预期条件的功能。
import re
from playwright.sync_api import expectexpect(page).to_have_title(re.compile("Playwright"))
定位器是 Playwright 自动等待和重试能力的核心部分。定位器代表了一种随时在页面上查找元素的方法,并用于对诸如.click .filletc之类的元素执行操作。
from playwright.sync_api import expectget_started = page.get_by_role("link", name="Get started")expect(get_started).to_have_attribute("href", "/docs/installation")
get_started.click()
Playwright Pytest 插件基于测试装置的概念,例如传递到您的测试中的内置页面装置。
由于浏览器上下文,页面在测试之间被隔离,这相当于一个全新的浏览器配置文件,每个测试都会获得一个全新的环境,即使在单个浏览器中运行多个测试也是如此。
from playwright.sync_api import Pagedef test_basic_test(page: Page):# ...
您可以使用各种 fixture 在测试之前或之后执行代码,并在它们之间共享对象。
例如,具有自动使用 function 作用域的 fixture 类似于 beforeEach/afterEach。
具有module自动使用功能的作用域fixture的行为类似于 beforeAll/afterAll
,它在所有测试之前和之后运行。
import pytest
from playwright.sync_api import Page@pytest.fixture(scope="function", autouse=True)
def before_each_after_each(page: Page):print("beforeEach")# Go to the starting url before each test.page.goto("https://playwright.dev/")yieldprint("afterEach")def test_main_navigation(page: Page):# Assertions use the expect API.expect(page).to_have_url("https://playwright.dev/")
运行测试用例
您可以运行单个测试、一组测试或所有测试。测试可以在一个浏览器或多个浏览器上运行。
默认情况下,测试以无头方式运行,这意味着在运行测试时不会打开浏览器窗口,并且会在终端中看到结果。如果您愿意,可以使用–headed标志以引导模式运行测试。
默认在 Chromium 上运行测试
pytest
运行单个测试文件
pytest test_login.py
运行一组测试文件
pytest tests/todo-page/ tests/landing-page/
使用函数名运行测试
pytest -k "test_add_a_todo_item"
在引导模式下运行测试
pytest --headed test_login.py
在特定浏览器上运行测试
pytest test_login.py --browser webkit
在多个浏览器上运行测试
pytest test_login.py --browser webkit --browser firefox
如果您的测试在具有大量 CPU 的机器上运行,您可以通过使用pytest-xdist一次运行多个测试来加快测试套件的整体执行时间:
# install dependency
pip install pytest-xdist
# use the --numprocesses flag
pytest --numprocesses auto
根据测试的硬件和性质,您可以设置numprocesses为从2机器上的 CPU 数量到 CPU 数量之间的任何值。如果设置得太高,您可能会注意到意外行为。
Pytest 插件参考
Playwright 提供了一个Pytest插件来编写端到端测试。要运行测试,请使用Pytest CLI。
pytest --browser webkit --headed
如果你想自动添加 CLI 参数而不指定它们,你可以使用pytest.ini文件:
CLI 相关参数
--headed
:以有头模式运行测试(默认:无头)。
--browserchromium
:在不同的浏览器、firefox或中运行测试webkit。它可以指定多次(默认值:)chromium。
--browser-channel
要使用的浏览器通道。
--slowmo
使用慢动作运行测试。
--device
要模拟的设备。
--output
测试生成的工件目录(默认值:)test-results。
--tracing
是否为每个测试记录轨迹。on、off或retain-on-failure(默认值:off)。
--video
是否为每次测试录制视频。on、off或retain-on-failure(默认值:off)。
--screenshot
是否在每次测试后自动捕获屏幕截图。on、off或only-on-failure(默认值:off)。
内置fixture
Function scope::
这些固定装置在测试功能中请求时创建,并在测试结束时销毁。
- context:用于测试的新浏览器上下文。
- page:用于测试的新浏览器页面。
Session scope:
这些固定装置在测试函数中请求时创建,并在所有测试结束时销毁。
- playwright:playwright实例。
- browser_type:当前浏览器的BrowserType实例。
- browser:由 Playwright 启动的浏览器实例。
- browser_name: 浏览器名称作为字符串。
- browser_channel: 浏览器通道作为字符串。
- is_chromium, is_webkit, is_firefox: 相应浏览器类型的布尔值。
自定义fixture选项
对于browser和context ,使用以下fixture来定义自定义启动选项。
- browser_type_launch_args:覆盖browser_type.launch()的启动参数。它应该返回一个字典。
- browser_context_args:覆盖browser.new_context()的选项。它应该返回一个字典。
编写用例示例
写个简单的用例
# test_my_application.py
from playwright.sync_api import Pagedef test_visit_admin_dashboard(page: Page):page.goto("/admin")# ...
使用带有–slowmo参数的 slow mo 运行测试。
pytest --slowmo 100
skip 某个浏览器
# test_my_application.py
import pytest@pytest.mark.skip_browser("firefox")
def test_visit_example(page):page.goto("https://example.com")# ...
在指定浏览器上运行
# conftest.py
import pytest@pytest.mark.only_browser("chromium")
def test_visit_example(page):page.goto("https://example.com")# ...
指定浏览器
pytest --browser-channel chrome
# test_my_application.py
def test_example(page):page.goto("https://example.com")
配置base-url
使用base-url参数启动 Pytest。该pytest-base-url插件用于允许您从配设置基本 url。
# test_my_application.py
def test_visit_example(page):page.goto("/admin")# -> Will result in http://localhost:8080/admin
运行
pytest --base-url http://localhost:8080
其它
忽略https 错误
# conftest.py
import pytest@pytest.fixture(scope="session")
def browser_context_args(browser_context_args):return {**browser_context_args,"ignore_https_errors": True}
自定义浏览器窗口大小
# conftest.py
import pytest@pytest.fixture(scope="session")
def browser_context_args(browser_context_args):return {**browser_context_args,"viewport": {"width": 1920,"height": 1080,}}
设置手机设备
# conftest.py
import pytest@pytest.fixture(scope="session")
def browser_context_args(browser_context_args, playwright):iphone_11 = playwright.devices['iPhone 11 Pro']return {**browser_context_args,**iphone_11,}
或者通过 CLI指定参数--device="iPhone 11 Pro"
持久的 context
# conftest.py
import pytest
from playwright.sync_api import BrowserType
from typing import Dict@pytest.fixture(scope="session")
def context(browser_type: BrowserType,browser_type_launch_args: Dict,browser_context_args: Dict
):context = browser_type.launch_persistent_context("./foobar", **{**browser_type_launch_args,**browser_context_args,"locale": "de-DE",})yield contextcontext.close()
使用它时,测试中的所有页面都是从持久上下文创建的
python+playwright 学习-10.pytest-playwright插件编写测试用例相关推荐
- 「高效程序员的修炼」快速上手python主流测试框架pytest以及单元测试编写
如果对你有帮助,就点个赞吧~ 本文主要介绍如果编写Python的单元测试,包括如何使用断言,如何考虑测试哪些情况,如何避免外部依赖对测试的影响,如果用数据驱动的方式简化重复测试的编写等等等等 文章目录 ...
- Python快速学习10: 循环的对象及设计 (生活的规律)
正文 循环对象的并不是随着Python的诞生就存在的,但它的发展迅速,特别是Python 3x的时代,循环对象正在成为循环的标准形式. 灵活的循环方式 (我晚饭后爱上了萨克斯,因为这是生活的一部分.属 ...
- Python 入门学习10 —— 文件操作的应用及升级版三级菜单
一.文件操作的基本流程 open( ) open( ) 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError. open(f ...
- python爬虫学习(10) —— 专利检索DEMO
这是一个稍微复杂的demo,它的功能如下: 输入专利号,下载对应的专利文档 输入关键词,下载所有相关的专利文档 0. 模块准备 首先是requests,这个就不说了,爬虫利器 其次是安装tessera ...
- python+playwright 学习-1.环境准备与快速开始
前言 说到 web 自动化,大家最熟悉的就是 selenium 了,selenium 之后又出现了三个强势的框架Puppeteer.CyPress.TestCafe, 但这3个都需要掌握 JavaSc ...
- python+playwright 学习-32 启动Google Chrome 或 Microsoft Edge浏览器
前言 playwright 默认会下载 chromium,firefox 和 webkit 三个浏览器,目前支持通过命令下载的浏览器有:chromium.chrome.chrome-beta.msed ...
- Python自动化——pytest常用插件详解
前言 Pytest是Python的一种单元测试框架,与unittest相比,使用起来更简洁.效率更高,也是目前大部分使用python编写测试用例的小伙伴们的第一选择了. 除了框架本身提供的功能外,Py ...
- Pytest自动化测试框架教程17-安装和使用插件编写
安装和使用插件 本节讨论如何安装和使用第三方插件.有关编写自己的插件的信息,请参阅编写插件. 安装第三方插件可以通过以下方式轻松完成pip: Copypip install pytest-NAME p ...
- 自学python网站推荐-给初学者推荐的10个Python免费学习网站!赶紧收藏吧!
如今,Python 已经成为一种再主流不过的编程语言了.它天生丽质,易于读写,非常实用,从而赢得了广泛的群众基础,被誉为"宇宙最好的编程语言",被无数程序员热烈追捧.许多程序员都把 ...
最新文章
- java自定义findbugs规则_静态代码扫描 (三)——FindBugs 自定义规则入门
- mysql 权限命令 revoke_mysql 权限管理使用 grant/revoke
- 数学入门题——《算法竞赛入门经典-训练指南》
- git 中文乱码配置
- ct图像去噪 matlab,NSCT 图像去噪 matlab
- sqlserver 建表指定主键_3-自增字段;主键约束
- java 同步和异步_知道什么叫同步和异步吗?
- 嵌入式Linux学习笔记(1)开篇
- Hive之窗口函数(一文搞懂)
- 游戏服务器高性能设计-游戏设计与开发(3)
- 沈阳大学专升本计算机宿舍,沈阳大学宿舍怎么样 住宿条件好不好
- windows7系统:基本安装,U盘启动盘制作与安装,网络安装
- C语言程序设计(十七)12.12
- java系统化基础-day01-基础语法知识
- wireshark使用
- linux 分区 intel raid,linux on intel sata raid
- 黄金分割法 ( 三分法 )
- 2D草图实时3D建模,可跑可跳无需手动绑定骨骼丨开源
- 输入一行字符,分别统计出其中的英文字母大写小写、空格、数字和其它字符的个数。
- 有限体积法(11)——交错网格
热门文章
- java 持久层框架排行_2020年,java持久层怎么选择?
- 基于生态系统服务(InVEST模型)的人类活动、重大工程生态成效评估、论文写作等具体应用
- 【历史上的今天】2 月 5 日:雅达利创始人出生;改变战争命运的 Colossus 计算机问世;希捷收购康纳外设
- 术业有专攻,越专业越值钱
- 联合概率及其分布、边缘概率及其分布、条件概率及其分布和贝叶斯定理
- 微信小程序内嵌webview实现微信登录
- Altium Designe 智能PDF无法导出高清PDF问题解决方法
- 运维程序员入门指南:运维职责和分类划分详解
- 一文了解WebSocket(实战)----python篇
- 我国高等教育经费困境及其求解