Playwright 断言是专门为动态 Web 设计的。检查会自动重试,直到满足必要条件。Playwright 内置自动等待功能,意味着它会等待元素可操作后再执行操作。Playwright 提供了一个 expect 函数来编写断言。
看一下下面的示例测试,了解如何使用定位器和基于 Web 的断言来编写测试用例。
import refrom playwright.sync_api import Page, expect# 编写一个测试函数,检查首页是否包含特定字符串,并且链接到intro页面的Get started链接是否存在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")# 断言该链接的href属性值等于指定值expect(get_started).to_have_attribute("href", "/docs/intro")# 点击Get started链接get_started.click()# 断言当前页面的URL包含特定字符串expect(page).to_have_url(re.compile(".*intro"))
断言(Assertions)
Playwright 提供了 expect 函数,它会等待满足期望的条件。
import refrom playwright.sync_api import expectexpect(page).to_have_title(re.compile("Playwright"))
这段代码使用Playwright提供的expect函数,对当前页面进行断言。其中,断言的条件是页面的标题中包含"Playwright"这个子字符串。使用了Python内置的re模块创建了一个正则表达式对象,作为期望标题的参数。
定位器(Locators)
定位器是 Playwright 自动等待和重试的核心。定位器代表在任何时刻在页面上查找元素的方法,并用于对元素执行操作,如.click、.fill 等。
from playwright.sync_api import expectget_started = page.get_by_role("link", name="Get started")expect(get_started).to_have_attribute("href", "/docs/installation")get_started.click()
这段代码通过 get_by_role 函数创建一个名为 get_started 的定位器(locator)。该定位器被用来查找网页上 role 属性为 link,name 属性为 Get started 的元素。
测试隔离(Test Isolation)
Playwright Pytest 插件基于测试装置的概念,例如传递到您的测试中的内置页面装置。由于浏览器上下文,页面在测试之间被隔离,这相当于一个全新的浏览器配置文件,每个测试都会获得一个全新的环境,即使在单个浏览器中运行多个测试也是如此。
from playwright.sync_api import Pagedef test_basic_test(page: Page):# ...
这段代码导入了Playwright的同步API中的Page类,然后定义了一个名为test_basic_test的测试函数,它的参数是一个Page对象。在测试中,可以使用Page对象进行页面操作和断言检查,例如,通过调用goto()方法导航到一个URL,或者通过调用expect()方法执行断言检查。由于该测试函数期望接收一个Page对象,因此可以使用Playwright Pytest插件来自动地创建和销毁浏览器上下文和页面对象,从而使测试更加简单易用。
使用测试钩子(Using Test Hooks)
您可以使用各种固定装置在测试之前或之后执行代码,并在它们之间共享对象。例如,具有自动使用功能的范围function固定装置的行为类似于 beforeEach/afterEach。具有module自动使用功能的作用域固定装置的行为类似于 beforeAll/afterAll,它在所有测试之前和之后运行。
import pytestfrom playwright.sync_api import Page# 使用测试钩子,在每个测试之前和之后执行操作# before_each_after_each是该fixture的名称# page是一个Playwright的Page对象,传入fixture函数,作为参数使用def before_each_after_each(page: Page):print("beforeEach")# 在每个测试之前访问一个URLpage.goto("https://playwright.dev/")yieldprint("afterEach")def test_main_navigation(page: Page):# 断言使用Playwright的expect APIexpect(page).to_have_url("https://playwright.dev/")
这段代码演示了如何使用 Pytest 和 Playwright 来自动化测试一个 Web 应用程序。@pytest.fixture 装饰器用于定义一个测试用例之前和之后要执行的代码块。scope = "function" 表示该代码块将在每个测试函数运行之前和之后运行一次。autouse=True 表示该代码块将自动使用,而无需在测试函数中显式调用。
在此示例中,before_each_after_each 代码块使用了一个 page 对象,该对象表示一个浏览器页面。它通过 Page 类从 playwright.sync_api 模块导入。page.goto 方法用于在每个测试用例之前访问网页。使用 yield 关键字来告诉 Pytest 执行测试用例代码,然后再继续执行 afterEach 代码块。
test_main_navigation 测试用例函数接受一个名为page的参数,该参数是 before_each_after_each代码块返回的page 对象。expect(page).to_have_url("https://playwright.dev/") 用于检查页面的 URL 是否与指定的 URL 匹配,这是使用 Playwright 提供的 expect 函数实现的。
每天晚上来学习

视频号直播进行中

