Playwright 是微软开源的自动化UI测试工具,支持Chrome、Firefox、Edge等多种浏览器,兼容多种语言、多种操作系统。

安装

pip install pytest-playwright
playwright install

测试

from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch(headless=False,args=['--start-maximized', '--no-sandbox'],chromium_sandbox=None,ignore_default_args=['--enable-automation'])page = browser.new_page()url = "https://www.xxx.com"page.goto(url, wait_until= "networkidle")print(page.title())print(page.content())locators = page.locator("#list")ct = await locators.count()for i in range(ct):url = await locators.nth(i).get_attribute("href")text = await locators.nth(i).locator("span").inner_text()browser.close()

模拟手机

playwright.devices可以配置模拟器。

import asyncio
from playwright.async_api import async_playwrightasync def run(playwright):iphone_12 = playwright.devices['iPhone 12']browser = await playwright.webkit.launch(headless=False)context = await browser.new_context(**iphone_12,)async def main():async with async_playwright() as playwright:await run(playwright)
asyncio.run(main())

忽略图片加载

使用page.route可以根据url忽略资源。

page = await browser.new_page()
await page.route("**/*.{png,jpg,jpeg}", lambda route: route.abort())
await page.goto("https://example.com")
await browser.close()

等待加载

page.expect_request可以指定某些资源的加载。

async with page.expect_request("http://example.com/resource") as first:await page.get_by_text("trigger request").click()
first_request = await first.value# or with a lambda
async with page.expect_request(lambda request: request.url == "http://example.com" and request.method == "get") as second:await page.get_by_text("trigger request").click()
second_request = await second.value

等待可以用wait_for_timeout,但是不建议用await asyncio.sleep(10)

await page.wait_for_timeout(10000)

监听响应

page.on可以监听事件,包含浏览器关闭、请求、响应等。

from playwright.sync_api import sync_playwrightdef on_response(response):if '/api/xx/' in response.url and response.status == 200:print(response.json())with sync_playwright() as p:browser = p.chromium.launch(headless=False)page = browser.new_page()page.on('response', on_response)page.goto('https://xx.com/')page.wait_for_load_state('networkidle')browser.close()

操作页面元素

cookie模拟登录

from playwright.sync_api import Playwright, sync_playwright
import jsondef run(playwright: Playwright) -> None:browser = playwright.chromium.launch(headless=False)# 加载cookiewith open("cookie.json") as f:storage_state = json.loads(f.read())context = browser.new_context(storage_state=storage_state)# Open new pagepage = context.new_page()# Go to http://www.glidedsky.com/loginpage.goto("http://www.xx.com/login")# Click input[name="email"]page.click("input[name=\"email\"]")# Fill input[name="email"]page.fill("input[name=\"email\"]", "账号")# Click input[name="password"]page.click("input[name=\"password\"]")# Fill input[name="password"]page.fill("input[name=\"password\"]", "密码")# Click button:has-text("Login")page.click("button:has-text(\"Login\")")# assert page.url == "http://www.glidedsky.com/"# 获得登录后 cookiestorage = context.storage_state()with open("cookie.json", "w") as f:f.write(json.dumps(storage))page.close()context.close()browser.close()with sync_playwright() as playwright:run(playwright)

获取网页的HTML

在 Playwright 中,可以使用 page.content() 方法获取当前页面的 HTML 内容。以下是一个简单的例子,展示如何使用 Playwright 获取一个网页的 HTML:

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://example.com')  html = await page.content()  print(html)  asyncio.run(main())

在上面的例子中,我们首先创建一个 Playwright 实例,然后启动一个 Chromium 浏览器。接下来,我们创建一个新的页面,并导航到 https://example.com。最后,我们使用 page.content() 方法获取当前页面的 HTML 内容,并将其打印出来。

请注意,page.content() 方法返回的是一个字符串,其中包含了整个 HTML 文档的内容。如果你需要获取某个特定元素的 HTML 代码,可以使用 page.evaluate() 方法执行 JavaScript 代码,然后使用 Playwright 的 DOM API 来获取元素的 HTML。例如,以下代码演示了如何获取一个页面的标题元素:

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://example.com')  title_element = await page.query_selector('h1')  title_html = await p.evaluate(title_element, fn)  print(title_html)  asyncio.run(main())

参考

https://github.com/microsoft/playwright
https://playwright.dev/python/docs/intro
https://playwright.dev/python/docs/api/class-playwright

Playwright 模拟浏览器、模拟手机、忽略图片加载、等待、监听、操作事件相关推荐

  1. android图片查看器,实现图片加载进度监听,实现保存图片

    1.添加依赖 implementation 'com.github.bumptech.glide:glide:4.6.1' compile 'com.github.chrisbanes:PhotoVi ...

  2. Glide4实现网络图片加载进度监听

    前言 我们都知道,使用Glide来加载一张网络上的图片是非常简单的,但是让人头疼的是,我们却无从得知当前图片的下载进度.如果这张图片很小的话,那么问题也不大,反正很快就会被加载出来.但如果这是一张比较 ...

  3. jquery 处理页面弹出层查询数据等待的操作(gif图片加载等待)

    $(document).ready(function(){layer.load(0);//初始化加载,可选范围(0-9)0表示等返回结果后关闭,1-9表示自动关闭时间(s) }); 当查询结果集返回后 ...

  4. 【懒加载】监听视图是否到达可视区域

    前言 功能参考饿了么的图片组件里的懒加载图片(地址) 想要实现在快滚动到底部的时候去动态加载图片,前面写到过的监听滚动条去做懒加载也可以做到,但是想用更优雅的写法来实现,即用本地占位图片来替换网络图片 ...

  5. 前人铺路系列组件hevue-img-preview 2.5更新,增加键盘控制,节流,图片加载等待等,来看看有没有你可以借鉴的思路或功能

    hello啊,every body ,大家好,之前我们(其实只有我自己啦,为什么用我们呢?可能是为了装作我有一个团队吧,也可能只是为了顺口

  6. UIL(单例框架)Android-Universal-Image-Loader (图片加载框架)

    对于早期使用的图片加载框架进行回顾,对UIL进行简单总结,学而时习之,不亦说乎? UIL(单例框架) 1.概述 Android-Universal-Image-Loader是一个开源的UI组件程序,该 ...

  7. 服务器图片加载慢_页面提高性能利器_懒加载

    哈喽,艾瑞巴蒂,现在搜狗商城产品需求已经趋于稳定,已经开始逐步的着手进行页面的性能提升工作.这不最近小编正在进行"页面懒加载需求"的功能测试.小编第一次听说这个名词,让我们一起了解 ...

  8. 为什么ps图片打开是色块_图片加载 背景色块问题

    就是CSS的加载和背景图片的加载不是同步的,尤其首次加载的时候,图片是异步的,具有明显的延迟,于是,我们会看到非常丑陋的色块在一瞬间出现了: 页面渲染流程如下,1. CSS加载:2. 对应DOM渲染, ...

  9. android 图片加载库 Glide 的使用介绍

    一:简介 在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide 的图片加载库,作者是bumptech.这个库被广泛的运用在google的开源项目中,包括2014年google I/O大会 ...

最新文章

  1. android linux 内核gpl,Android 内核分析
  2. Installing ROS 2 on Ubuntu20.04 Linux
  3. 二叉树最近公共祖先相关题目(Leetcode题解-Python语言)
  4. 安全生产六步法是什么_支塘镇探索“五步法”压紧压实出租厂房安全生产主体责任...
  5. 对俄罗斯应用“一刀切”,乌克兰知名开发商推出 Mac 专用反间谍软件
  6. Software Switching优化
  7. 三、synchronized同步锁
  8. POJ3080 ZOJ2784 UVALive3628 Blue Jeans题解
  9. 介绍4个大神常用而你不常用的python函数
  10. bzoj:2331: [SCOI2011]地板
  11. java编译器eclipse_java编译器eclipse
  12. Excel 函数大全
  13. 计算机考研数据结构代码题总结--Day01
  14. Linux version 4.19.90-2003.4.0.0036.oe1.aarch64安装carbonData
  15. mysql远程操作权限(navicat for mysql)
  16. 枚举---知识总结----------gyy加以整理以及改为C++方法
  17. 百度违规屏蔽关键词工具
  18. html5开发战棋游戏,个人耗时三月独立开发的无限流战棋游戏求龙友们给些建议。 ......
  19. 基于React的富文本编辑器——Braft Editor使用
  20. 四种常用的100G QSFP28光模块的详细介绍

热门文章

  1. FPGA 四画面视频拼接单元逻辑框图
  2. 什么是开源的「第一性原理」?
  3. matlab将图片写入指定文件夹,将图像写入图形文件
  4. jenkins日程表
  5. 【Linux】Linux安装firefox火狐浏览器(Cent OS 7)
  6. macOS Arduino esp8266下载慢的解决方法
  7. 数组倒序 c语言算法
  8. i7 980x支持服务器内存,同为6核12线程,8年前的i7-980X超到4.3GHz,差i7-8700K多少?...
  9. JAVA中Lombok插件详述
  10. 每天都在用,但你知道 Tomcat 的线程池有多努力吗?