潜水-pw
(1) Selenium需要通过WebDriver操作浏览器;Playwright通过开发者工具与浏览器交互,安装简洁,不需要安装各种Driver。
(2) Playwright几乎支持所有语言,且不依赖于各种Driver,通过调用内置浏览器所以启动速度更快。
(3) Selenium基于HTTP协议(单向通讯),Playwright基于Websocket(双向通讯)可自动获取浏览器实际情况。
(4) Playwright为自动等待。
-
等待元素出现(定位元素时,自动等待30s,等待时间可以自定义,单位毫秒)
-
等待事件发生
1.2 已知局限性
(1) Playwright不支持旧版Microsoft Edge或IE11。支持新的Microsoft Edge(在Chromium上);所以对浏览器版本有硬性要求的项目不适用。
(2) 需要SSL证书进行访问的网站可能无法录制,该过程需要单独定位编写。
(3) 移动端测试是通过桌面浏览器来模拟移动设备(相当于自带模拟器),无法控制真机。
注意:python 版本需要在3.7 以上
1.pip install playwright 安装playwright 依赖
2.python -m playwright install 安装chromium,webkit,firefox 依赖
3.python -m playwright codegen 记录浏览器行为就是录制
4.python3 -m playwright codegen --help 查看帮助
5.python -m playwright codegen --target python -o 'shortcut.py' -b chromium https://www.baidu.com
监听百度行为
6.也可以录制视频
from playwright import sync_playwright
with sync_playwright() as p:
for browser_type in [p.chromium, p.firefox, p.webkit]:
browser = browser_type.launch()
page = browser.newPage()
page.goto('http://baidu.com/')
page.screenshot(path=f'example-{browser_type.name}.png')
browser.close()
7.参数
-
-o, --output <file name>
:保存生成脚本 -
--target <language>
:生成的脚本语言,可以设置javascript, test, python, python-async和csharp,默认为python。 -
-b, --browser <browserType>
:要使用的浏览器,可以选择cr, chromium, ff, firefox, wk和webkit,默认chromium。 -
--channel <channel>
:chromium版本,比如chrome, chrome-beta, msedge-dev等, -
--color-scheme <scheme>
:模拟器的颜色主题,可选择light 或者 dark样式。 -
--device <deviceName>
:模拟的设备,比如iPhone 11。 -
--save-storage <filename>
:保存上下文状态,用于保存cookies 和localStorage,可用它来实现重用。例如playwright codegen --save-storage=auth.json
-
--load-storage <filename>
:加载--save-storage
保存的数据,重用认证数据。 -
--proxy-server <proxy>
:指定代理服务器 -
--timezone <time zone>
: 指定时区 -
--geolocation <coordinates>
:指定地理位置坐标 -
--lang <language>
:指定语言/地区,比如中国大陆:zh-CN -
--timeout <timeout>
:超时时间,定位毫秒,默认10000ms -
--user-agent <ua string>
:用户代理 -
--viewport-size <size>
:浏览器窗口大小 -
-h, --help
:查看帮助信息
8.模拟手机器打开iphone12 pro
playwright codegen -o test_playwright.py --target python -b chromium --device="iPhone 12 Pro" https://www.baidu.com/
9.录制命令
npx playwright codegen [options] [url]
10.同步demo
# -------
import time
from playwright.sync_api import sync_playwright
def testcase1():
print('testcase1 start')
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto("https://www.baidu.com/")
print(page.title())
page.fill("input[name=\"wd\"]", "test")
page.click("text=百度一下")
page.click("#page >> text=2")
browser.close()
print('testcase1 done')
def testcase2():
print('testcase2 start')
with sync_playwright() as p:
browser2 = p.chromium.launch(headless=False)
page2 = browser2.new_page()
page2.goto("https://www.sogou.com/")
print(page2.title())
page2.fill("input[name=\"query\"]", "test")
page2.click("text=搜狗搜索")
page2.click("#sogou_page_2")
browser2.close()
print('testcase2 done')
start = time.time()
testcase1()
testcase2()
end = time.time()
print('Running time: %s Seconds'%(end-start))
11.异步demo
# -------
import asyncio
import time
from playwright.async_api import async_playwright
async def testcase1():
print('testcase1 start')
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
page = await browser.new_page()
await page.goto("https://www.baidu.com/")
print(await page.title())
await page.fill("input[name=\"wd\"]", "test")
await page.click("text=百度一下")
await page.click("#page >> text=2")
await browser.close()
print('testcase1 done')
async def testcase2():
print('testcase2 start')
async with async_playwright() as p:
browser2 = await p.chromium.launch(headless=False)
page2 = await browser2.new_page()
await page2.goto("https://www.sogou.com/")
print(await page2.title())
await page2.fill("input[name=\"query\"]", "test")
await page2.click("text=搜狗搜索")
await page2.click("#sogou_page_2")
await browser2.close()
print('testcase2 done')
async def main():
task1 = asyncio.create_task(testcase1())
task2 = asyncio.create_task(testcase2())
tasks = [task1,task2]
print('before await')
await asyncio.gather(*tasks)
start = time.time()
asyncio.run(main())
end = time.time()
print('Running time: %s Seconds'%(end-start))
12.异步执行效果是同步的一半,效率大大提高
13.启动浏览器4种方式
chrome
browser = p.chromium.launch(channel="chrome", headless=False)
Microsoft Edge
browser = p.chromium.launch(channel="msedge", headless=False)
firefox
browser = p.firefox.launch(headless=False)
webkit
browser = p.webkit.launch(headless=False)
14.上下午切换
browser = p.chromium.launch(channel="chrome", headless=False)
15.browser是一个Chromium实例,创建实例其实是比较耗费资源的,Playwright支持在一个browser实例下创建多个浏览器上下文(BrowserContext),BrowserContext的创建速度很快,并且比创建browser实例消耗资源更少。对于多页面场景可以使用创建浏览器上下文的方式。
import asyncio
from playwright.async_api import async_playwright
async def testcase1(): print('testcase1 start') async with async_playwright() as p: browser = await p.chromium.launch(headless=False) page = await browser.new_page() await page.goto("https://www.baidu.com/") print(await page.title()) await page.fill("input[name="wd"]", "test") await page.click("text=百度一下") await page.click("#page >> text=2")
context = await browser.new_context()
page2 = await context.new_page()
await page2.goto("https://www.sogou.com/")
print(await page2.title())
await page2.fill("input[name=\"query\"]", "test")
await page2.click("text=搜狗搜索")
await page2.click("#sogou_page_2")
print(await page.title())
print('testcase1 done')
asyncio.run(testcase1())
16.多页面
async def testcase2(): print('testcase2 start') async with async_playwright() as p: browser = await p.chromium.launch(headless=False) context = await browser.new_context() page1 = await context.new_page() await page1.goto("https://www.sogou.com/") print(await page1.title()) await page1.fill("input[name="query"]", "test") await page1.click("text=搜狗搜索") await page1.click("#sogou_page_2")
page2 = await context.new_page()
await page2.goto("https://www.baidu.com/")
print(await page2.title())
print('testcase2 done')
17.断言
assert page.title() == "百度一下,你就知道"
18.断言匹配器
https://pyhamcrest.readthedocs.io/en/v2.0.2/tutorial/
pip install PyHamcrest
from hamcrest import * assert_that(page.title(), equal_to("百度一下,你就知道"))
(1)元素定位
-
选择单个元素:querySelector(engine=body)
-
选择多个元素:querySelectorAll(engine=body)
-
选择单个元素,并且自动等待:waitForSelector(engine=body)
By的8种定位方式,实际为4种
id、name、tag name、class name(java和pythona将该4种都归为CSS)
xpath、link text、partial link text、css selector
W3C标准规定的webDriver协议为5种定位方式
CSS、Link text、Partial link text、Tag name、XPath
Playwright将选择器汇总为3种
CSS、XPATH(支持逻辑表达式和函数)、TEXT
(2)选择器规则
-
CSS: ID选择器、类选择器、元素选择器、属性选择器、通配选择器、层次选择器。
-
XPath: XML路径语言,通过“路径标识符”,导航XML文档的,在类XML种(HTML)也可以使用。
-
Text: 结构化内容(html,xml,json)使用模糊匹配(忽略大小写,忽略前后空格,搜索子字符串)及精确匹配、非结构化内容使用正则匹配。
(3)元素常用操作
-
下拉选择框:selectOpion、value、labei、index
-
文件上传:setInputFiles、单个文件、多个文件、拖放上传
-
鼠标点击:click、dbclick
-
鼠标拖动:down、up
-
鼠标移动:move
-
触摸屏幕:tag
-
键盘按键:press
-
截屏、录屏:screenshot、recordVideo
-