元素定位
定位器是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
剧作家在采取行动之前对元素执行一系列可操作性检查,以确保这些动作按预期运行。它会自动等待所有相关检查通过,然后才执行请求的操作。如果所需的检查在给定的 内未通过,则操作将失败,并显示 。timeout
TimeoutError
例如,对于 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 秒。
全局超时
from playwright.sync_api import expect
expect.set_options(timeout=10_000)
每个断言超时
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_playwrightasync 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,可以在任何浏览器上测试您的应用程序,以及模拟手机或平板电脑等真实设备。只需配置您要模拟的设备