自动化测试工具playwright中文文档-------1.编写测试

目录

介绍

第一个测试

操作

导航

交互(Interactions)

基本操作

断言

测试隔离

使用夹具(Fixtures)


介绍

Playwright 测试非常简单,它们

  • 执行操作,
  • 并断言状态是否符合预期。

在执行任何操作之前,无需等待任何内容:Playwright 在执行每个操作之前会自动等待一系列可操作性检查通过。

此外,在执行检查时也不需要处理竞态条件------Playwright 的断言设计方式能够描述最终需要满足的期望。

就这样!这些设计选择允许 Playwright 用户完全忘记他们测试中的不稳定超时和竞态检查。

您将学习

  • 如何编写第一个测试
  • 如何执行操作
  • 如何使用断言
  • 测试如何在隔离环境中运行
  • 如何使用测试钩子

第一个测试

请查看以下示例,了解如何编写测试。请注意文件名如何遵循以 test_ 为前缀的约定,以及每个测试名称的命名方式。

复制代码
# test_example.py
import re  
from playwright.sync_api import Page, expect  
  
def test_has_title(page: Page):  
    page.goto("https://playwright.dev/")  
  
    # 期待标题"包含"一个子字符串。  
    expect(page).to_have_title(re.compile("Playwright"))  
  
def test_get_started_link(page: Page):  
    page.goto("https://playwright.dev/")  
  
    # 点击"开始使用"链接。  
    page.get_by_role("link", name="Get started").click()  
  
    # 期待页面有一个标题为"Installation"的标题。  
    expect(page.get_by_role("heading", name="Installation")).to_be_visible()

定义了两个测试函数,分别用于检查 Playwright 官网的标题和点击"开始使用"链接后的页面内容。

  1. test_has_title 函数通过 page.goto 方法导航到 Playwright 官网,并使用 expect(page).to_have_title 方法来检查页面标题是否包含"Playwright"这个子字符串。这里使用了正则表达式 re.compile("Playwright") 来匹配标题。

  2. test_get_started_link 函数同样先导航到 Playwright 官网,然后使用 page.get_by_role 方法找到"开始使用"链接(假设该链接的角色是"link"且其名称是"Get started"),并执行点击操作。之后,再次使用 page.get_by_role 方法找到标题为"Installation"的标题,并使用 expect(...).to_be_visible 方法来检查该标题是否可见。这验证了点击"开始使用"链接后,用户被正确地导航到了安装指南页面。

操作

导航

大多数测试将从将页面导航到URL开始。之后,测试将能够与页面元素进行交互。

复制代码
page.goto("https://playwright.dev/")

Playwright 将在继续之前等待页面达到加载状态。了解更多关于page.goto() 选项的信息。

交互(Interactions)

执行操作始于定位元素。Playwright 使用 Locators API来实现这一点。Locator 表示在任何时刻在页面上查找元素(或多个元素)的一种方式,了解更多关于可用的不同类型 Locator 的信息。Playwright 将在执行操作之前等待元素变为可操作状态actionable,因此无需等待它变为可用状态。

复制代码
# Create a locator.
get_started = page.get_by_role("link", name="Get started")

# Click it.
get_started.click()

在大多数情况下,这行代码会写成一行:

复制代码
page.get_by_role("link", name="Get started").click()

使用Playwright的API来定位页面上角色(role)为"link",且其名称(name)为"Get started"的链接元素,并对该元素执行点击(click)操作。

基本操作

这是Playwright中最常用的操作列表。请注意,还有更多其他操作,因此请确保查阅Locator API部分以了解更多信息。

操作 描述
locator.check() 选中复选框
locator.click() 点击元素
locator.uncheck() 取消选中复选框
locator.hover() 鼠标悬停在元素上
locator.fill() 填写表单字段,输入文本
locator.focus() 使元素获得焦点
locator.press() 按下单个键
locator.set_input_files() 选择文件以进行上传
locator.select_option() 在下拉列表中选择选项

断言

Playwright 包含了断言功能,它会等待直到满足预期的条件。使用这些断言可以使测试更加稳定且不易出错。例如,以下代码将等待直到页面标题包含 "Playwright":

复制代码
import re  
from playwright.sync_api import expect  
  
expect(page).to_have_title(re.compile("Playwright"))

以下是最常用的异步断言列表。请注意,还有更多其他断言需要熟悉:

断言 描述
expect(locator).to_be_checked() 复选框被选中
expect(locator).to_be_enabled() 控件被启用
expect(locator).to_be_visible() 元素可见
expect(locator).to_contain_text() 元素包含文本
expect(locator).to_have_attribute() 元素具有某个属性
expect(locator).to_have_count() 元素列表具有给定长度
expect(locator).to_have_text() 元素匹配文本
expect(locator).to_have_value() 输入元素具有值
expect(page).to_have_title() 页面具有标题
expect(page).to_have_url() 页面具有URL

测试隔离

Playwright的Pytest插件基于测试夹具(fixtures)的概念,如内置的页面夹具(page fixture),它会被传递到您的测试中。由于浏览器上下文(Browser Context)的存在,测试之间的页面是隔离的。浏览器上下文相当于一个新的浏览器配置文件,每个测试都会获得一个全新的环境,即使在单个浏览器中运行多个测试也是如此。

复制代码
test_example.py

from playwright.sync_api import Page

def test_example_test(page: Page):
  pass
  # "page" belongs to an isolated BrowserContext, created for this specific test.

def test_another_test(page: Page):
  pass
  # "page" in this second test is completely isolated from the first test.

使用夹具(Fixtures)

您可以使用各种夹具(fixtures)在测试之前或之后执行代码,并在它们之间共享对象。一个函数作用域的夹具(如使用autouse=True)表现得像beforeEach/afterEach。而一个模块作用域的夹具(也使用autouse=True)则表现得像beforeAll/afterAll,它在所有测试之前运行一次,在所有测试之后也运行一次。

复制代码
import pytest  
from playwright.sync_api import Page, expect  
  
# 定义一个函数作用域的夹具,它会自动应用于每个测试函数  
@pytest.fixture(scope="function", autouse=True)  
def before_each_after_each(page: Page):  
      
    print("测试运行之前")  
  
    # 在每个测试之前跳转到起始URL  
    page.goto("https://playwright.dev/")  
    yield  # yield 语句之后的代码会在测试函数执行完毕后执行  
      
    print("测试运行之后")  
  
def test_main_navigation(page: Page):  
    # 使用 expect API 进行断言  
    expect(page).to_have_url("https://playwright.dev/")
相关推荐
攻城狮7号25 分钟前
【第一节】Python爬虫基础-HTTP基本原理
爬虫·python·python爬虫
IT乐手26 分钟前
adb logcat 写文件乱码的解决方案
android·python
Python测试之道29 分钟前
Deepseek API+Python 测试用例一键生成与导出 V1.0.6(加入分块策略,返回更完整可靠)
开发语言·python·测试用例
SRC_BLUE_1733 分钟前
Python GUI 编程 | QObject 控件基类详解 — 定时器
开发语言·数据库·python
啊阿狸不会拉杆40 分钟前
第二十一章:Python-Plotly库实现数据动态可视化
开发语言·python·plotly
月走乂山1 小时前
nocobase + Python爬虫实现数据可视化
爬虫·python·低代码·信息可视化
滴答滴答嗒嗒滴1 小时前
Python小练习系列 Vol.12:学生信息排序(sorted + key函数)
开发语言·python
rockmelodies1 小时前
OpenSCAP 是一个基于开源的安全合规性自动化框架
安全·开源·自动化
天天进步20152 小时前
Python项目-基于Flask的个人博客系统设计与实现(1)
开发语言·python·flask
安然无虞2 小时前
31天Python入门——第20天:魔法方法详解
开发语言·后端·爬虫·python