初识Playwright——Web自动化新宠
文章目录
课程目标
- 理解Playwright是什么以及它的优势。
- 学会安装Playwright及其浏览器驱动。
- 掌握Playwright的基本使用方法
- 学习如何生成和运行自动化测试脚本。
- 学会创建和管理浏览器上下文。
- 掌握页面导航、元素定位和事件监听。
课程内容
1. Playwright简介
Playwright是一款强大的自动化测试工具,支持现代Web应用程序的自动化测试。它支持以下浏览器:
- Chromium
- Firefox
- WebKit
2. 安装Playwright
我们可以通过pip或conda来安装Playwright。以下是安装命令:
# 使用pip安装
pip install playwright
playwright install
# 使用conda安装
conda install playwright -c conda-forge
playwright install
3. 基本使用
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto('http://www.baidu.com')
print(page.title())
browser.close()
4. 浏览器上下文
浏览器上下文允许我们在隔离的环境中运行测试,每个上下文都是独立的。
创建浏览器上下文示例:
# 同步模式
context = browser.new_context()
5. 页面导航和元素交互
我们可以在页面上执行点击、填写表单等操作。
页面导航和元素交互示例:
page.goto('https://example.com/login')
page.fill('input[name="username"]', 'user1')
page.click('text=Sign in')
元素定位
-
ID选择器:使用page.locator(‘#my-id’)可以定位页面上id为"my-id"的元素。
-
类选择器:使用page.locator(‘.my-class’)可以定位页面上所有具有"my-class"类的元素。
-
标签名选择器:使用page.locator(‘div’)可以定位页面上所有的div元素。
-
链式定位:page.locator()的返回值本身也有locator()方法,可以链式地定位元素,例如page.locator(‘.my-class’).locator(‘.my-subclass’)会定位到所有具有"my-class"类的元素中,再次具有"my-subclass"类的元素。
-
文本内容:使用page.locator(‘:text(“my text”)’)来定位包含特定文本的元素,例如page.locator(‘:text(“Hello, World!”)’)可以定位页面上所有包含"Hello, World!"文本的元素。
-
特性选择器:使用page.locator(‘input[name=“username”]’)可以定位页面上所有name属性为"username"的input元素。
获取值
在Python的Playwright中,获取页面上的数据内容可以通过以下几种方法:
-
获取文本内容:使用
inner_text()
方法获取元素的文本内容。text = page.locator('#my-id').inner_text()
-
获取HTML内容:使用
inner_html()
方法获取元素的HTML内容。html_content = page.locator('#my-id').inner_html()
-
获取属性值:使用
get_attribute('attribute_name')
方法获取元素的特定属性值。value = page.locator('#my-id').get_attribute('value')
拖动
# 定位源元素
source = page.locator("#source-element")
# 指定拖动的目标位置,以像素为单位
target_x = 100 # 目标元素的x坐标
target_y = 200 # 目标元素的y坐标
# 执行拖动操作到指定位置
page.mouse.drag_and_drop_by(source, target_x, target_y)
等待
在Python的Playwright中,等待(Waiting)是一种重要的机制,用于确保在执行某些操作之前页面达到了某个特定的状态。以下是一些常用的等待方法:
- 等待页面加载完成
page.wait_for_load_state()
wait_for_load_state参数说明:
-
state (可选): 等待的加载状态,可以是以下三种之一:
- ‘load’: 等待load事件被触发。
- ‘domcontentloaded’: 等待DOMContentLoaded事件被触发。
- ‘networkidle’: 不推荐使用,等待至少500毫秒内没有网络连接。不要在测试中使用这个方法来等待页面加载完成,而应该依赖Web断言来评估页面的准备情况。 如果不指定,默认为’load’。
-
timeout (可选): 操作的最大时间(以毫秒为单位)。默认为30秒,传递0可以禁用超时。默认值可以通过browser_context.set_default_navigation_timeout()、browser_context.set_default_timeout()、page.set_default_navigation_timeout()或page.set_default_timeout()方法进行更改。
- 等待元素加载完成
element = page.locator(".Title--title--jCOPvpf")
element.wait_for()
wait_for参数:
- timeout: 可选参数,表示等待元素满足条件的最大时间(以毫秒为单位)。默认值为None,这意味着如果没有指定,将使用默认的超时时间,通常是30000毫秒(30秒)。可以通过- browser_context.set_default_timeout()或page.set_default_timeout()方法来改变默认的超时时间。如果传入0,则表示没有超时限制。
- state: 可选参数,表示等待元素达到的状态。默认值为’visible’。可以是以下几种状态之一:
- ‘attached’:等待元素出现在DOM中。
- ‘detached’:等待元素不在DOM中。
- ‘visible’:等待元素具有非空的边界框,并且没有设置visibility:hidden。注意,如果没有内容或设置了display:none的元素,其边界框为空,不被认为是可见的。
- ‘hidden’:等待元素要么不在DOM中,要么边界框为空,或者设置了visibility:hidden。这与’visible’选项相反。
- 等待元素可被选择
page.wait_for_selector(".Card--doubleCard--wznk5U4")
截图
- 对整个页面截图
page.screenshot(path='screenshot.png') # 保存截图
- 对特定元素截图
element = page.locator('selector') # 定位到元素 element.screenshot(path='element_screenshot.png') # 对该元素截图并保存
滚轮
page.mouse.wheel(0, 8000) # 将滚动条拉到最下保证数据加载
7. cookies管理
保存cookies
import json
import re
from playwright.sync_api import Playwright, sync_playwright, expect
import time
import pandas as pd
def run(playwright: Playwright) -> None:
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
page.goto("https://uland.taobao.com/sem/tbsearch")
storage_state = context.storage_state()
with open("cookies.json", 'w') as f:
json.dump(storage_state, f)
with sync_playwright() as playwright:
run(playwright)
加载cookies
import json
import re
from playwright.sync_api import Playwright, sync_playwright, expect
import time
import pandas as pd
def run(playwright: Playwright) -> None:
browser = playwright.chromium.launch(headless=False)
with open("cookies.json", 'r') as f:
storage_state = json.load(f)
context = browser.new_context(storage_state=storage_state)
page = context.new_page()
page.goto("https://uland.taobao.com/sem/tbsearch")
pass
with sync_playwright() as playwright:
run(playwright)
8. 录制自动化脚本
Playwright可以生成自动化测试脚本。
playwright codegen https://example.com