• Python Playwright 基本使用(步骤详细)


    一、简介

    二、为什么选择 Playwright

    • Playwright 的优势

      1、Selenium 需要通过 WebDriver 操作浏览器;Playwright 通过开发者工具与浏览器交互,安装简洁,不需要安装各种 Driver

      2、Playwright 几乎支持所有语言,且不依赖于各种 Driver,通过调用内置浏览器所以启动速度更快。

      3、Selenium 基于 HTTP 协议(单向通讯),Playwright 基于 Websocket(双向通讯)可自动获取浏览器实际情况。

      4、Playwright 为自动等待,而在 Selenium 中经常需要写 sleep 去作为一个等待,保证程序正常运行。

      • 等待元素出现(定位元素时,自动等待30s,等待时间可以自定义,单位毫秒)

      • 等待事件发生

    • 已知局限性

      1、Playwright 不支持旧版 Microsoft EdgeIE11。支持新的 Microsoft Edge(在 Chromium 上),所以对浏览器版本有硬性要求的项目不适用。

      2、需要 SSL 证书进行访问的网站可能无法录制,该过程需要单独定位编写。

    三、安装

    • 1)安装 (Playwright 支持 Async\Await 语法,故需要 Python3.7+

      $ pip install playwright
      
      • 1
    • 2)安装 ChromiumFirefoxWebKit等浏览器的驱动文件(内置浏览器)和 ffmpeg 用于视频录制

      注意,下面这种安装方式安装,会安装所有驱动文件,如果需要打包成 exe/app 文件还会报错 Please run the following command to download new browsers,所以可以按需安装就行。

      # 全装
      $ python -m playwright install
      
      # 按需安装,重新安装一下(chromium 是其中一个浏览器插件,看自己用什么就装什么) # Expecting one of: chromium, chrome, chrome-beta, msedge, msedge-beta, msedge-dev, firefox, webkit 
      # PLAYWRIGHT_BROWSERS_PATH=0 是为了支持 pyinstaller 打包报错 Please run the following command to download new browsers 问题
      $ PLAYWRIGHT_BROWSERS_PATH=0 playwright install chromium
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

    四、案例

    • 案例一(同步案例)

      # 导入
      from playwright.sync_api import Playwright, sync_playwright
      # 导入 定时器
      # from time import sleep
      
      # 创建浏览器
      def run (playwright: Playwright) -> None:
      
        # 创建浏览器
        browser = playwright.chromium.launch(headless=False)
      
        # 使用 selenium 如果要打开多个网页,需要创建多个浏览器,但是 playwright 中只需要创建多个上下文即可
        # 例如:content1 = browser.new_context()、content2 = browser.new_context() 分别去访问网页做处理
        content = browser.new_context()
      
        # 每个 content 就是一个会话窗口,可以创建自己的页面,也就是浏览器上的 tab 栏,在每个会话窗口中,可以创建多个页面,也就是多个 tab 栏
        # 例如:page1 = content.new_page()、page2 = content.new_page() 封面去访问页面
        page = content.new_page()
      
        # 页面打开指定网址
        page.goto('https://www.baidu.com')
      
        # 找到百度输入框( locator 会自动识别传入的选择器是 css xpath .... 不需要像 selenium 指定 By.XPATH/ID 这样的 )
        # page.locator('//input[@id="kw"]').fill('周杰伦') # 也可以写成下面这样:
        page.fill('//input[@id="kw"]', '周杰伦')
      
        # 点击百度一下进行搜索
        # page.locator('//input[@id="su"]').click() # 也可以写成下面这样:
        page.click('//input[@id="su"]')
      
        # 延迟关闭(为啥需要延迟一下,这里是用于测试,因为代码执行完马上就回关闭,运行太快了,还以为崩溃了
        # 暂时没找到配置不需要进行自动关闭,但是肯定跟 selenium 一样有这个配置)
        # sleep(10) # 之前使用使用 sleep 的方式进行等待,传入的是单位是秒
        # 但是在 playwright 中有自带的延迟等待,单位是毫秒
        page.wait_for_timeout(10000)
      
        # 使用完成关闭上下文(也就是会话窗口)
        content.close()
      
        # 关闭浏览器
        browser.close()
      
      # 调用
      with sync_playwright() as playwright:
        run(playwright)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
    • 案例二 (有 hover)

      # 导入
      from playwright.sync_api import Playwright, sync_playwright
      
      # 创建浏览器
      def run (playwright: Playwright) -> None:
      
        # 创建浏览器
        browser = playwright.chromium.launch(headless=False)
      
        # 新建窗口
        content = browser.new_context()
      
        # 新建页面
        page = content.new_page()
      
        # 访问首页
        page.goto('https://hepai.video/')
      
        # 点击登录
        page.click('//a[@href="/login"]')
      
        # 延迟
        page.wait_for_timeout(1000)
      
        # 密码登录
        page.click('//a[contains(text(), "密码登录")]')
      
        # 写入账号
        page.fill('//input[@id="username"]', 'xxxx')
      
        # 写入密码
        page.fill('//input[@id="password"]', 'dzm123456')
      
        # 点击登录
        page.click('//button[@type="submit"]')
      
        # 延迟
        page.wait_for_timeout(1000)
      
        # hover 出菜单(失败)
        # page.hover('//div[@class="nav-adv nav-adv-home u-info"]/p')
        # page.wait_for_selector('//div[@class="nav-adv nav-adv-home u-info"]/ul', state='visible', timeout=30000)
        # page.locator('//div[@class="nav-adv nav-adv-home u-info"]/ul')
        # 延迟
        # page.wait_for_timeout(1000)
        # 点击财务管理
        # page.click('//a[@href="/pipeline-record"]')
      
        # 上面 hover 失败,那就直接手动加载网页
        page.goto('https://hepai.video/pipeline-record')
      
        # 延迟
        page.wait_for_timeout(1000)
      
        # hover 出菜单
        page.hover('//div[@class="u-info"]/img')
      
        # 退出登录
        page.click('//a[contains(text(), "退出登录")]')
      
        # 点击确定按钮
        page.click('//button/span[contains(text(), "确")]/..')
      
        # 延迟
        page.wait_for_timeout(10000)
      
        # 关闭上下文
        content.close()
      
        # 关闭浏览器
        browser.close()
      
      # 调用
      with sync_playwright() as playwright:
        run(playwright)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
      • 59
      • 60
      • 61
      • 62
      • 63
      • 64
      • 65
      • 66
      • 67
      • 68
      • 69
      • 70
      • 71
      • 72
      • 73
      • 74
      • 75
  • 相关阅读:
    Kafka 高并发设计之数据压缩与批量消息处理
    VAD打断方案
    Spring Aop原理解析和使用示例
    房产网源码 房产中介小程序源码 房产门户网站源码
    C# HTML
    38、Java——汽车租赁系统(JDBC+MySQL+Apache DBUtils)
    python内置函数 R
    C语言汇总
    2022-09-09 Unity InputSystem1——概述
    java运行linux命令时报错
  • 原文地址:https://blog.csdn.net/zz00008888/article/details/127950173