zoukankan      html  css  js  c++  java
  • 潜水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

    •  

     

  • 相关阅读:
    应用Druid监控SQL语句的执行情况
    J2EE应用监控后台执行SQL
    maven环境搭建
    【机器学习】Sklearn库主成分分析PCA降维的运用实战
    PCA降维算法
    80行Python实现-HOG梯度特征提取(转载)
    HOG特征提取算法原理(转载)
    数据预处理方法 总结
    【AI换脸】Faceswap源代码换脸软件安装指南(转)
    人工智能领域的会议和期刊(转载)
  • 原文地址:https://www.cnblogs.com/yanhuidj/p/15625219.html
Copyright © 2011-2022 走看看