Playwright的使用


Playwright的使用

介绍

Playwright 是微软推出的自动化测试工具,能实现 Selenium 的同步模式和 Pyppteer 的异步模式,功能强大.

官方文档

环境配置

第三方包下载

pip install playwright

初始化

playwright install

该指令会下载一些浏览器并配置驱动.

使用

同步模式和异步模式

同步模式

对于同步模式,需要导入 sync_playwright 方法,该方法返回一个同步的上下文管理器 PlaywrightContextManager,样例代码如下

from playwright.sync_api import sync_playwright

url = ""

with sync_playwright() as p:
    for browser_type in [p.chromium,p.firefox,p.webkit]:
        browser = browser_type.launch(headless = False)  ## 默认为 true,需要修改才能看到页面
        page = browser.new_page()
        page.goto(url)
        print(page.title)
        page.screenshot(path = f"screenshot-{browser_type.name}.png")
        browser.close()

异步模式

当我们的方法中有了 async 关键字的时候,我们就需要使用异步模式,导入 async_playwright 方法即可.

示例代码:

from playwright.async_api import async_playwright
import asyncio

url = "

async def main():
    async with async_playwright as p:
        for browser_type in [p.chromium,p.firefox,p.webkit]:
            browser = await browser_type.launch(headless = False)  ## 默认为 true,需要修改才能看到页面
            page = await browser.new_page()
            await page.goto(url)
            print( await page.title)
            await page.screenshot(path = f"screenshot-{browser_type.name}.png")
            await browser.close()

代码生成

playwright 最厉害的地方就是代码生成.通过录制我们在浏览器中的操作生成对应的代码.

该功能通过 playwright 命令行调用 codegen 实现

通过

playwright codegen -h ##查看帮助

常用参数

  • -o:输出代码文件路径
  • -target:使用的语言,默认为 python,是同步模式的 python,也可选择 python-async 表示异步 python,或者其他语言
  • -device:模拟手机浏览器
  • -b:浏览器类型,默认为 chromium
  • -timeout: 设置页面加载的超时时间
  • -lang:浏览器使用的语言

移动端浏览器

playwrigh 也支持移动端的模拟器,同归对 PlaywrightContextManager 对象的 devices 属性指定一台移动设备即可,输入参数为移动设备的型号.

实例代码:

from playwright.sync_api import sync_playwright

url = ""

with sync_playwright() as p:
    device = p.devices["IPhone 13 Pro Max"]
    browser = p.webkit.launch(headless = False)
    pass

选择器

文本选择

通过 text= 这样的语法能直接获得文本内容是指定内容的节点

例如

page.click("text= Log in") ##选择文本为 Log in 的节点进行 click

CSS 选择器

CSS 前面的博客已经提到过,. 表示 class,# 表示 id

厉害的是 playwright 的 CSS 选择器能结合其他的方式.

  • 结合文本:使用 has-text 和 text 能结合文本值寻找.前者是包含特定文本值,后者是完全匹配

示例:

page.click(".item :has-text('XXX')")
page.click("#nav-bar :text('XXX')")
  • 节点关系:还可以结合节点关系来筛选节点, has 指定包含另外一个节点的节点, right-of 指定位于某个节点右侧的节点

示例

page.click(".item :has(#nav-bar)")
page.click(".item :right-of(:text('XXX'))")

XPATH

XPATH 选择器的输入应该为: xpath=

例如:

page.click("xpath=//button")

事件监听

Page 对象提供了一个 on 方法,可用来监听页面发生的各个事件,例如 close,console,load,request,response 等

例如我们监听 response

from playwright.sync_api import sync_playwright

url = ""

def on_response(response):
    print(f'Status:{response.status} {response.json()}')

with sync_playwright as p:
    browser = p.firefox.launch(headless = False)
    page = browser.new_page()
    page.on("response",on_response)
    page.wait_for_state("networkidle") ## 等待没有 network connection
    page.goto(url)

页面点击

page.click 实现页面点击,下面是参数介绍

  • selector: 选择器
  • click_count: 点击次数
  • timeout: 超时时间,默认为 30
  • position: 传入一个字典,带有 x 和 y 属性,代表偏移量
  • force: 如果无法点击,设置强制点击,默认为 False

页面等待

  • wait_for_load_state: 等待进入某一个状态,分别是
    • load: 等待加载事件被触发。
    • domcontentloaded: 等待 DOMContentLoaded 被触发
    • networkidle: 等待所有的 network connection 结束

文本输入

page.fill 方法能输入文本,需要传入选择器和文本内容,另外可通过可选参数决定 timeout

节点获取

获取单个节点

query_selector() 方法返回符合选择器的第一个节点

获取多个节点

query_selector_all() 方法返回符合选择器的所有节点

获取节点属性

get_attribute 方法能获取节点属性,如果是 page 对象调用,则需要传入选择器,节点则不需要

网络劫持

route 方法能实现网络劫持和修改,该方法传入 url 和 回调函数,当检测到指定的 url 之后,会交给 回调函数处理,比如,实现加载本地文件

from playwright.sync_api import sync_playwright

def hack(route,response):
    route.fulfill(path = 'xx')

with sync_playwright as p:
    browser = p.firefox.launch(headerless = False)
    url = ""
    page = browser.new_page()
    page.route("/",hack)
    page.goto(url)
    browser.close()

Author: Dovahkiin
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Dovahkiin !
  TOC