潜水-pw

1. 为什么选择Playwright

1.1 Playwright的优势

(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

  •  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章