python中playwright结合pytest执行用例的实现
作者:一名小测试 发布时间:2022-12-13 14:28:58
目录
安装pytest插件
编写测试用例
忽略 HTTPS 错误和设置自定义视口大小
持久上下文
playwright结合Pytest为您的 Web 应用程序编写端到端的测试。
安装pytest插件
C:\Users\lifeng01>pip install pytest-playwright
Collecting pytest-playwright
Using cached pytest_playwright-0.2.2-py3-none-any.whl (9.8 kB)
Requirement already satisfied: pytest in d:\python\python37\lib\site-packages (from pytest-playwright) (6.2.5)
Requirement already satisfied: playwright>=1.13 in d:\python\python37\lib\site-packages (from pytest-playwright) (1.17.0)
Requirement already satisfied: python-slugify in d:\python\python37\lib\site-packages (from pytest-playwright) (5.0.2)
Requirement already satisfied: pytest-base-url in d:\python\python37\lib\site-packages (from pytest-playwright) (1.4.2)
Requirement already satisfied: typing-extensions in d:\python\python37\lib\site-packages (from playwright>=1.13->pytest-playwright) (3.7.4.3)
Requirement already satisfied: pyee>=8.0.1 in d:\python\python37\lib\site-packages (from playwright>=1.13->pytest-playwright) (8.2.2)
Requirement already satisfied: websockets>=8.1 in d:\python\python37\lib\site-packages (from playwright>=1.13->pytest-playwright) (9.1)
Requirement already satisfied: greenlet>=1.0.0 in d:\python\python37\lib\site-packages (from playwright>=1.13->pytest-playwright) (1.0.0)
Requirement already satisfied: atomicwrites>=1.0 in d:\python\python37\lib\site-packages (from pytest->pytest-playwright) (1.3.0)
Requirement already satisfied: attrs>=19.2.0 in d:\python\python37\lib\site-packages (from pytest->pytest-playwright) (19.3.0)
Requirement already satisfied: py>=1.8.2 in d:\python\python37\lib\site-packages (from pytest->pytest-playwright) (1.9.0)
Requirement already satisfied: toml in d:\python\python37\lib\site-packages (from pytest->pytest-playwright) (0.10.0)
Requirement already satisfied: colorama in d:\python\python37\lib\site-packages (from pytest->pytest-playwright) (0.4.3)
Requirement already satisfied: pluggy<2.0,>=0.12 in d:\python\python37\lib\site-packages (from pytest->pytest-playwright) (0.13.1)
Requirement already satisfied: packaging in d:\python\python37\lib\site-packages (from pytest->pytest-playwright) (20.9)
Requirement already satisfied: importlib-metadata>=0.12 in d:\python\python37\lib\site-packages (from pytest->pytest-playwright) (1.7.0)
Requirement already satisfied: iniconfig in d:\python\python37\lib\site-packages (from pytest->pytest-playwright) (1.0.1)
Requirement already satisfied: requests>=2.9 in d:\python\python37\lib\site-packages (from pytest-base-url->pytest-playwright) (2.25.0)
Requirement already satisfied: text-unidecode>=1.3 in d:\python\python37\lib\site-packages (from python-slugify->pytest-playwright) (1.3)
Requirement already satisfied: zipp>=0.5 in d:\python\python37\lib\site-packages (from importlib-metadata>=0.12->pytest->pytest-playwright) (3.1.0)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in d:\python\python37\lib\site-packages (from requests>=2.9->pytest-base-url->pytest-playwright) (1.26.2)
Requirement already satisfied: certifi>=2017.4.17 in d:\python\python37\lib\site-packages (from requests>=2.9->pytest-base-url->pytest-playwright) (2020.4.5.1)
Requirement already satisfied: idna<3,>=2.5 in d:\python\python37\lib\site-packages (from requests>=2.9->pytest-base-url->pytest-playwright) (2.9)
Requirement already satisfied: chardet<4,>=3.0.2 in d:\python\python37\lib\site-packages (from requests>=2.9->pytest-base-url->pytest-playwright) (3.0.4)
Requirement already satisfied: pyparsing>=2.0.2 in d:\python\python37\lib\site-packages (from packaging->pytest->pytest-playwright) (2.4.7)
Installing collected packages: pytest-playwright
Successfully installed pytest-playwright-0.2.2
编写测试用例
import pytest
from playwright.sync_api import Page
def test_baidu_com(page: Page):
page.goto("https://www.baidu.com")
# xpath定位输入框,输入文本内容
page.fill('//*[@id="kw"]', "秦时明月")
# css点位点击“百度一下”按钮
page.click('#su')
# 打印title名称
print(page.title)
if __name__ == '__main__':
pytest.main(["-v", "test_baidu_example.py"])
名词解释:
test_baidu_com(page: Page):自动完成配置类型 ( page是pytest_playwright插件提供的一个夹函数,page指定到类型为Page,Page是playwright库提供的一个类,page指定类型为Page就可以调用Page类中的一些列方法 )
命令行输入命令执行:
PS F:\project_gitee\Test\playwrightProject\cases> pytest --browser chromium --video on
================================================================================== test session starts ==================================================================================
platform win32 -- Python 3.7.7, pytest-6.2.5, py-1.9.0, pluggy-0.13.1
rootdir: F:\project_gitee\Test\playwrightProject\cases
plugins: allure-pytest-2.9.43, anyio-3.3.4, base-url-1.4.2, clarity-1.0.1, cov-2.8.1, emoji-0.2.0, forked-1.3.0, html-3.1.1, lazy-fixture-0.6.3, metadata-1.11.0, pikachu-0.1.0, playwrigh
t-0.2.2, rerunfailures-9.1.1, xdist-2.2.1
collected 1 item
test_baidu_example.py . [100%]
=================================================================================== 1 passed in 1.97s ===================================================================================
命令行常用基础命令:
# 运行测试
pytest
# 开启页面运行
pytest --headed
# 指定浏览器运行
pytest --browser firefox
# 开启页面运行并指定浏览器运行
pytest --headed --browser firefox
# 指定两个浏览器运行,优先运行火狐再运行谷歌
pytest --browser firefox --browser chromium
# 使用浏览器频道,支持谷歌浏览器(我的电脑其他浏览器是报错的)
pytest --browser-channel chromium
# 用慢动作运行测试
pytest --slowmo 100
# 指定谷歌浏览器,开启记录每次测试的轨迹(生成一个.zip包,存放在test-results文件夹中)
pytest --browser chromium --tracing on(on:开;off:关)
# 指定谷歌浏览器,开启每次测试录制视频(生成一个.webm包,存放在test-results文件夹中)
pytest --browser chromium --video on(on:开;off:关)
# 指定谷歌浏览器,开启每次测试后是否自动截屏(生成一个.png图片,存放在test-results文件夹中)
pytest --browser chromium --screenshot on
通过浏览器跳过测试:
import pytest
from playwright.sync_api import Page
@pytest.mark.skip_browser("firefox")
def test_baidu_com(page: Page):
page.goto("https://www.baidu.com")
# xpath定位输入框,输入文本内容
page.fill('//*[@id="kw"]', "秦时明月")
# css点位点击“百度一下”按钮
page.click('#su')
# 打印title名称
print(page.title)
if __name__ == '__main__':
pytest.main(["-v", "test_baidu_example.py"])
在特定浏览器上运行:
import pytest
from playwright.sync_api import Page
@pytest.mark.only_browser("chromium")
def test_baidu_com(page: Page):
page.goto("https://www.baidu.com")
# xpath定位输入框,输入文本内容
page.fill('//*[@id="kw"]', "秦时明月")
# css点位点击“百度一下”按钮
page.click('#su')
# 打印title名称
print(page.title)
if __name__ == '__main__':
pytest.main(["-v", "test_baidu_example.py"])
忽略 HTTPS 错误和设置自定义视口大小
第一种是写在conftest.py中,然后直接运行测试用例:
# conftest.py
import pytest
@pytest.fixture(scope="session")
def browser_context_args(browser_context_args):
return {
**browser_context_args,
"ignore_https_errors": True,
}
@pytest.fixture(scope="session")
def browser_context_args(browser_context_args):
return {
**browser_context_args,
"viewport": {
"width": 1920,
"height": 1080,
}
}
测试用例写法如下(最好这样写,不然运行就报错,作者已采坑):
import pytest
from playwright.sync_api import Page
def test_example(page: Page):
page.goto("http://www.baidu.com")
assert page.title() == "百度一下,你就知道"
page.close()
if __name__ == '__main__':
pytest.main(["-v", "test_example.py"])
命令行运行测试用例:
PS F:\project_gitee\Test\playwrightProject\cases> pytest --headed --browser chromium
================================================================================== test session starts ==================================================================================
platform win32 -- Python 3.7.7, pytest-6.2.5, py-1.9.0, pluggy-0.13.1
rootdir: F:\project_gitee\Test\playwrightProject\cases
plugins: allure-pytest-2.9.43, anyio-3.3.4, asyncio-0.16.0, base-url-1.4.2, clarity-1.0.1, cov-2.8.1, emoji-0.2.0, forked-1.3.0, html-3.1.1, lazy-fixture-0.6.3, metadata-1.11.0, pikachu-
0.1.0, playwright-0.2.2, rerunfailures-9.1.1, xdist-2.2.1
collected 1 item
test_example.py . [100%]
=================================================================================== 1 passed in 2.39s ===================================================================================
第二种是直接在用例中增加指定参数即可:
import pytest
from playwright.sync_api import sync_playwright
def test_example():
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_context(
ignore_https_errors=True,
viewport={
"width": 1920,
"height": 1040,
}
)
page = page.new_page()
page.goto("http://www.baidu.com")
assert page.title() == "百度一下,你就知道"
browser.close()
if __name__ == '__main__':
pytest.main(["-v", "test_example.py"])
名词解释:
p.chromium.launch(headless=False):headless=False是开启有页面运行(默认是True,也就是无头浏览器)
第三种是模拟手机浏览器
# 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,
}
测试用例写法如下(最好这样写,不然运行就报错,作者已采坑):
import pytest
from playwright.sync_api import Page
def test_example(page: Page):
page.goto("http://www.baidu.com")
assert page.title() == "百度一下,你就知道"
page.close()
if __name__ == '__main__':
pytest.main(["-v", "test_example.py"])
命令行运行测试用例:
PS F:\project_gitee\Test\playwrightProject\cases> pytest --headed --browser chromium
================================================================================== test session starts ==================================================================================
platform win32 -- Python 3.7.7, pytest-6.2.5, py-1.9.0, pluggy-0.13.1
rootdir: F:\project_gitee\Test\playwrightProject\cases
plugins: allure-pytest-2.9.43, anyio-3.3.4, asyncio-0.16.0, base-url-1.4.2, clarity-1.0.1, cov-2.8.1, emoji-0.2.0, forked-1.3.0, html-3.1.1, lazy-fixture-0.6.3, metadata-1.11.0, pikachu-
0.1.0, playwright-0.2.2, rerunfailures-9.1.1, xdist-2.2.1
collected 1 item
test_example.py F [100%]
======================================================================================= FAILURES ========================================================================================
________________________________________________________________________________ test_example[chromium] _________________________________________________________________________________
page = <Page url='https://m.baidu.com/?from=844b&vit=fps'>
def test_example(page: Page):
page.goto("http://www.baidu.com")
> assert page.title() == "百度一下,你就知道"
E AssertionError: assert '百度一下' == '百度一下,你就知道'
E - 百度一下,你就知道
E + 百度一下
test_example.py:15: AssertionError
================================================================================ short test summary info ================================================================================
FAILED test_example.py::test_example[chromium] - AssertionError: assert '百度一下' == '百度一下,你就知道'
=================================================================================== 1 failed in 3.14s ===================================================================================
这里运行后,打开的web页面,是一个手机形状的页面,仿的是手机浏览器(代码中指定的是iPhone 11 Pro)
持久上下文
它的意思就是打开一个web页面,会在这个web页面开多个新标签页面去执行测试用例。
例如:我有两个测试用例需要执行,如果使用持久上下文,就会打开一个web页面,然后web页面的第一个标签页运行第一个测试用例,第二个标签页运行第二个测试用例,直到把所有测试用例运行完了,关闭整个web页面,结束。
当然,如果你没有使用持久上下文,那就是打开web页面执行第一个测试用例,执行完第一个测试用例关闭web页面,然后再打开web页面执行第二个测试用例,执行完第二个测试用例关闭web页面,结束。
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("./data", **{
**browser_type_launch_args,
**browser_context_args,
"locale": "de-DE",
})
yield context
context.close()
名词解释:
./data用户数据目录的路径,它存储浏览器会话数据,如cookie和本地存储。
browser_type_launch_args如果没有设置值,返回的就是一个空字典;它里面的参数就是和p.chromium.launch()中的传参一致的,此处了解下,后面具体介绍。
browser_context_args如果没有设置值,返回的就是一个空字典;它里面的参数就和context = browser.new_context()中的传参一致的,此处了解下,后面具体介绍。
locale指定用户区域设置,例如' en-GB '、' de-DE '等。
命令行运行测试用例:
PS F:\project_gitee\Test\playwrightProject\cases> pytest --headed --browser chromium
================================================================================== test session starts ==================================================================================
platform win32 -- Python 3.7.7, pytest-6.2.5, py-1.9.0, pluggy-0.13.1
rootdir: F:\project_gitee\Test\playwrightProject\cases
plugins: allure-pytest-2.9.43, anyio-3.3.4, asyncio-0.16.0, base-url-1.4.2, clarity-1.0.1, cov-2.8.1, emoji-0.2.0, forked-1.3.0, html-3.1.1, lazy-fixture-0.6.3, metadata-1.11.0, pikachu-
0.1.0, playwright-0.2.2, rerunfailures-9.1.1, xdist-2.2.1
collected 2 items
test_baidu_example.py . [ 50%]
test_example.py . [100%]
=================================================================================== 2 passed in 3.12s ===================================================================================
必须知晓问题:
上述文章中的browser_type_launch_args和browser_context_args都是pytest_playwright插件提供的测试夹会话:
展示pytest_playwright插件部分源码:
@pytest.fixture(scope="session")
def browser_type_launch_args(pytestconfig: Any) -> Dict:
launch_options = {}
headed_option = pytestconfig.getoption("--headed")
if headed_option:
launch_options["headless"] = False
browser_channel_option = pytestconfig.getoption("--browser-channel")
if browser_channel_option:
launch_options["channel"] = browser_channel_option
slowmo_option = pytestconfig.getoption("--slowmo")
if slowmo_option:
launch_options["slow_mo"] = slowmo_option
return launch_options
@pytest.fixture(scope="session")
def browser_context_args(
pytestconfig: Any,
playwright: Playwright,
device: Optional[str],
) -> Dict:
context_args = {}
if device:
context_args.update(playwright.devices[device])
base_url = pytestconfig.getoption("--base-url")
if base_url:
context_args["base_url"] = base_url
video_option = pytestconfig.getoption("--video")
capture_video = video_option in ["on", "retain-on-failure"]
if capture_video:
context_args["record_video_dir"] = artifacts_folder.name
return context_args
到此这篇关于python中playwright结合pytest执行用例的实现的文章就介绍到这了,更多相关playwright pytest执行用例内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
来源:https://blog.csdn.net/LIFENG0402/article/details/121479494


猜你喜欢
- 在我之前解释了flask如何支持多线程主要通过两个类来实现,LocalStack和Local,在Local中有两个属性,__storage_
- 使用xlrd模块和xlwt模块解题思想:xlwt模块是非追加写.xls的模块,所以要借助for循环和列表,来一次性写入,这样就没有追加与非追
- 本文实例讲述了Python进程间通信Queue消息队列用法。分享给大家供大家参考,具体如下:进程间通信-QueueProcess之间有时需要
- 最近,我有机会研究对视觉设计作用的常见误解,这些误解仍然盛行于行政主管、产品主管,工程经理和市场专家中。设计团队成员如何说明这些认识是错误的
- 有时候我们可能需要import另一个路径下的python文件,例如下面这个目录结构,我们想要在_train.py里import在networ
- 1.什么是局部视图局部视图是在其他视图中呈现的视图。通过执行局部视图生成的HTML输出呈现在调用视图中。与视图一样,局部视图使用 .csht
- Selenium Python 提供了一个简单的API 便于我们使用 Selenium WebDriver编写 功能/验收测试。 通过Sel
- 去空格及特殊符号s.strip().lstrip().rstrip(',')Python strip() 方法用于移除字符串
- 大家都知道Vue.js是中国人创造出来的,简单易用,所以必须要支持一下Vue采用的MVVM设计模式也就是说model和view绑定 mode
- 一.秒杀业务分析 所谓秒杀,就是网络卖家发布一些超低价格的商品,所有买家在同一时间网上抢
- python为main方法传参执行python脚本的时候,想给main方法传入参数的例子#!/usr/bin/env python# -*-
- 背景测试的出现是为了避免项目中出现重大事故测试是避免事故的最后一道屏障测试单元测试的覆盖率在一定程度上而言,决定了代码的质量单元测试通过测试
- Centos6.5在线安装mysql 8.0的顺序如下,希望大家可以顺利进行安装。Mysql卸载从下往上顺序 [root@localhost
- 1.安装pymysql:pip install pymysql (在命令行窗口中执行)2.卸载pymysql:pip uninstall p
- 前言众所周知在Python中有专门用于logger打印的套件叫logging,但是该套件logger仅接收一个字符串类型的logger打印信
- 在图片处理中,霍夫变换主要是用来检测图片中的几何形状,包括直线、圆、椭圆等。在skimage中,霍夫变换是放在tranform模块内,本篇主
- 前言近来chatGPT挺火的,也试玩了一下,确实挺有意思。这里记录一下在Python中如何去使用chatGPT。本篇文章的实现100%基于
- 获取指定日期月份的第一天,你可以使用DATEADD函数,减去指定日期的月份过去了的天数,即可。 代码如下:CREATE FUNC
- 按照固定的字符,拆分已有的字符串split(sep, n, expand = False):sep:用于分割的字符串n:分割为多少列expa
- 学习神经网络已经有一段时间,从普通的BP神经网络到LSTM长短期记忆网络都有一定的了解,但是从未系统的把整个神经网络的结构记录下来,我相信这