一、命令行使用详解

使用Pytest插件在Playwright 中来编写端到端的测试。

1、命令行执行测试

pytest --browser webkit --headed

2、使用 pytest.ini 文件配置

内容如下:

[pytest]
# Run firefox with UI
addopts = --headed --browser firefox

效果:

运行测试类,可以直接可以按照配置执行

命令行执行,无需指定参数输入pytest即可

3、CLI 参数详解

前提:未使用pytest.ini配置

3.1、在带头模式下运行测试(默认:无头)

pytest --headed

3.2、在不同的浏览器中运行测试

在不同的浏览器 chromium、firefox 或 webkit 中运行测试。可以多次指定(默认:chromium)

pytest --browser chromium --headed

3.3、使用的浏览器通道

pytest --browser-channel chrome --headed

3.4、将 Playwright 操作速度减慢指定的毫秒数

将 Playwright 操作速度减慢指定的毫秒数。很有用,以便您可以查看正在发生的事情(默认值:0)。

pytest --browser chromium --headed --slowmo 5000(5秒)

3.5、记录测试结果

是否为每个测试记录跟踪。on、off或retain-on-failure(默认:off)

pytest --browser chromium --headed --tracing on

3.6、视频录制

是否为每个测试录制视频。on、off或retain-on-failure(默认:off)。

pytest --browser chromium --headed --video on

结果默认保存在test-results目录下,和测试结果文件一样

3.7、截图

是否在每次测试后自动捕获屏幕截图。on、off或only-on-failure(默认:off)

pytest --browser chromium --headed --screenshot on

效果:



在失败时截取整页截图(长截图)默认情况下,仅捕获视口。需要启用 --screenshot(默认off).

pytest --browser chromium --headed --screenshot on --full-page-screenshot

效果:

二、Fixtures夹具

因为我们使用fixture更加灵活,具体有独立的命名,然后呢,还可以按模块化的方式实现,每个fixture都可以互相调用,并且呢范围可以跨函数、类、模块、还有整个session范围

那fixture怎么使用呢?

1、fixture初步使用

我们直接在函数前定义就可以

@pytest.fixture()

但是这块是有一些注意事项:要定义的函数最好不要以test开头,和用例分开,并且fixture定义的函数是有返回值的,下边的测试用例可以调用fixture的返回值

我们看下实战

@pytest.fixture()
def set():
print("----在用例前执行----") def test_01(set):
print('用例1')

这里我们定义了一个测试夹具,然后再test_01中使用了测试夹具的参数,那么执行结果应该是会先调用这个夹具函数,然后再执行用例函数

看下执行结果:

2、fixture进一步使用

我们还有一种使用fixture的方式

@pytest.mark.usefixtures(fixture_name)

这样使用,我们如果用在类上呢,这个类下的所有用例都会调用这个fixture

直接看实战:

@pytest.fixture()
def set():
print("----在用例前执行----") @pytest.mark.usefixtures('set')
class Test_Demo(): def test_01(self):
print('用例1') def test_02(self):
print('用例2')

看下结果:

每个用例前都执行了测试夹具

那么还有一种只作用在用例上呢

看实战:

@pytest.fixture()
def set():
print("----在用例前执行----") class Test_Demo():
@pytest.mark.usefixtures('set')
def test_01(self):
print('用例1') def test_02(self):
print('用例2')

执行结果:

只有用例1前执行了测试夹具

3、fixture作用域

在我们之前用了setupClass和tearDownclass,指的是在每个类前会执行前置,在执行后置

那我们在fixture中,也可以这样使用

并且有好几个:

  • unction:默认作用域,每个测试用例都运行一次
  • class:每个测试类只执行一次
  • module:每个模块只执行一次
  • package:每个python包只执行一次
  • session:整个会话只执行一次,即运行项目时整个过程只执行一次

如果设置多个的话,会有一个优先级:session > package > module > class > function

那我们以其中的作用域为class做一个实战场景:

@pytest.fixture(scope='class')
def set():
print("----在用例前执行----") class Test_Demo1:
def test_01(self,set):
print('用例1执行')
def test_02(self,set):
print('用例2执行') class Test_Demo2():
def test_01(self,set):
print('第二个类中的用例1')

我们在夹具函数上定义每个类只执行一次

现在猜下执行结果是什么,是不是夹具——>Test_Demo1,夹具——>Test_Demo2

直接看结果:

4、自定义夹具的使用

对于browser和context夹具,请使用以下夹具来定义自定义启动选项。

  • browser_type_launch_args:覆盖 browser_type.launch() 的启动参数。它应该返回一个 Dict。
  • browser_context_args:覆盖 browser.new_context() 的选项。它应该返回一个 Dict。

示例代码:

import pytest

@pytest.mark.browser_context_args(timezone_id="Europe/Berlin", locale="en-GB")
def test_browser_context_args(page):
assert page.evaluate("window.navigator.userAgent") == "Europe/Berlin"
assert page.evaluate("window.navigator.languages") == ["de-DE"]

三、配置测试

1、并行测试

# install dependency
pip install pytest-xdist
# use the --numprocesses flag
pytest --numprocesses auto

根据测试的硬件和性质,可以将 numprocesses 设置为从 2 到计算机上的 CPU 数量之间的任意值。如果设置得太高,您可能会注意到意外行为。

2、跳过测试

@pytest.mark.skip("firefox")
def test_visit_example(page):
page.goto("https://www.alipansou.com/")

3、配置 base-url执行

使用 base-url 参数启动 Pytest。pytest-base-url 插件用于允许您从配置、CLI arg 或作为固定装置设置基本 url 的插件。

pytest --base-url [http://localhost:8080](http://localhost:8080)

def test_visit_example(page):
page.goto("/admin")
# -> Will result in http://localhost:8080/admin

4、忽略 HTTPS 错误

conftest.py

import pytest

@pytest.fixture(scope="session")
def browser_context_args(browser_context_args):
return {
**browser_context_args,
"ignore_https_errors": True
}

5、使用自定义视口大小

conftest.py

import pytest

@pytest.fixture(scope="session")
def browser_context_args(browser_context_args):
return {
**browser_context_args,
"viewport": {
"width": 1920,
"height": 1080,
}
}

6、设备仿真

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,
}

使用pytest --device="iPhone 11 Pro" --headed执行脚本

效果:

7、与 unittest.TestCase的使用

与 unittest.TestCase。这有一个限制,即只能指定一个浏览器,并且在指定多个浏览器时不会生成多个浏览器的矩阵。

示例代码:

# -*- coding: utf-8 -*-
# @Time : 2024/07/06 18:10
# @Author : longrong.lang
# @FileName: test_unittest.py
# @Software: PyCharm
# @Cnblogs :https://www.cnblogs.com/longronglang
# @Motto:你只管努力,剩下的交给天意.
import pytest
import unittest from playwright.sync_api import Page class MyTest(unittest.TestCase):
@pytest.fixture(autouse=True)
def setup(self, page: Page):
self.page = page def test_foobar(self):
self.page.goto("https://microsoft.com")
assert self.page.evaluate("1 + 1") == 2

8、运行调试

在测试代码中使用 breakpoint() 语句暂停执行并获取 pdb REPL。

def test_bing_is_working(page):
page.goto("https://bing.com")
breakpoint()
# ...

如何进行调试:

  1. 启动调试:当程序在breakpoint()处暂停时,它会自动进入pdb调试环境。
  2. 查看状态:在pdb中,你可以使用命令如l(list)来查看当前代码周围的行,p 变量名来打印变量的值。
  3. 继续执行:要继续执行程序直到下一个断点或程序结束,你可以输入c(continue)命令。
  4. 如果你只是想在特定点暂停代码执行,但不希望进入pdb环境,可以考虑使用其他方法,比如打印语句(print())或条件断点。

效果:

四、关于自动等待的说明

Playwright能自动等页面准备好,但有时你可能想让它等一会儿。别用time.sleep(5)来等,因为它会让程序完全停下来。改用page.wait_for_timeout(5000)吧,这样程序在等待时还能做其他事,更流畅。

【Playwright+Python】系列教程(四)Pytest 插件在Playwright中的使用的更多相关文章

  1. Fastify 系列教程四 (求对象、响应对象和插件)

    Fastify 系列教程: Fastify 系列教程一 (路由和日志) Fastify 系列教程二 (中间件.钩子函数和装饰器) Fastify 系列教程三 (验证.序列化和生命周期) Fastify ...

  2. CRL快速开发框架系列教程四(删除数据)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  3. C#微信公众号开发系列教程四(接收普通消息)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

  4. Android Studio系列教程四--Gradle基础

    Android Studio系列教程四--Gradle基础 2014 年 12 月 18 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzhang ...

  5. NGUI系列教程四(自定义Atlas,Font)

    今天我们来看一下怎么自定义NGUIAtlas,制作属于自己风格的UI.第一部分:自定义 Atlas1 . 首先我们要准备一些图标素材,也就是我们的UI素材,将其导入到unity工程中.2. 全选我们需 ...

  6. 黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block 企业库日志应用程序模块工作原理图:   从上图我们可以 ...

  7. webpack4 系列教程(四): 单页面解决方案--代码分割和懒加载

    本节课讲解webpack4打包单页应用过程中的代码分割和代码懒加载.不同于多页面应用的提取公共代码,单页面的代码分割和懒加载不是通过webpack配置来实现的,而是通过webpack的写法和内置函数实 ...

  8. Unity3D脚本中文系列教程(四)

    http://dong2008hong.blog.163.com/blog/static/4696882720140302451146/ Unity3D脚本中文系列教程(三) 送到动画事件. ◆ va ...

  9. Influx Sql系列教程四:series/point/tag/field

    influxdb中的一条记录point,主要可以分为三类,必须存在的time(时间),string类型的tag,以及其他成员field:而series则是一个measurement中保存策略和tag集 ...

  10. Python系列教程-详细版 | 图文+代码,快速搞定Python编程(附全套速查表)

    作者:韩信子@ShowMeAI 教程地址:http://showmeai.tech/article-detail/python-tutorial 声明:版权所有,转载请联系平台与作者并注明出处 引言 ...

随机推荐

  1. C数据结构:哈夫曼树算法实现与应用

    学习哈夫曼树(编码) 带权二叉树 认识WPL 最优二叉树 构造哈夫曼树的过程 哈夫曼树的应用 建立哈夫曼树 代码如下: 结构体代码部分 建立操作代码 找到最小结点(※难点) 附上建立哈夫曼树源代码 带 ...

  2. C语言:判断是否为素数,并且打印素数表

    /*     构造素数表, 只需要用数字除以已经判断出来的数是否能整除就行,     不需要除以这个数之前所有的数字,     前提是这个数除以的素数是要比他自己小的      */ 注意一点:int ...

  3. PageOffice 在线编辑 office文件,回调父页面

    一.子页面调用父页面的方法 var value=window.external.CallParentFunc("ParentFunName(Arguments);");//父页面的 ...

  4. YiShaAdmin:一款基于.NET Core Web + Bootstrap的企业级快速开发框架

    前言 今天大姚给大家分享一款基于.NET Core Web + Bootstrap的企业级快速后台开发框架.权限管理系统,代码简单易懂.界面简洁美观(基于MIT License开源,免费可商用):Yi ...

  5. spring boot 整合mybatis 配置多数据源 数据源切换和多数据源的事务

    因为项目中用到了多数据源 不可避免的会有各种各样的问题列一下最主要的问题: 1 如何配置多数据源???2 spring项目中多数据源无法切换???3 操作了2个或者2个以上数据库的数据无法保证事务的一 ...

  6. Swoole 实践篇之结合 WebRTC 实现音视频实时通信方案

    原文首发链接:Swoole 实践篇之结合 WebRTC 实现音视频实时通信方案 大家好,我是码农先森. 引言 这次实现音视频实时通信的方案是基于 WebRTC 技术的,它是一种点对点的通信技术,通过浏 ...

  7. WPF中 x:Name和Name的区别

    x:Name 唯一地标识 XAML 定义的对象,以便于从代码隐藏或通用代码中访问对象图中实例化的对象.x:Name 一旦应用于支持编程模型,便可被视为与由构造函数返回的用于保存对象引用或实例的变量等效 ...

  8. 23ai中的True Cache到底能做啥?

    最近,Oracle的产品管理总监在Oracle数据库内幕中介绍了True Cache. 原文链接如下: https://blogs.oracle.com/database/post/introduci ...

  9. 腾讯蓝鲸平台部署v5.1版本[去坑]

    腾讯蓝鲸平台部署 1. 环境准备 #1. 基础优化 ulimit -SHn 655360 yum remove mysql-devel -y && yum install mysql- ...

  10. 8.19考试总结(NOIP模拟44)[Emotional Flutter·Medium Counting·Huge Counting·字符消除2 ]

    在自称善意的之时,即存恶意. 前言 几乎是大暑假的最后一次考试了. 我也迎来了我的第一次报零(雾 T1 Emotional Flutter 解题思路 比较考验思维能力,其实就是区间覆盖问题. 我考场上 ...