文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python中playwright结合pytest执行怎么实现

2023-06-25 21:27

关注

这篇文章主要讲解了“python中playwright结合pytest执行怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python中playwright结合pytest执行怎么实现”吧!

安装pytest插件

C:\Users\lifeng01>pip install pytest-playwrightCollecting 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-playwrightSuccessfully installed pytest-playwright-0.2.2

编写测试用例

import pytestfrom 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.1rootdir: F:\project_gitee\Test\playwrightProject\casesplugins: 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, playwright-0.2.2, rerunfailures-9.1.1, xdist-2.2.1collected 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 pytestfrom 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 pytestfrom 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 pytestfrom 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.1rootdir: F:\project_gitee\Test\playwrightProject\casesplugins: 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.1collected 1 item                                                                                                                                                                          test_example.py .                                                                                                                                                                  [100%] =================================================================================== 1 passed in 2.39s ===================================================================================

第二种是直接在用例中增加指定参数即可:

import pytestfrom 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 pytestfrom 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.1rootdir: F:\project_gitee\Test\playwrightProject\casesplugins: 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.1collected 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 pytestfrom playwright.sync_api import BrowserTypefrom 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()

名词解释:

命令行运行测试用例:

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.1rootdir: F:\project_gitee\Test\playwrightProject\casesplugins: 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.1collected 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执行怎么实现”的内容了,经过本文的学习后,相信大家对python中playwright结合pytest执行怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯