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

元素定位

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

Locators | Playwright Python

如下这些是推荐的

最强自动化测试框架Playwright-(2)实用操作_第1张图片

  • page.get_by_role()

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

最强自动化测试框架Playwright-(2)实用操作_第2张图片使用F12元素拾取工具,可以看到一个元素的name和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()

  • 按占位符查找输入。

page.get_by_placeholder("[email protected]").fill("[email protected]")

  • page.get_by_alt_text()

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

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

playwright logo

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

page.get_by_title()

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

25 issues

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

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

 

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,可以在任何浏览器上测试您的应用程序,以及模拟手机或平板电脑等真实设备。只需配置您要模拟的设备 

你可能感兴趣的:(#,playwright,自动化,测试)