Playwright 模拟浏览器、模拟手机、忽略图片加载、等待、监听、操作事件
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 模拟浏览器、模拟手机、忽略图片加载、等待、监听、操作事件相关推荐
- android图片查看器,实现图片加载进度监听,实现保存图片
1.添加依赖 implementation 'com.github.bumptech.glide:glide:4.6.1' compile 'com.github.chrisbanes:PhotoVi ...
- Glide4实现网络图片加载进度监听
前言 我们都知道,使用Glide来加载一张网络上的图片是非常简单的,但是让人头疼的是,我们却无从得知当前图片的下载进度.如果这张图片很小的话,那么问题也不大,反正很快就会被加载出来.但如果这是一张比较 ...
- jquery 处理页面弹出层查询数据等待的操作(gif图片加载等待)
$(document).ready(function(){layer.load(0);//初始化加载,可选范围(0-9)0表示等返回结果后关闭,1-9表示自动关闭时间(s) }); 当查询结果集返回后 ...
- 【懒加载】监听视图是否到达可视区域
前言 功能参考饿了么的图片组件里的懒加载图片(地址) 想要实现在快滚动到底部的时候去动态加载图片,前面写到过的监听滚动条去做懒加载也可以做到,但是想用更优雅的写法来实现,即用本地占位图片来替换网络图片 ...
- 前人铺路系列组件hevue-img-preview 2.5更新,增加键盘控制,节流,图片加载等待等,来看看有没有你可以借鉴的思路或功能
hello啊,every body ,大家好,之前我们(其实只有我自己啦,为什么用我们呢?可能是为了装作我有一个团队吧,也可能只是为了顺口
- UIL(单例框架)Android-Universal-Image-Loader (图片加载框架)
对于早期使用的图片加载框架进行回顾,对UIL进行简单总结,学而时习之,不亦说乎? UIL(单例框架) 1.概述 Android-Universal-Image-Loader是一个开源的UI组件程序,该 ...
- 服务器图片加载慢_页面提高性能利器_懒加载
哈喽,艾瑞巴蒂,现在搜狗商城产品需求已经趋于稳定,已经开始逐步的着手进行页面的性能提升工作.这不最近小编正在进行"页面懒加载需求"的功能测试.小编第一次听说这个名词,让我们一起了解 ...
- 为什么ps图片打开是色块_图片加载 背景色块问题
就是CSS的加载和背景图片的加载不是同步的,尤其首次加载的时候,图片是异步的,具有明显的延迟,于是,我们会看到非常丑陋的色块在一瞬间出现了: 页面渲染流程如下,1. CSS加载:2. 对应DOM渲染, ...
- android 图片加载库 Glide 的使用介绍
一:简介 在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide 的图片加载库,作者是bumptech.这个库被广泛的运用在google的开源项目中,包括2014年google I/O大会 ...
最新文章
- android linux 内核gpl,Android 内核分析
- Installing ROS 2 on Ubuntu20.04 Linux
- 二叉树最近公共祖先相关题目(Leetcode题解-Python语言)
- 安全生产六步法是什么_支塘镇探索“五步法”压紧压实出租厂房安全生产主体责任...
- 对俄罗斯应用“一刀切”,乌克兰知名开发商推出 Mac 专用反间谍软件
- Software Switching优化
- 三、synchronized同步锁
- POJ3080 ZOJ2784 UVALive3628 Blue Jeans题解
- 介绍4个大神常用而你不常用的python函数
- bzoj:2331: [SCOI2011]地板
- java编译器eclipse_java编译器eclipse
- Excel 函数大全
- 计算机考研数据结构代码题总结--Day01
- Linux version 4.19.90-2003.4.0.0036.oe1.aarch64安装carbonData
- mysql远程操作权限(navicat for mysql)
- 枚举---知识总结----------gyy加以整理以及改为C++方法
- 百度违规屏蔽关键词工具
- html5开发战棋游戏,个人耗时三月独立开发的无限流战棋游戏求龙友们给些建议。 ......
- 基于React的富文本编辑器——Braft Editor使用
- 四种常用的100G QSFP28光模块的详细介绍
热门文章
- FPGA 四画面视频拼接单元逻辑框图
- 什么是开源的「第一性原理」?
- matlab将图片写入指定文件夹,将图像写入图形文件
- jenkins日程表
- 【Linux】Linux安装firefox火狐浏览器(Cent OS 7)
- macOS Arduino esp8266下载慢的解决方法
- 数组倒序 c语言算法
- i7 980x支持服务器内存,同为6核12线程,8年前的i7-980X超到4.3GHz,差i7-8700K多少?...
- JAVA中Lombok插件详述
- 每天都在用,但你知道 Tomcat 的线程池有多努力吗?