一、简介
在现代软件开发中,自动化测试已成为确保代码质量和提升开发效率的重要工具。它不仅能帮助开发者快速发现并修复问题,还能减少手动测试的工作量。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
替换为firefox
或webkit
以使用不同的浏览器。
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