【Playwright+Python】系列 Pytest 插件在Playwright中的使用

 

一、命令行使用详解

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

1、命令行执行测试
pytest --browser webkit --headed
2、使用 pytest.ini 文件配置

内容如下:

[pytest]
# Run firefox with UIaddopts = --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 unittestfrom playwright.sync_api import Pageclass MyTest(unittest.TestCase):@pytest.fixture(autouse=True)def setup(self, page: Page):self.page = pagedef 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 具有自动等待功能。如果你仍然依赖它,你应该使用 page.wait_for_timeout(5000) 而不是 time.sleep(5)最好不要等待超时,但有时它对调试很有用。在这些情况下,请使用我们的 wait (wait_for_timeout) 方法而不是 time 模块。这是因为我们在内部依赖于异步操作,而当使用 time.sleep(5)它们无法得到正确的处理。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/45128.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云计算【第一阶段(31)】PXE高效批量网络装机

一、系统安装 1.1、系统装机的三种引导方式 1. 硬盘 2. 光驱( u 盘) 3. 网络启动 pxe 1.2、系统安装过程 加载boot loader Boot Loader 是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映…

【CSS in Depth 2 精译】3.1.2 逻辑属性 + 3.1.3 用好逻辑属性的简写形式

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对…

深入探讨:CPU问题的深度分析与调优

引言 你是否曾经遇到过这样的情况:系统运行突然变慢,用户抱怨不断,检查后发现CPU使用率居高不下?这时候,你会如何解决?本文将详细解析CPU问题的分析与调优方法,帮助你在面对类似问题时游刃有余。 案例分析:一次CPU性能瓶颈的解决过程 某知名互联网公司在一次促销活动…

《Python数据科学之一:初见数据科学与环境》

《Python数据科学之一:初见数据科学与环境》 欢迎来到“Python数据科学”系列的第一篇文章。在这个系列中,我们将通过Python的镜头,深入探索数据科学的丰富世界。首先,让我们设置和理解数据科学的基本概念以及在开始任何数据科学项…

实变函数精解【4】

文章目录 说明点集与测度可数集定义性质示例与有限集的关系应用 可列集定义种类不可列集性质应用与意义 有限集性质示例与无限集的区别应用 可数集(Countable set)和可列集(Countably infinite set 或 Enumerable set)可数集可列集…

怎样把pptx课件转换成word文档

如果你还没有安装python-pptx和python-docx,请先运行以下命令: pip install python-pptx python-docx from pptx import Presentation from docx import Document import re# 函数:清理文本,移除特殊字符和控制字符 def clean…

每日Attention学习11——Lightweight Dilated Bottleneck

模块出处 [TITS 23] [link] [code] Lightweight Real-Time Semantic Segmentation Network With Efficient Transformer and CNN 模块名称 Lightweight Dilated Bottleneck (LDB) 模块作用 改进的编码器块 模块结构 模块代码 import torch import torch.nn as nn import to…

qt 添加一个图片控件

在Qt中,要添加一个图片控件,你通常会使用QLabel或者QGraphicsView来显示图片。下面是使用QLabel来显示图片的一种方法: 使用 QLabel 显示图片 在Qt Designer中添加QLabel 打开你的Qt Designer。从工具箱中找到QLabel控件,并将其拖…

C#如何进行深度学习对行人进行识别?

C#通常不是用于深度学习的主要语言,但是通过一些库和框架,你可以轻松地在C#中实现深度学习。以下是使用C#进行深度学习的一些更详细的步骤: 选择合适的库: ML.NET:这是微软推出的一个机器学习库,它很容易集成到.NET应用程序中。ML.NET支持广泛的机器学习任务,包括深度学…

使用DeepWalk 和Word2Vec实现单词Embedding

0、准备“边”数据集Wiki_edgelist import pandas as pddf pd.read_csv(./data/wiki/Wiki_edgelist.txt, sep , headerNone, names["source", "target"]) df.head() 1、读入 起点-终点 边数据,构建图 # 1、读入 起点-终点 边数据&#xff0c…

GIS就业相关问题快问快答

目录 前言1.现在处于经济下行期,GIS就业岗位是否减少了?2.我未来的打算是进体制内研发岗,这方面需要掌握哪些技能呢?3.GIS前端需要掌握哪些知识?4.GIS后端需要掌握哪些知识?5.不论是前端还是后端&#xff0…

编程语言都是哪些人开发出来的?为什么都是国外较小国家的人

编程语言都是哪些人开发出来的? 编程语言的开发者通常是来自计算机科学、软件工程、数学、物理学等领域的专家、学者和工程师。这些开发者具备深厚的编程技能、算法知识、系统设计能力以及创新思维,他们致力于创造出能够解决特定问题或满足特定需求的编…

Docker入门(清晰认识)

为什么学习Docker? 再学完linux后,我们需要远程对Linux虚拟机下载一些软件,如果在Linux里直接用命令下载软件会十分麻烦,所以我们需要通过使用Docker将软件直接下载到Docker中,这样更方便下载和卸载等操作。 一张图弄…

javaScript的面试重点--预解析

目录 一.前言 二.预解析案例 一.前言 关于预解析,我们通过今天学习就能够知道解析器运行JS分为哪两步;能够说出变量提升的步骤和运行过程;能够说出函数提升的步骤和运行过程。 二.预解析案例 预解析,简而言之,也就是…

7.13实训日志

上午 学习网络安全的过程中,我们深入了解了网络的不同层面和技术,从表层网络到深网再到暗网,以及涉及的产业分类和技术工具。这些知识不仅帮助我们理解网络的复杂性,还揭示了如何应对和防范各种网络威胁。 首先,我们…

简易秒表的实现

目录 描述 输入描述: 输出描述: 参考代码 描述 请编写一个模块,实现简易秒表的功能:具有两个输出,当输出端口second从1-60循环计数,每当second计数到60,输出端口minute加一,一直…

当在多线程环境中使用 C++进行编程时,怎样确保线程安全以及如何处理线程之间的同步和通信?

在C中确保线程安全性和处理线程之间的同步和通信有多种方法。下面是一些常用的技术和技巧: 互斥锁:使用互斥锁可以确保只有一个线程可以访问共享资源。在访问共享资源之前获取锁,在完成后释放锁。这可以防止多个线程同时访问同一份数据&#…

007-端口隔离

端口隔离配置 端口隔离简介 为了实现报文之间的二层隔离,可以将不同的端口加入不同的VLAN,但会浪费有限的VLAN资源。采用端口隔离特性,可以实现同一VLAN内端口之间的隔离。 设备支持以下方式进行端口隔离: 基于隔离组的端口隔…

中介子方程五十七

XXFXXaXnXaXXαXLXyXXWXuXeXKXXiXyXΣXXΣXXVXuXhXXWXηXXiXhXXpXiXXpXXbXXiXOXWXyXkXXeXpXXαXXpXeXXkXyXWXOXiXXbXXpXXiXpXXhXiXXηXWXXhXuXVXXΣXXΣXyXiXXKXeXuXWXXyXLXαXXaXnXaXXFXXaXnXaXXαXLXyXXWXuXeXKXXiXyXΣXXΣXXVXuXhXXWXηXXiXhXXpXiXXpXXbXXiXOXWXyXkXXeXpXXα…

理解JavaScript中的对象传递与赋值操作

在JavaScript中,对象传递和赋值操作是两个非常重要的概念。它们在日常开发中扮演着关键角色,但也常常会让人感到困惑。本文将通过两个简单的例子,更好地理解它们的区别和实际应用。 示例代码1:修改对象属性 我们先来看第一段示例…