在编写测试时,我们使用assert语句来断言一段条件并以此为基础条件,我们要么通过测试,要么不通过测试。Playwright给我们提供了另一个API,可以以一种更易读的方式用来执行相同的判断。
1. Page Assertions
from playwright.sync_api import Page, expect
DOCS_URL = "https://playwright.dev/python/docs/intro"
def test_get_started_link(page: Page):
page.goto("https://playwright.dev/python")
link = page.get_by_role("link", name="GET STARTED")
link.click()
# Page Assertions
# assert page.url == DOCS_URL
expect(page).to_have_url(DOCS_URL)
expect(page).to_have_title("Installation | Playwright Python")
Run:
2. Element State Assertions
from playwright.sync_api import Page, expect
DOCS_URL = "https://playwright.dev/python/docs/intro"
def test_get_started_link(page: Page):
page.goto("https://playwright.dev/python")
link = page.get_by_role("link", name="GET STARTED")
# Not exist in UI
link_not = page.get_by_role("link", name="GET Python")
expect(link).to_be_visible()
expect(link).to_be_enabled()
expect(link_not).not_to_be_visible()
expect(link_not).to_be_hidden()
link.click()
Run:
注意,link_not 在页面上不存在,如果使用expect(link_not ).to_be_visible()
,报错如下:
3. Inner Text Assertions
3.1 Heading
from playwright.sync_api import Page, expect
def test_get_started_link(page: Page):
page.goto("https://playwright.dev/python")
heading = page.locator("h1.hero__title")
# Inner Text Assertions
expect(heading).to_contain_text("testing")
expect(heading).to_have_text(("Playwright enables reliable end-to-end testing for modern web apps."))
3.2 Dropdown list
from playwright.sync_api import Page, expect
def test_get_started_link(page: Page):
page.goto("https://playwright.dev/python")
dropdown_menu = page.locator("ul.dropdown__menu")
# Inner Text Assertions
expect(dropdown_menu).to_contain_text("Python")
expect(dropdown_menu).to_contain_text("Java")
expect(dropdown_menu).to_contain_text("Node.js")
expect(dropdown_menu).to_contain_text(".NET")
Run All:
4. Attribute Assertions
4.1 class
from playwright.sync_api import Page, expect
def test_get_started_link(page: Page):
page.goto("https://playwright.dev/python")
docs_link = page.get_by_role("link", name="Docs")
expect(docs_link).to_have_class("navbar__item navbar__link")
Run:
如果只想check或expect一个元素的一个class,则必须使用正则表达式。
如果还是使用上面的写法,修改为expect(docs_link).to_have_class("navbar__link")
Run:
所以,正确的写法如下:
import re
from playwright.sync_api import Page, expect
def test_get_started_link(page: Page):
page.goto("https://playwright.dev/python")
docs_link = page.get_by_role("link", name="Docs")
expect(docs_link).to_have_class(
re.compile(r"navbar__link")
)
现在可以在这个模式中使用所有的正则表达式语法。
假设这个类应该从navbar __item开始,那我们的写法应为:re.compile(r"^navbar__item")
4.2 id
我们也可以expect元素ID:expect(docs_link).to_have_id("playwright")
。
4.3 attribute
from playwright.sync_api import Page, expect
def test_get_started_link(page: Page):
page.goto("https://playwright.dev/python")
docs_link = page.get_by_role("link", name="Docs")
expect(docs_link).to_have_attribute(
"href", "/python/docs/intro"
)
5. Input Field Assertions
from playwright.sync_api import Page, expect
def test_get_started_link(page: Page):
page.goto("https://playwright.dev/python")
input = page.get_by_placeholder("Search docs")
# input is hidden before button click
expect(input).to_be_hidden()
# Search button
search_button = page.get_by_role("button", name="Search")
search_button.click()
# should pop the search menu
expect(input).to_be_editable()
expect(input).to_be_empty()
# type some query in the input
query = "assertions"
input.fill(query)
# check input value
expect(input).to_have_value(query)
Run:
6. Checkbox Assertions
from playwright.sync_api import Page, expect
def test_app(page: Page):
page.goto("https://bootswatch.com/default/")
checked_checkbox = page.get_by_label("Checked checkbox")
default_checkbox = page.get_by_label("Default checkbox")
expect(checked_checkbox).to_be_checked()
expect(default_checkbox).not_to_be_checked()
7. Option Assertions
from playwright.sync_api import Page, expect
def test_app(page: Page):
page.goto("https://bootswatch.com/default/")
option_menu = page.get_by_label("Example select")
expect(option_menu).to_have_value("1")
multi_option_menu = page.get_by_label("Example multiple select")
multi_option_menu.select_option(["2", "4"])
expect(multi_option_menu).to_have_values(["2", "4"])