最强自动化测试框架Playwright-(2)实用操作

news2024/12/23 22:16:16

元素定位

定位器是playwright自动等待和重试功能的核心部分。简而言之,定位器表示一种随时在页面上查找元素的方法。

Locators | Playwright Python

如下这些是推荐的

  • page.get_by_role()

按显式和隐式辅助功能属性进行定位。

page.get_by_role() 定位器反映用户和辅助技术如何感知页面,例如某些元素是按钮还是复选框。按角色查找时,通常还应传递辅助名称,以便定位器精确定位确切的元素。

角色定位器包括按钮、复选框、标题、链接、列表、表等

page.get_by_role("checkbox", name="Subscribe").check()

  • page.get_by_text()

按文本内容定位。

通过元素包含的文本查找元素。使用 page.get_by_text() 时,可以通过子字符串、精确字符串或正则表达式进行匹配。

expect(page.get_by_text("Welcome, John")).to_be_visible()

这种方式与selenium的根据文本定位一样

  • page.get_by_label()

  • 按关联标签的文本查找。

根据label标签的文本进行查找

page.get_by_label("Password").fill("secret")

  • page.get_by_placeholder()

  • 按占位符查找输入。

<input type="email" placeholder="name@example.com" />

page.get_by_placeholder("name@example.com").fill("playwright@microsoft.com")

  • page.get_by_alt_text()

通过其文本替代来定位元素,通常是图像。

  • 所有图像都应具有描述图像的属性。可以使用 page.get_by_alt_text() 根据替代文本查找图像

<img alt="playwright logo" src="/img/playwright-logo.svg" width="100" />

page.get_by_alt_text("playwright logo").click()

page.get_by_title()

按元素的 title 属性定位元素。

<span title='Issues count'>25 issues</span>

 expect(page.get_by_title("Issues count")).to_have_text("25 issues")

  • page.get_by_test_id() 根据元素的属性定位元素(可以配置其他属性)

 <button data-testid="directions">Itinéraire</button>

page.get_by_test_id("directions").click() 

xpath/css定位

page.locator("css=button").click()
page.locator("xpath=//button").click()

page.locator("button").click()
page.locator("//button").click()

 过滤定位

定位器可以使用 locator.filter() 方法按文本进行过滤。它将搜索元素内某处的特定字符串,可能在后代元素中,不区分大小写。您还可以传递正则表达式。

缩小定位

链接创建定位器的方法(如 page.get_by_text() 或 locator.get_by_role()),以将搜索范围缩小到页面的特定部分。

定位一组元素

计数:expect(page.get_by_role("listitem")).to_have_count(3)

断言一组元素的文本:expect(page.get_by_role("listitem")).to_have_text(["apple", "banana", "orange"])

在列表中获取特定项:使用文本、测试id、下标进行筛选

不常用的定位器

Other locators | Playwright Python

元素操作

行动 |剧作家蟒蛇 (playwright.dev)

对话框处理

Dialogs | Playwright Python

运行js

Evaluating JavaScript | Playwright Python

frame处理

Frames | Playwright Python

句柄处理

Actions | Playwright Python

截图

Screenshots | Playwright Python

录制测试视频

Videos | Playwright Python

视频在测试结束时在浏览器上下文关闭时保存。如果手动创建浏览器上下文,请确保等待 browser_context.close()。

 context = browser.new_context(record_video_dir="videos/")
# Make sure to close, so that videos are saved.
context.close()

from playwright.sync_api import sync_playwright

def test_run(playwright):
    browser = playwright.chromium.launch(headless=None)
    context = browser.new_context(record_video_dir="videos/")
    page = context.new_page()
    page.goto("https://example.com")
    browser.close()

with sync_playwright() as playwright:
    test_run(playwright)

 在videos目录下生成视频。

自动等待

Auto-waiting | Playwright Python

剧作家在采取行动之前对元素执行一系列可操作性检查,以确保这些动作按预期运行。它会自动等待所有相关检查通过,然后才执行请求的操作。如果所需的检查在给定的 内未通过,则操作将失败,并显示 。timeoutTimeoutError

例如,对于 page.click(),Playwright 将确保:

  • 元素附加到 DOM
  • 元素可见
  • 元素为稳定,如未动画或完成动画
  • 元素接收事件,就像不被其他元素遮挡一样
  • 元素已启用

 断言

也可以使用以下方法之一检查元素的可操作性状态。这通常不是必需的,但它有助于编写自信的测试,以确保在某些操作之后,元素达到可操作的状态:

  • element_handle.is_checked()
  • element_handle.is_disabled()
  • element_handle.is_editable()
  • element_handle.is_enabled()
  • element_handle.is_hidden()
  • element_handle.is_visible()
  • page.is_checked()
  • page.is_disabled()
  • page.is_editable()
  • page.is_enabled()
  • page.is_hidden()
  • page.is_visible()
  • locator.is_checked()
  • locator.is_disabled()
  • locator.is_editable()
  • locator.is_enabled()
  • locator.is_hidden()
  • locator.is_visible()

 API测试

行动 |剧作家蟒蛇 (playwright.dev)

断言

断言描述
期望(定位器).to_be_checked()复选框已选中
期望(定位器).to_be_disabled()元素已禁用
期望(定位器).to_be_editable()元素是可编辑的
期望(定位器).to_be_empty()容器为空
期望(定位器).to_be_enabled()元素已启用
期望(定位器).to_be_focused()元素聚焦
期望(定位器).to_be_hidden()元素不可见
期望(定位器).to_be_visible()元素可见
期望(定位器).to_contain_text()元素包含文本
期望(定位器).to_have_attribute()元素具有 DOM 属性
期望(定位器).to_have_class()元素具有类属性
期望(定位器).to_have_count()列表包含确切的孩子数
期望(定位器).to_have_css()元素具有 CSS 属性
期望(定位器).to_have_id()元素具有 ID
期望(定位器).to_have_js_property()元素具有 JavaScript 属性
期望(定位器).to_have_text()元素匹配文本
期望(定位器).to_have_value()输入具有值
期望(定位器).to_have_values()选择已选择的选项
期望(页面).to_have_title()页面有标题
期望(页面).to_have_url()网页包含网址
期望(api_response).to_be_ok()响应具有“正常”状态

自定义预期消息

将自定义错误消息指定为函数的第二个参数,例如:expect

expect(page.get_by_text("Name"), "should be logged in").to_be_visible()

错误如下所示:

    def test_foobar(page: Page) -> None:
>       expect(page.get_by_text("Name"), "should be logged in").to_be_visible()
E       AssertionError: should be logged in
E       Actual value: None 
E       Call log:
E       LocatorAssertions.to_be_visible with timeout 5000ms
E       waiting for get_by_text("Name")
E       waiting for get_by_text("Name")

tests/test_foobar.py:22: AssertionError

设置自定义超时

您可以为全局断言或按断言指定自定义超时。默认超时为 5 秒。

全局超时

conftest.py
from playwright.sync_api import expect

expect.set_options(timeout=10_000)

每个断言超时

test_foobar.py
from playwright.sync_api import expect

def test_foobar(page: Page) -> None:
    expect(page.get_by_text("Name")).to_be_visible(timeout=10_000)

 认证

Authentication | Playwright Python

下载

Downloads | Playwright Python

隔离

行动 |剧作家蟒蛇 (playwright.dev)

使用 Playwright 编写的测试在称为浏览器上下文的隔离的全新环境中执行。这种隔离模型提高了可重复性,并防止了级联测试失败。

什么是测试隔离?​

测试隔离是指每个测试与另一个测试完全隔离。每个测试都独立于任何其他测试运行。这意味着每个测试都有自己的本地存储、会话存储、cookie 等。Playwright使用BrowserContexts来实现这一点,它相当于类似隐身的配置文件。它们创建起来既快速又便宜,并且是完全隔离的,即使在单个浏览器中运行时也是如此。Playwright 为每个测试创建一个上下文,并在该上下文中提供一个默认页面。

为什么测试隔离很重要?​

  • 无故障结转。如果一个测试失败,则不会影响另一个测试。
  • 易于调试错误或不稳定,因为您可以根据需要多次运行单个测试。
  • 并行运行、分片等时不必考虑顺序。

如何实现测试隔离

剧作家使用浏览器上下文来实现测试隔离。每个测试都有自己的浏览器上下文。每次运行测试都会创建新的浏览器上下文。使用 Playwright 作为测试运行程序时,默认情况下会创建浏览器上下文。否则,您可以手动创建浏览器上下文。

同步:

browser = playwright.chromium.launch()
context = browser.new_context()
page = context.new_page()

异步:

 browser = await playwright.chromium.launch()
context = await browser.new_context()
page = await context.new_page()

单个测试中的多个上下文

在单个场景中创建多个浏览器上下文。测试多用户功能(如聊天)时,这很有用

同步:

from playwright.sync_api import sync_playwright

def run(playwright):
    # create a chromium browser instance
    chromium = playwright.chromium
    browser = chromium.launch()

    # create two isolated browser contexts
    user_context = browser.new_context()
    admin_context = browser.new_context()

    # create pages and interact with contexts independently

with sync_playwright() as playwright:
    run(playwright)

 异步:

import asyncio
from playwright.async_api import async_playwright

async def run(playwright):
    # create a chromium browser instance
    chromium = playwright.chromium
    browser = await chromium.launch()

    # create two isolated browser contexts
    user_context = await browser.new_context()
    admin_context = await browser.new_context()

    # create pages and interact with contexts independently

async def main():
    async with async_playwright() as playwright:
        await run(playwright)
asyncio.run(main())

仿真

Emulation | Playwright Python

使用Playwright,可以在任何浏览器上测试您的应用程序,以及模拟手机或平板电脑等真实设备。只需配置您要模拟的设备 

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

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

相关文章

Dockerfile 语法梳理及介绍

1. FROM FROM参数&#xff1a;从什么基础镜像构建新的镜像。 举例 &#xff1a; FROM centos&#xff0c; FROM ubuntu, FROM hello-world 使用 centos 镜像作为基础镜像。 注意&#xff1a;尽量使用官方的镜像作为基础镜像, 为了安全起见。 2. LABEL LABEL参数&#xff1a;从上…

交流汽车充电桩也有大功率的,为什么市场还是想做直流的?

新能源汽车交流充电桩和直流充电桩的区别是什么&#xff1f; 交流汽车充电桩也有大功率的&#xff0c;为什么市场还是想做直流的&#xff1f; 交流充电桩和直流充电桩最本质的区别是充电时车载设备的参与程度。 交流充电桩就好比是一双筷子&#xff0c;它把食物送到嘴里&#…

Windows 编译CEF源码详细记录

背景 默认的CEF不支持音视频功能&#xff0c;需要下载源码将ffmpeg开关打开&#xff0c;再进行编译。 Linux编译参考&#xff1a; 《Linux CEF源码下载编译详细记录》 创建目录结构 code/automate/automate-git.py <-- CEF build scriptchromium_git/cef/ …

Vue数组变更方法和替换方法

一、可以引起UI界面变化 Vue 将被侦听的数组的变更方法进行了包裹&#xff0c;所以它们也将会触发视图更新。这些被包裹过的方法包括&#xff1a; push()pop()shift()unshift()splice()sort()reverse() 以上七个数组都会改变原数组&#xff0c;下面来分别讲解它们的区别&…

《C和指针》(6)指针

1、内存和地址 计算机的内存是由数以亿万计的位&#xff08;bit&#xff09;组成&#xff0c;每一个位可以容纳值0、1值。由于一个位所能表示的值的范围太有限&#xff0c;所以单独的位用处不大。通常许多为合成一组作为一个单位&#xff0c;这样就可以存储范围较大的值。下图…

【AI】Python调用讯飞星火大模型接口,轻松实现文本生成

随着chatGPT的出现&#xff0c;通用大模型已经成为了研究的热点&#xff0c;由于众所周知的原因&#xff0c;亚太地区调用经常会被禁&#xff0c;在国内&#xff0c;讯飞星火大模型是一个非常优秀的中文预训练模型。本文将介绍如何使用Python调用讯飞星火大模型接口&#xff0c…

flask-----初始项目架构

1.初始的项目目录 -apps 包 ------存放app -user文件夹 -------就是一个app -models.py --------存放表模型 -views.py -------存放主代码 -ext包 -init.py -------实例化db对象 -manage.py -----运行项目的入口 -setting.py -----配置文件 2.各文件内容 manage…

剑指offer39.数组中出现次数超过一半的数字

这个题非常简单&#xff0c;解法有很多种&#xff0c;我用的是HashMap记录每个元素出现的次数&#xff0c;只要次数大于数组长度的一半就返回。下面是我的代码&#xff1a; class Solution {public int majorityElement(int[] nums) {int len nums.length/2;HashMap<Integ…

【C++】异常的使用和细节

传统C语言错误异常的方式 C语言一般使用assert来处理错误&#xff0c;assert确实很不错&#xff0c;可以把错误的行数都提示出来&#xff0c;但是&#xff0c;assert有一个致命的缺点&#xff0c;就是触发assert之后就会终止程序&#xff0c;还有一点就是在release环境下&#…

如何通过Pytest的插件,轻松切换自动化测试的环境地址?

前言 前面小编介绍了如何通过Pytest的插件来实现自动化测试的环境的切换&#xff0c;当时使用的方法是通过钩子函数进行获取命令行参数值&#xff0c;然后通过提前配置好的参数进行切换测试环境地址。加我VX&#xff1a;atstudy-js 回复“测试”&#xff0c;进入 自动化测试学…

【CDH集群】无法发出查询:Host Monitor未运行

无法发出查询:Host Monitor未运行 【CDH集群】无法发出查询:Host Monitor未运行同事的解决方案解决方法&#xff1a;删除原uuid重启agent查看新uuid修改scm数据库中HOSTS表中的agent的uuid 【CDH集群】无法发出查询:Host Monitor未运行 起初是impala报错&#xff0c;连接不上&…

武器换弹系统这节课出现的bug,角色不能正确掏枪了,只有换完弹夹以后才能正常掏枪了

UE4系列文章目录 文章目录 UE4系列文章目录前言一、蓝图实现二、错误原因三、修改后的效果 前言 在学习武器换弹系统这节课出现的bug&#xff0c;角色不能正确掏枪了&#xff0c;只有换完弹夹以后才能正常掏枪了&#xff0c;就是添加了换弹之后才影响了持枪功能&#xff0c;在…

Maven的入门级——介绍,安装,导入项目,全网最最详细教程!!,包含可能会包的错误的已经指出来了

目录 一.Maven的基本介绍 二. Maven的使用过程 使用步骤&#xff1a; 三.Maven的安装 3.1 下载 3.2 配置环境步骤 3.3配置settings.xml文件 四.入门案列 4.1 配置Eclipse环境 4.2 介绍Maven项目的结构 4.3 运行测试项目 一.Maven的基本介绍 我们可以知道在程序员做项目的时…

ngrok内网穿透可以实现资源共享吗?快解析更加简洁

随着互联网的高速发展&#xff0c;越来越多的人开始意识到内网穿透技术的重要性。在这一技术中&#xff0c;ngrok已经成为了一个备受关注的工具。然而&#xff0c;很多人对于ngrok是否可以进行资源共享存在疑问。本文将从新的角度出发&#xff0c;深入探讨这个问题。 了解什么…

SAP使用函数NUMBER_GET_NEXT创建流水号

1. 系统中设定流水号&#xff1b;使用T-Code&#xff1a;SNRO来创建一个流 输入Object&#xff1a;ZLC_001&#xff0c;然后单击创建。 然后输入Shorttext, Long text, Number length domain在写程序的时候应该会另外创建&#xff0c;这里测试就使用料号的Domain MATNR来做,其他…

Mahout教程_编程入门自学教程_菜鸟教程-免费教程分享

教程简介 Mahout 是 Apache Software Foundation&#xff08;ASF&#xff09; 旗下的一个开源项目&#xff0c;提供一些可扩展的机器学习领域经典算法的实现&#xff0c;旨在帮助开发人员更加方便快捷地创建智能应用程序。Mahout包含许多实现&#xff0c;包括聚类、分类、推荐…

利用PHP的特性做免杀Webshell

0x01 前言 最近很多家厂商都陆续开放了自己的Webshell检测引擎&#xff0c;并且公开接口&#xff0c;邀请众安全研究员参加尝试bypass检测引擎&#xff0c;并且给予奖励&#xff0c;我也参加了几场类似的活动&#xff0c;有 ASRC 的 伏魔计划 &#xff0c;也有 TSRC 的 猎刃计…

8月盛夏相约|上海国际智能家居展SSHT 精彩亮点抢先看

上海国际智能家居展览会&#xff08;SSHT&#xff09; 2023年8月29至31日 上海新国际博览中心举行 SSHT 作为国内专业智能家居展会&#xff0c;定位为“智能家居技术的行业平台”&#xff0c;以“技术整合”及“跨界合作”为主轴&#xff0c;旨在呈现不同层面的智能家居技术如…

计算机基础知识一

1、计算机系统组成 1.1 硬件 CPU&#xff1a;中央处理器、计算机核心部件、负责计算任务 内存&#xff1a;记忆功能、存储二进制数&#xff0c;内存是一个字节一个地址。 内存大小换算&#xff1a; 8 bits 1 Byte 1024 Bytes Bytes 1 KB &#xff0c; 1024 KB KB 1 …

妙盈面试(部分)

算法题1&#xff0c;二分查找即可&#xff1a; git rebase算法题2&#xff0c;求二叉树两结点的最小公共祖先 搞笑的是&#xff0c;第2道算法题我刚开始做&#xff0c;黑屏了两秒钟&#xff0c;当时其实腾讯会议软件已经崩溃了&#xff0c;但是我没注意到而是继续做题。等到做…