聊一聊Playwright-python

2,089 阅读4分钟

这是我参与更文挑战的第4天,活动详情查看: 更文挑战

什么是 Playwright-python

Playwright 可在所有现代浏览器中实现快速、可靠且功能强大的自动化。

本指南涵盖了这些关键差异化因素,以帮助您为自动化测试选择合适的工具。

  • 支持所有浏览器

  • 快速可靠的执行

  • 强大的自动化能力

  • 与您的工作流程集成

  • 限制

  • 发行说明

支持多种浏览器(3.8版本python安装了chromium、firefox、webkit、ffmpeg 四种浏览器驱动)


在 Chromium、Firefox 和 WebKit 上进行测试。



**

Playwright 拥有适用于所有现代浏览器的完整 API,包括 Google Chrome 和 Microsoft Edge(带有Chromium)、Apple Safari(带有WebKit)和 Mozilla Firefox。  

跨平台 WebKit 测试。



**

借助 Playwright,使用适用于 Windows、Linux 和 macOS 的 WebKit 构建测试您的应用在 Apple Safari 中的行为。在本地和 CI 上进行测试。

测试手机。



**

使用设备模拟在移动 Web 浏览器中测试您的响应式 Web 应用程序。  

无头和有头



**

Playwright 支持所有浏览器和所有平台的无头(无浏览器 UI)和有头(带浏览器 UI)模式

Headed 非常适合调试,而 Headless 速度更快,适合 CI/云执行

快速可靠的执行


自动等待 API。



**

Playwright interactions会

自动等待元素

准备就绪。这提高了可靠性并简化了测试编写。

无超时自动化。



**

Playwright 接收浏览器信号,如网络请求、页面导航和页面加载事件,以消除导致不稳定的睡眠超时的需要。

与浏览器上下文的精益并行化。



**

将单个浏览器实例重用于具有

浏览器上下文的

多个并行化、隔离的执行环境。

弹性元素选择器。



**

剧作家可以依靠面向用户的字符串(如文本内容和可访问性标签)来

选择元素

。

这些字符串比紧密耦合到 DOM 结构的选择器更具弹性。

强大的自动化功能


多个域、页面和框架。



**

Playwright 是一个进程外自动化驱动,不受页内 JavaScript 执行范围的限制,可以自动化

多页场景。

强大的网络控制。



**

Playwright 引入了上下文范围的

网络拦截

来存根和模拟网络请求。

现代网络功能。



**

Playwright 通过

阴影穿透选择器

、

地理定位、权限

、网络工作者和其他现代网络 API支持网络组件。

覆盖所有场景的能力。



**

支持文件下载和上传、进程外 iframe、本机输入事件,甚至暗模式。

安装

准备Python3.8版本的环境,我用了python3.9的环境 在安装谷歌驱动的时候始终卡在最后一步下不去,网上也没找到什么好的解释。在我就要放弃的时候,重新安装了python3.8的环境,并且架了梯子,终于安装成功了。所以你如果安装失败了,可以试试用python3.8的环境看看

新建一个python项目

安装依赖

pip install playwright

python -m playwright install

安装完成

使用

官方文档:playwright.dev/python/docs…

Github地址:github.com/microsoft/p…

接下来我们看看官方文档

读取链接标题

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    # 选择浏览器
    browser = p.chromium.launch()
    #打开页面跳转至 https://blog.csdn.net/tangcv
    page = browser.new_page()
    page.goto("https://blog.csdn.net/tangcv")
    # 打印标签
    print(page.title())
    browser.close()

Playwright 支持 API 的两种变体:同步和异步。

如果您的现代项目使用 asyncio,您应该使用 async API:

import asyncio
from playwright.async_api import async_playwright

async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch()
        page = await browser.new_page()
        await page.goto("https://blog.csdn.net/tangcv")
        print(await page.title())
        await browser.close()

asyncio.run(main())

屏幕截图

减慢浏览器访问速度

chromium.launch(headless=False, slow_mo=50)

记录脚本

命令行界面 CLI 可用于记录用户交互并生成 Python 代码。

浏览器打开页面 blog.csdn.net/tangcv

playwright codegen https://blog.csdn.net/tangcv

浏览器全部操作都会录制成脚本

from playwright.sync_api import sync_playwright

def run(playwright):
    browser = playwright.chromium.launch(headless=False)
    context = browser.new_context()

    # Open new page
    page = context.new_page()

    # Go to https://www.wikipedia.org/
    page.goto("https://www.wikipedia.org/")

    # Go to https://mp.weixin.qq.com/s/-i8E_jeApjQ2bGASk-ai9w
    page.goto("https://mp.weixin.qq.com/s/-i8E_jeApjQ2bGASk-ai9w")

    # Click text=阅读原文 阅读
    page.click("text=阅读原文 阅读")

    # Click p:nth-child(169)
    page.click("p:nth-child(169)")

    # Click text=移动联通电信话费91折充值
    page.click("text=移动联通电信话费91折充值")
    # assert page.url == "https://mp.weixin.qq.com/s?__biz=MzI3NjYxMzI1NQ==&mid=2247484610&idx=2&sn=cafaa6f7cf2287b6c06fecf1b95eb8d8&chksm=eb73952adc041c3c6fd3863ecf7914809026092b32286138e2b959035b848f24bc5f520e167c&scene=21#wechat_redirect"

    # Click p:has-text("慢充24-72小时到账")
    page.click("p:has-text(\"慢充24-72小时到账\")")

    # Click span:has-text("移动联通电信话费")
    page.click("span:has-text(\"移动联通电信话费\")")

    # Click img[alt="图片"]
    page.click("img[alt=\"图片\"]")

    # Click text=程序工厂 程序工厂 微信号 fuwuhao911 功能介绍 专注于黑科技软件、最新影视资源、外卖优惠券、电商优惠券、以及各种收费资源 1周前
    page.click("text=程序工厂 程序工厂 微信号 fuwuhao911 功能介绍 专注于黑科技软件、最新影视资源、外卖优惠券、电商优惠券、以及各种收费资源 1周前")

    # Go to https://mp.weixin.qq.com/s/-i8E_jeApjQ2bGASk-ai9w
    page.goto("https://mp.weixin.qq.com/s/-i8E_jeApjQ2bGASk-ai9w")

    # Click #page-content
    page.click("#page-content")

    # ---------------------
    context.close()
    browser.close()

with sync_playwright() as playwright:
    run(playwright)

录制的代码可直接运行

可以减少很多开发时间