Playwright for Python入门指南——编写测试

自动化测试 · 2023-06-29

Playwright的断言功能是专门为动态Web设计的。它会自动重试,直到满足所需条件。Playwright具有内置的自动等待功能,意味着它会在执行操作之前等待元素可操作。Playwright提供了expect函数用于编写断言。

请看下面的示例测试,了解如何使用定位器和基于Web的断言编写测试。

import re
from playwright.sync_api import Page, expect


def test_homepage_has_Playwright_in_title_and_get_started_link_linking_to_the_intro_page(page: Page):
    page.goto("https://playwright.dev/")

    # 期望标题中包含某个子字符串。
    expect(page).to_have_title(re.compile("Playwright"))

    # 创建一个定位器。
    get_started = page.get_by_role("link", name="Get started")

    # 期望某个属性与特定值“严格相等”。
    expect(get_started).to_have_attribute("href", "/docs/intro")

    # 点击“Get started”链接。
    get_started.click()

    # 期望URL包含“intro”。
    expect(page).to_have_url(re.compile(".*intro"))

断言

Playwright提供了expect函数,该函数会等待直到满足预期条件。

import re
from playwright.sync_api import expect

expect(page).to_have_title(re.compile("Playwright"))

定位器

定位器是Playwright的自动等待和重试的核心组件。定位器用于在任何时候查找页面上的元素,并用于对元素执行操作,例如.click.fill等。

from playwright.sync_api import expect

get_started = page.get_by_role("link", name="Get started")

expect(get_started).to_have_attribute("href", "/docs/installation")
get_started.click()

测试隔离

Playwright的Pytest插件基于测试夹具的概念,其中包括内置的page夹具,该夹具会传递给您的测试函数。由于浏览器上下文(Browser Context)的存在,每个测试之间的页面是隔离的。也就是说,每个测试都会在一个全新的浏览器环境中运行,即使多个测试在同一个浏览器中执行。

from playwright.sync_api import Page

def test_basic_test(page: Page):
  # ...

使用测试钩子

您可以使用各种夹具在测试之前或之后执行代码,并在测试之间共享对象。一个具有函数作用域的夹具(例如before_each_after_each)使用autouse参数时的行为类似于beforeEach/afterEach。而一个具有模块作用域的夹具,使用autouse参数时的行为类似于beforeAll/afterAll,它会在所有测试之前和之后运行。

import pytest
from playwright.sync_api import Page


@pytest.fixture(scope="function

", autouse=True)
def before_each_after_each(page: Page):
    print("beforeEach")
    # 在每个测试之前导航到起始URL。
    page.goto("https://playwright.dev/")
    yield
    print("afterEach")

def test_main_navigation(page: Page):
    # 使用`expect`API进行断言。
    expect(page).to_have_url("https://playwright.dev/")

请注意,这只是一个简单的示例,您可以根据实际需要编写更复杂的测试用例。

Playwright
Theme Jasmine by Kent Liao