Playwright使用教程

一、简介

在现代软件开发中,自动化测试已成为确保代码质量和提升开发效率的重要工具。它不仅能帮助开发者快速发现并修复问题,还能减少手动测试的工作量。Playwright是一款强大的开源自动化测试工具,它由Microsoft开发,旨在提供跨浏览器的测试解决方案。与其他工具相比,Playwright的主要优势在于其对多种浏览器的支持、丰富的API以及处理动态内容的能力。
Python作为一种简洁且功能强大的编程语言,广泛用于数据分析、Web开发、自动化脚本等领域。Playwright与Python的结合使得开发者能够利用Python的简洁语法来编写高效的自动化测试脚本,从而简化了测试流程并提高了测试的可靠性。
本文将深入探讨如何使用Python和Playwright进行自动化测试,从环境准备到实际编写测试脚本,逐步带领读者掌握Playwright的使用方法。

Playwright是由Microsoft开发的开源自动化测试框架,它支持对现代Web应用程序进行跨浏览器的自动化测试。Playwright的核心功能包括:

  • 支持多种浏览器:Playwright支持Chromium(包括Google Chrome和Microsoft Edge)、Firefox和WebKit(用于Safari)的自动化测试。这使得用户能够在不同的浏览器环境中进行一致的测试。
  • 强大的API:Playwright提供了丰富的API来控制浏览器、与网页元素交互、处理网络请求等。这些API使得编写复杂的测试场景变得更加简便。
  • 自动等待功能:Playwright内置了自动等待机制,可以智能地等待页面元素出现或完成某些操作,从而减少了因异步操作带来的测试失败。
  • 录制和回放功能:Playwright支持对测试过程进行录制和回放,便于调试和查看测试执行过程中的实际情况。
  • 支持多语言:除了Python,Playwright还支持JavaScript、TypeScript、C#和Java等语言,使得它可以适用于不同的开发环境。

通过这些功能,Playwright帮助开发者更轻松地编写、维护和运行自动化测试脚本,提升了测试的效率和覆盖率。

二、基本用法

1. 安装

pip install playwright
playwright install		# 可选操作,这一步是安装浏览器,如果不安装则可使本地浏览器

2. 启动

Playwright允许您启动浏览器实例并创建浏览器上下文。浏览器上下文是一个独立的浏览器会话,您可以在其中执行测试操作而不会影响其他上下文。

以下是启动一个浏览器实例并创建上下文的代码示例:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    # 启动浏览器
    browser = p.chromium.launch(headless=False)  # headless=True 表示无头模式
    # 创建一个新的浏览器上下文
    context = browser.new_context()
    # 创建一个新的页面
    page = context.new_page()

在上述代码中,我们启动了一个Chromium浏览器实例,并创建了一个新的浏览器上下文和页面。您可以将chromium替换为firefoxwebkit以使用不同的浏览器。

3. 访问网页

在创建了页面实例后,您可以使用该页面对象打开网址并访问网页:

page.goto("https://example.com")

goto方法用于导航到指定的URL。Playwright将自动等待页面加载完成,您可以继续与页面进行交互。

4. 访问iframe

如果某个网页包含了iframe,必须切换到 iframe 的上下文中才可进行操作。

# 获取iframe元素
iframe_element = page.query_selector('iframe#my-iframe')
# 切换到iframe的上下文
frame = iframe_element.content_frame()
# 在iframe中进行操作
frame.fill('input[name="username"]', 'myusername')
frame.click('button[type="submit"]')

5. 截图操作

Playwright允许您将页面内容保存为截图, screenshot方法用于保存当前页面或指定元素的截图。您可以指定文件路径和其他选项(如截图区域):

# 截取指定元素
element = page.query_selector('div#example')
element.screenshot(path='element_screenshot.png')
# 截取当前页面
page.screenshot(path='screenshot.png')

6. 生成PDF

pdf方法用于将页面保存为PDF文件。您可以指定文件路径和其他选项(如页面尺寸):

  page.pdf(path='page.pdf')

7. 复用Cookie

# 保存状态
import json
storage = context.storage_state()
with open("state.json", "w") as f:
    f.write(json.dumps(storage))
 
# 加载状态
with open("state.json") as f:
    storage_state = json.loads(f.read())
context = browser.new_context(storage_state=storage_state)

使用已保存的Cookie字符串

# 将Cookie添加到浏览器上下文中
context.add_cookies(
[{
	'name': 'session_id',	# 对应的名字
	'value': '1234560',		# Cookie值
	'domain': 'example.com',  # 指定的域名
	'path': '/',  		# 生效的路径
	'httpOnly': True, 	# 防止JavaScript访问
	'secure': True, 	# 确保Cookie只能通过HTTPS传输
	'expires': -1  		# -1表示浏览器关闭后删除
}]
)

page = context.new_page()
page.goto("https://example.com")

三、元素定位

在Playwright中,定位网页元素是自动化测试的关键步骤。Playwright提供了多种方法来选择和操作网页元素,以下是常见的元素定位方法:

1. CSS选择器

CSS选择器是最常用的定位方法,您可以使用CSS选择器来选择各种元素。

# 选择ID为"example"的元素
element = page.query_selector('#example')

# 选择类名为"my-class"的第一个元素
element = page.query_selector('.my-class')

# 选择指定类型的元素
element = page.query_selector('input[type="text"]')

2. 文本选择器

Playwright允许通过元素的文本内容来选择元素。对于具有特定文本的元素,您可以使用文本选择器。

# 选择包含文本"Submit"的按钮
element = page.query_selector('text="Submit"')

# 选择包含文本"Welcome"的元素
element = page.query_selector('text="Welcome"')

3. XPath选择器

XPath是另一种强大的选择器,适用于复杂的选择条件。Playwright也支持XPath选择器。

# 选择ID为"example"的元素
element = page.query_selector('//div[@id="example"]')

# 选择具有特定文本的按钮
element = page.query_selector('//button[text()="Submit"]')

4. 属性选择器

您可以根据元素的属性来选择元素。这对于选择具有特定属性值的元素很有用。

# 选择name属性为"username"的输入框
element = page.query_selector('input[name="username"]')

# 选择所有具有data-test属性的元素
element = page.query_selector('[data-test]')

5. 伪类选择器

Playwright支持CSS伪类选择器,允许选择满足特定条件的元素。

# 选择第一个匹配的元素
element = page.query_selector(':nth-of-type(1)')

# 选择最后一个匹配的元素
element = page.query_selector(':last-of-type')

6. 子元素选择器

您可以选择特定的子元素或后代元素,以定位更复杂的页面结构中的元素。

# 选择具有ID为"parent"的元素下的所有子元素
element = page.query_selector('#parent >> div')

# 选择第一个子元素
element = page.query_selector('#parent >> div:first-child')

7. 过滤器选择器

Playwright允许在选择元素时使用过滤器条件,这对选择具有特定条件的元素很有帮助。

# 选择具有特定文本的按钮
element = page.query_selector('button:has-text("Submit")')

# 选择某个特定状态的元素
element = page.query_selector('input:enabled')

8. 链式选择器

您可以将多个选择器组合在一起,进一步精确定位元素。

# 选择ID为"container"的元素下具有特定类名的按钮
element = page.query_selector('#container .my-button')

四、元素交互

在Playwright中,与网页元素的交互是自动化测试的重要部分。Playwright提供了多种方法来操作和与网页上的元素进行交互。以下是Playwright支持的主要元素交互方式:

1. 点击元素

点击是最常用的交互操作之一。Playwright提供了多种点击方法,包括简单点击和带有选项的点击。

# 点击具有指定文本的元素
page.click('text="Submit"')

# 点击指定的元素
page.click('#example')

# 点击具有特定坐标的元素
page.click('#example', position={'x': 10, 'y': 20})

2. 输入文本

对于输入框和文本区域,您可以使用fill方法来输入文本。

# 填写指定输入框的文本
page.fill('input[name="username"]', 'myusername')

# 清除输入框中的文本并重新输入
page.fill('input[name="password"]', 'mypassword')

3. 键盘操作

Playwright允许模拟键盘按键,例如输入、删除和其他按键操作。

# 输入文本
page.fill('input[name="search"]', 'Playwright')

# 模拟按下回车键
page.press('input[name="search"]', 'Enter')

# 模拟按下键盘的Tab键
page.press('input[name="username"]', 'Tab')

# 组合键操作
page.press('input[name="textarea"]', 'Control+V')  # 粘贴

4. 选择下拉项

对于下拉菜单(<select>元素),可以使用select_option方法来选择特定的选项。

<select id="dropdown">
  <option value="1">Option 1</option>
  <option value="2">Option 2</option>
  <option value="3">Option 3</option>
</select>

对于上述下拉框有如下三种选择方式:

# 选择下拉框中的选项,指定文本内容为 'Option 2'
page.select_option('select#dropdown', label='Option 2')

# 选择下拉框中的第一个选项
page.select_option('select#dropdown', index=1)

# 选择下拉框中的选项,指定值为 '2'
page.select_option('select#dropdown', value='2')

5. 拖放操作

Playwright支持拖放操作,这对于测试拖拽功能非常有用。

# 拖动元素到目标位置
page.drag_and_drop('#source', '#target')

6. 滚动

您可以使用Playwright的滚动功能来滚动页面或元素。

# 滚动到页面的底部
page.evaluate('window.scrollTo(0, document.body.scrollHeight)')

# 滚动到特定的元素
element = page.query_selector('#element')
element.scroll_into_view()

7. 鼠标操作

Playwright允许模拟鼠标操作,如悬停、右击等。

# 悬停在元素上
page.hover('#example')

# 右击(上下文菜单)
page.click('#example', button='right')

8. 文件上传

对于文件上传功能,Playwright允许模拟文件选择操作。

# 上传文件
page.set_input_files('input[type="file"]', 'path/to/file.txt')

9. 断言

虽然不完全是交互操作,但断言用于验证操作结果,是测试的重要部分。

# 验证元素的文本内容
assert page.inner_text('#result') == 'Expected Text'

# 验证元素是否存在
assert page.query_selector('#element') is not None

10. 等待操作

等待操作用于确保元素处于特定状态后再进行交互。

# 等待元素出现
page.wait_for_selector('#example')

# 等待元素消失
page.wait_for_selector('#example', state='hidden')
page.wait_for_event("event", event_predict, timeout)
page.wait_for_function(js_function)
page.wait_for_load_state(state="domcontentloaded|load|networkidle", timeout)
page.wait_for_selector(selector, timeout)
page.wait_for_timeout(timeout)

五、实战

1. 模拟登录

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()

    # 访问登录页面
    page.goto('https://example.com/login')

    # 填写用户名和密码
    page.fill('input[name="username"]', 'myusername')
    page.fill('input[name="password"]', 'mypassword')

    # 提交登录表单
    page.click('button[type="submit"]')

    # 等待并验证登录成功
    page.wait_for_selector('text="Welcome, myusername"')
    assert page.inner_text('div.welcome') == 'Welcome, myusername'

    browser.close()

2. 自动购物

自动化测试一个电子商务网站的购物流程,包括搜索商品、添加到购物车和结算。

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()

    # 访问电子商务网站首页
    page.goto('https://example.com')

    # 搜索商品
    page.fill('input[name="search"]', 'laptop')
    page.click('button[type="search"]')

    # 选择第一个商品并添加到购物车
    page.click('div.product:nth-of-type(1) button.add-to-cart')

    # 访问购物车页面
    page.click('a.cart')

    # 结算
    page.click('button.checkout')

    # 确认订单
    page.fill('input[name="shipping_address"]', '123 Test Street')
    page.click('button.place-order')

    # 验证订单确认
    page.wait_for_selector('text="Thank you for your order!"')
    assert page.inner_text('div.confirmation') == 'Thank you for your order!'

    browser.close()

https://blog.csdn.net/wx17343624830/article/details/130622056
https://blog.csdn.net/m0_51156601/article/details/126886040
https://blog.csdn.net/Code_LT/article/details/120234307

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值