【Playwright+Python】系列教程(四)Pytest 插件在Playwright中的使用

playwright,python,pytest · 浏览次数 : 7

小编点评

本文详细介绍了使用Pytest插件在Playwright中进行端到端测试的方法和配置。文章首先概述了使用pytest执行测试的基本步骤,然后详细讲解了pytest.ini文件的配置内容,包括不同浏览器模式的运行、CLI参数的使用、Fixtures夹具的使用、测试配置以及并行测试和调试技巧。 1. **命令行执行测试**:文章首先介绍了如何在命令行中使用pytest执行测试,并通过示例展示了如何使用不同的浏览器模式和CLI参数。 - 使用`pytest --browser webkit --headed`命令运行测试类。 - 使用`pytest.ini`文件配置测试环境,如设置浏览器模式、操作速度等。 2. **Fixtures夹具**:介绍了如何在测试用例中使用Fixtures,包括初步使用、进一步使用、作用域和自定义夹具。 - 初步使用:通过在函数前定义`pytest.fixture()`。 - 进一步使用:使用`@pytest.mark.usefixtures('set')`装饰器。 - 作用域:包括function、class、module、package和session级别。 - 自定义夹具:覆盖`browser_type.launch()`和`browser.new_context()`的参数。 3. **配置测试**:讲述了如何配置测试,包括并行测试、跳过测试、配置base-url、忽略HTTPS错误、使用自定义视口大小、设备仿真和与unittest.TestCase的集成。 - 并行测试:使用`--numprocesses`标志。 - 跳过测试:使用`@pytest.mark.skip()`装饰器。 - 配置base-url:使用`pytest-base-url`插件。 - 忽略HTTPS错误:在`browser_context_args`中设置`ignore_https_errors`。 - 使用自定义视口大小:在`browser_context_args`中设置`viewport`参数。 - 设备仿真:使用`playwright.devices`模块定义设备规格。 - 与unittest.TestCase的集成:虽然有限制,但可以作为一种选择。 4. **关于自动等待的说明**:解释了Playwright的自动等待机制,并建议使用`page.wait_for_timeout()`代替`time.sleep()`。 总的来说,文章提供了全面的指导,帮助读者了解如何在Playwright中使用pytest进行端到端测试,并提供了丰富的配置选项和测试技巧。

正文

一、命令行使用详解

使用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目录下,和测试结果文件一样
image.png

3.7、截图

是否在每次测试后自动捕获屏幕截图。on、off或only-on-failure(默认:off)
pytest --browser chromium --headed --screenshot on
效果:
image.png
在失败时截取整页截图(长截图)默认情况下,仅捕获视口。需要启用 --screenshot(默认off).
pytest --browser chromium --headed --screenshot on --full-page-screenshot
效果:
image.png

二、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执行脚本
效果:
image.png

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())或条件断点。

效果:
image.png

四、关于自动等待的说明

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

与【Playwright+Python】系列教程(四)Pytest 插件在Playwright中的使用相似的内容:

【Playwright+Python】系列教程(四)Pytest 插件在Playwright中的使用

一、命令行使用详解 使用Pytest插件在Playwright 中来编写端到端的测试。 1、命令行执行测试 pytest --browser webkit --headed 2、使用 pytest.ini 文件配置 内容如下: [pytest] # Run firefox with UI addop

【Playwright+Python】系列教程(五)元素定位

一、常见元素定位 定位器是 Playwright 自动等待和重试能力的核心部分。简而言之,定位器代表了一种随时在页面上查找元素的方法,以下是常用的内置定位器。 1、按角色定位 按显式和隐式可访问性属性进行定位 语法:page.get_by_role() Dom结构示例1: 示例代码1: page.g

【Playwright+Python】系列教程(二)手把手带你写一个脚本

一、如何使用代理方式打开网页 在 playwright.chromium.launch() 中传入 proxy 参数即可,示例代码如下: 1、同步写法: from playwright.sync_api import sync_playwright proxy = {'server': 'http:

【Playwright+Python】系列教程(一)环境搭建及脚本录制

一、前言 看到这个文章,有的同学会说: 六哥,你为啥不早早就写完python系列的文章。 因为有徒弟需要吧,如果你也想学自学,那这篇文章,可以说是我们结缘一起学习的开始吧! 如果对你有用,建议收藏和转发! 二、Playwright是什么? 微软开源自动化测试工具Playwright,支持主流浏览器,

《刚刚问世》系列初窥篇-Java+Playwright自动化测试-1-环境准备与搭建

1.简介 Python+Playwright系列的文章还没有结束,就有好的小伙伴或者童鞋们私信公众号留言,问宏哥什么时候出Java语言的Playwright的自动化测试文章。本来想趁热打铁将Python+Playwright完结后,就开始Java语言的Playwright的自动化测试文章,但是好多人

《最新出炉》系列初窥篇-Python+Playwright自动化测试-1-环境准备与搭建

1.简介 有很多人私信留言宏哥问能不能介绍一下Playwright这款自动化神器的相关知识,现在网上的资料太少了。其实在各大博客和公众号也看到过其相关的介绍和讲解。要不就是不全面、不系统,要不就是系统全面但是人家是收费的。当然了宏哥接下来也可能介绍的不全面或者不系统,能力有限望大家理解。 2.Pla

《最新出炉》系列初窥篇-Python+Playwright自动化测试-2-playwright的API及其他知识

1.简介 上一篇宏哥已经将Python+Playwright的环境搭建好了,而且也简单的演示了一下三款浏览器的启动和关闭,是不是很简单啊。今天主要是把一篇的中的代码进行一次详细的注释,然后说一下playwright的API和其他相关知识点。那么首先将上一篇中的代码进行一下详细的解释。 2.代码解释

《最新出炉》系列初窥篇-Python+Playwright自动化测试-3-离线搭建playwright环境

1.简介 有些小伙伴或者童鞋们私信留言说自己是在公司局域网办公,或者公司为了安全对网络管控比较严格(尤其是一些大的国企、央企),总之就是一句话无法连到外网去在线下载,宏哥刚看到留言时觉得这问题还留言问啊,你找个有网的电脑下载好安装包然后安装就可以用了。(第一种情况及解决办法:带要搭建环境的电脑到有网

《最新出炉》系列初窥篇-Python+Playwright自动化测试-4-playwright等待浅析

1.简介 在介绍selenium的时候,宏哥也介绍过等待,是因为在某些元素出现后,才可以进行操作。有时候我们自己忘记添加等待时间后,查了半天代码确定就是没有问题,奇怪的就是获取不到元素。然后搞了好久,或者经过别人的提示才恍然大悟没有添加等待时间。而playwright为了避免我们犯这么low的错误,

《最新出炉》系列初窥篇-Python+Playwright自动化测试-5-元素定位大法-上篇

1.简介 说到元素定位,小伙伴或者童鞋们肯定会首先想到 selenium 的八大元素定位大法。同理Playwright也有自己的元素定位的方法。今天就给小伙伴或者童鞋们讲解和分享一下Playwright的元素定位方法。 宏哥对UI自动化的理解:定位元素 >操作元素 >断言。 2.定位器 定位器(Lo