找回密码
 会员注册
查看: 39|回复: 0

Python-playwright:一款强大的UI自动化工具、新兴爬虫利器

[复制链接]

4

主题

0

回帖

13

积分

新手上路

积分
13
发表于 2024-9-4 15:56:43 | 显示全部楼层 |阅读模式
点击名片关注 阿尘blog,一起学习,一起成长本文主要分享由微软开发的实现WebUI自动化测试工具Playwright库,相比于之前学习过selenium库,playwright对于编写自动化代码绝对是更轻松了,因为它支持脚本录制,如果只求简单点可以不用写一行代码就能够实现自动化,而且playwright有许多强大的api,很多功能比起selenium都轻松简单,好了话不多说,开启正文~playwright简介和初步使用1.1playwright简介playwright优点(这里就直接摘抄一下官网的哈,不是重点)任意浏览器•全平台•同一套API跨浏览器。Playwright支持所有现代渲染引擎,包括:Chromium、WebKit和Firefox。跨平台。适用于Windows、Linux、macOS、本地运行、CI、headless和headed。跨语言。在TypeScript,JavaScript,Python,.NET,Java中使用PlaywrightAPI测试移动端Web。对Android和MobileSafari的GoogleChrome原生移动端模拟。与你的移动端和云端应用采用相同的渲染引擎。强适应性•测试不再容易失效自动等待(auto-waits)。Playwright能够自动等待元素达到可操作的状态,外加一系列丰富的内置事件。不用再人工定义超时(timeouts)——这是测试容易失效的主要原因。Web优先的断言。Playwright断言专门为动态加载的web应用设计。能够在满足需要的条件前自动重试。可追踪。通过配置重试策略,采用捕捉执行轨迹、视频、截图来解决测试容易失效的问题。不用再权衡取舍•不再有限制浏览器在不同进程中运行属于不同来源的Web内容。Playwright与现代浏览器架构保持一致,并在进程外运行测试。这使Playwright摆脱了典型的进程内测试运行程序限制。一切并行。跨越多个tabs,多个origins和多个users的测试场景。在一个测试中能够为不同的用户创建具有不同上下文的场景,并能在你的服务器上运行。可信事件。元素悬停(hover)、动态控件的交互、生产可信事件。Playwright使用与真实用户一致的输入方式(pipeline)。测试frames,穿透ShadowDOM。Playwright的选择器能够穿透shadowDOM和允许无缝输入frame。完全隔离•快速执行浏览器上下文。Playwright为每个测试创建一个浏览器上下文。浏览器上下文相当于一个全新的浏览器配置文件。这提供了零开销的完整测试隔离。创建一个新的浏览器上下文只需要几毫秒。一次登录。保存上下文的身份验证状态并在所有测试中重用它。这绕过了每个测试中的重复登录操作,但提供了独立测试的完全隔离。强大的工具Codegen。通过记录您的操作来生成测试。将它们保存为各种语言。Playwrightinspector。检查页面,生成选择器,逐步执行测试,查看点击点,浏览执行日志。TraceViewer。捕获所有的信息来调查失败了的测试,Playwright追踪包含测试运行截屏视频、实时DOM快照、动作浏览器、测试源等信息。1.2playwright安装与使用playwright的安装(python3.7+)pipinstallplaywrightPlaywright安装驱动,相比起selenium就简单多了python-mplaywrightinstallPlaywright录制脚本python-mplaywrightcodegen通过--help查看可以用哪些参数python-mplaywrightcodegen--helpUsage:playwrightcodegen[options][url]openpageandgeneratecodeforuseractionsOptions:-o,--outputsavesthegeneratedscripttoafile--targetlanguagetogenerate,oneofjavascript,playwright-test,python,python-async,python-pytest,csharp,csharp-mstest,csharp-nunit,java(default:"python")--save-tracerecordatraceforthesessionandsaveittoafile--test-id-attribute .page.locator(':has_text("Playwright")').click()#也可以这样写,指定标签page.locator('article:has_text("Playwright")').click()#也可以这样page.locator(":text('Playwright')").click()#还可以这样page.locator('article:has'text=Playwright').click()css选择器page.locator('button').click()#根据标签page.locator('#nav-bar.contact-us-item').click()#通过id+classpage.locator('[data-test=login-button]').click()#属性定位page.locator("[aria-label='Signin']").click()#css定位前面可以加个css=,但是不加也可以程序也会自动匹配Xpath定位page.locator("xpath=//button").click()组合定位:text、css、xpath三者可以两组合定位css+text组合定位page.locator("article:has-text('Playwright')").click()page.locator("#nav-bar:text('Contactus')").click()css+css组合定位page.locator(".item-description:has(.item-promo-banner)").click()Xpath+css组合定位page.fill('//div[@class="SignFlow-account"]>>css=[name="username"]',"0863")xpath+xpath组合定位page.fill('//div[@class="SignFlowInput"]>>//input[@name="password"]',"ma160065")playwright推荐的内置定位page.get_by_text()通过文本内容定位。page.get_by_label()通过关联标签的文本定位表单控件。page.get_by_placeholder()按占位符定位输入。page.get_by_title()通过属性定位元素。page.get_by_role()通过显式和隐式可访问性属性进行定位。page.get_by_alt_text()通过替代文本定位元素,通常是图像。page.get_by_test_id()根据data-testid属性定位元素(可以配置其他属性)。6、事件监听Page对象提供了一个on方法,它可以用来监听页面中发生的各个事件,比如close、console、load、request、response等等示例:fromplaywright.sync_apiimportsync_playwrightdefrun(playwright):chromium=playwright.chromiumbrowser=chromium.launch()page=browser.new_page()#监听请求和响应事件page.on("request",lambdarequest:print(">>",request.method,request.url))page.on("response",lambdaresponse:print("<<", response.status, response.url)) page.goto("https://example.com") browser.close() with sync_playwright() as playwright: run(playwright) 7、移动端浏览器支持 移动端支持Safari 浏览器、谷歌、不支持火狐,可以传入的设备有iPhone和Pixel 2 (Pixel 2 是谷歌的一款安卓手机) 示例:模拟打开 iPhone 12 Pro Max 上的 Safari 浏览器,然后手动设置定位,并打开百度地图并截图 故宫的经纬度是 39.913904, 116.39014,我们可以通过 geolocation 参数传递给 Webkit 浏览器并初始化 from playwright.sync_api import sync_playwright with sync_playwright() as p: iphone_12_pro_max = p.devices['iPhone 12 Pro Max'] browser = p.webkit.launch(headless=False) context = browser.new_context( **iphone_12_pro_max, locale='zh-CN', geolocation={'longitude': 116.39014, 'latitude': 39.913904}, permissions=['geolocation'] ) page = context.new_page() page.goto('https://amap.com') page.wait_for_load_state(state='networkidle') page.screenshot(path='location-iphone.png') browser.close() 8、处理新的窗口、弹窗,iframe selenium处理iframe比较麻烦,但是playwright就比较简单,有不同方法 第一种,直接定位一个frame,在frame基础上操作 示例 # ********同步*********# Get frame using the frame's name attributeframe = page.frame('frame-login') # Get frame using frame's URLframe = page.frame(url=r'.*domain.*') # Interact with the frameframe.fill('#username-input', 'John') # *********异步***********# Get frame using the frame's name attributeframe = page.frame('frame-login') # Get frame using frame's URLframe = page.frame(url=r'.*domain.*') # Interact with the frameawait frame.fill('#username-input', 'John') 第二种,直接定位到frame再定位到上面的元素,在元素基础上操作 示例: username = page.frame_locator('.frame-class').locator('#username-input')username.fill('jonas') 处理弹窗,一般注册、或者点击一些按钮容易出现弹窗,我们可以利用page.expect_popup()来获取新窗口的iframe 示例: with page.expect_popup() as popup_info: # iframe中的id如果是动态的,所以我们只匹配关键字 page.frame_locator("iframe[id^=x-URS-iframe]").locator("text=注册新帐号").click() register_page = popup_info.value # 点击邮箱地址输入框 register_page.locator("input[id=\"username\"]").click() # 输入邮箱 register_page.locator("input[id=\"username\"]").fill("TesterRoad") # 点击密码输入框 register_page.locator("input[id=\"password\"]").click() # 输入密码 register_page.locator("input[id=\"password\"]").fill("TesterRoad@126") 本次分享结束,更多功能和操作大家可以参考官方文档,下期将主要分享脚本录制 参考文章: https://cuiqingcai.com/36045.html https://www.playwright.pro/docs/api/class-playwright 扫描二维码关注阿尘blog,一起交流学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-12 20:54 , Processed in 0.684927 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表