【Playwright + Python】系列(十七)揭秘 Playwright 处理 Handles:开启高效自动化之门
哈喽,大家好,我是六哥!今天来跟大家聊一聊Playwright 处理 Handles的方法,面向对象为功能测试及零基础小白,这里我尽量用大白话的方式举例讲解,力求所有人都能看懂,建议大家先收藏,以免后面找不到。
一、什么是Handles
在 Playwright 中,Handles 是一种特殊的数据结构,用于在 Playwright 的进程与浏览器环境之间建立桥梁,使你能够从 Playwright 的环境中访问和操作浏览器内的对象。简单来说,Handles 让你能够“抓住”页面上的元素或 JavaScript 对象,并对其进行操作。
二、为什么需要 Handles?
跨环境操作:由于 Playwright 运行在一个进程中,而浏览器中的 JavaScript 代码运行在另一个进程中,Handles 提供了一种机制,使得这两个环境之间的对象可以相互操作。
保持对象引用:通过 Handles,你可以在 Playwright 中保留对浏览器内对象的引用,即使这些对象在浏览器环境中发生了变化,只要 Handles 没有被销毁,你依然可以通过它们访问到这些对象。
延迟执行:使用 Handles 可以延迟执行某些操作,直到特定条件满足为止,例如等待某个元素出现在页面上。
三、两种主要类型的 Handles
1、JSHandle
用途:引用页面中的任何 JavaScript 对象。
特点:JSHandle 可以表示任何类型的 JavaScript 对象,比如数组、函数、DOM 元素等。它提供了一种方式,让你可以在 Playwright 的上下文中操作这些对象。
生命周期:除非页面导航或显式地调用了 dispose()
方法,否则 JSHandle 会一直存在,防止对应的 JavaScript 对象被垃圾回收。
2、ElementHandle
用途:专门用于引用页面中的 DOM 元素,并且提供了额外的方法来对这些元素执行操作或断言其属性。
特点:ElementHandle 继承自 JSHandle,因此具备所有 JSHandle 的功能。此外,它还提供了一些额外的方法,如点击、填写文本、获取元素的边界框等,这些方法可以直接作用于 DOM 元素上。
生命周期:同 JSHandle 一样,除非页面导航或显式地调用了 dispose()
方法,否则 ElementHandle 会一直存在。
四、实际应用示例
假设我们要在百度页面上进行一些操作,我们可以使用 Handles 来实现:
1、获取 JSHandle 示例
示例代码
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto("https://www.baidu.com")
# 获取 window 对象的 JSHandle
js_handle = page.evaluate_handle('window')
# 使用 jsHandle 进行评估
title = page.evaluate('window => window.document.title', js_handle)
# 断言标题
assert title == "百度一下,你就知道"
print(f"Page Title: {title}")
2、获取 ElementHandle 示例
示例代码
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto("https://www.baidu.com")
# 获取搜索框的 ElementHandle
search_box_handle = page.wait_for_selector('#kw')
# 断言搜索框的宽高
bounding_box = search_box_handle.bounding_box()
print(f"Search Box Bounding Box: {bounding_box}")
# 断言搜索框的 maxlength 属性
maxlength = search_box_handle.get_attribute('maxlength')
assert maxlength == '255'
browser.close()
3、将 Handle 作为参数传递
当需要在页面上下文中操作由 Playwright 创建的对象时,可以将 Handle 传递给 evaluate
方法。
示例代码
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto("https://www.baidu.com")
# 创建新的数组并返回数组的 JSHandle
my_array_handle = page.evaluate_handle("() => { return [1]; }")
# 获取数组的长度
length = page.evaluate("array => array.length", my_array_handle)
print(f"Array Length: {length}")
# 向数组添加新元素
page.evaluate("(array, newElement) => array.push(newElement)", [my_array_handle, 2])
# 再次获取数组的长度
new_length = page.evaluate("array => array.length", my_array_handle)
print(f"New Array Length: {new_length}")
# 释放对象
my_array_handle.dispose()
browser.close()
4. 使用 Locator 而不是 ElementHandle
虽然 ElementHandle 仍然可用,但 Playwright 推荐使用 Locator 来执行用户动作和断言。这是因为 Locator 每次都会根据选择器重新定位页面上的元素,确保即使页面状态改变也能正确地找到元素。
示例
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto("https://www.baidu.com")
# 使用 Locator 定位搜索框
search_box_locator = page.locator('#kw')
# 输入搜索词
search_box_locator.fill('Playwright')
# 提交搜索
page.locator('#su').click()
# 验证搜索结果
first_result = page.locator('h3 > a').first
print(first_result.text_content())
browser.close()
写在最后
以上代码展示了如何使用 Playwright 处理 Handles的使用方法。你可以根据自己的需求调整这些示例,感兴趣的同学可以自行动手尝试。 如需要全部源代码,公众号:软件测试君,请回复“Playwright学习”获取,无引号哦。
最后,希望大家都能顺利掌握,一起进步。也欢迎分享给更多有需要的朋友哦!
若有收获,就点个赞吧
【Playwright + Python】系列(十七)揭秘 Playwright 处理 Handles:开启高效自动化之门的更多相关文章
- python系列十七:Python3 标准库概览
#!/usr/bin/python #-*-coding:gbk-*- #Python3 标准库概览'''操作系统接口os模块提供了不少与操作系统相关联的函数.建议使用 "import os ...
- Web 前端开发精华文章集锦(jQuery、HTML5、CSS3)【系列十七】
<Web 前端开发精华文章推荐>2013年第五期(总第十七期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 C ...
- 总结整理 -- python系列
python系列 python--基础学习(一)开发环境搭建,体验HelloWorld python--基础学习(二)判断 .循环.定义函数.继承.调用 python--基础学习(三)字符串单引号.双 ...
- 初探接口测试框架--python系列7
点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...
- 初探接口测试框架--python系列2
点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...
- 初探接口测试框架--python系列3
点击标题下「微信」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是我们期 ...
- 初探接口测试框架--python系列4
点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...
- 初探接口测试框架--python系列5
点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...
- 初探接口测试框架--python系列6
点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...
- 【推荐分享】Python电子书,视频教程(Let's Python系列视频教程等)(百度网盘)
资源都放在百度网盘里了. Python视频教程(Python Django视频教程全集—台湾辅仁大学):http://pan.baidu.com/s/1dDgiWIt Python视频教程(let's ...
随机推荐
- CentOS 7 下 Docker 的离线安装方法
现遇到部分学校提供的服务器并没有外网连接,故需要在断网条件下安装 Docker ,本贴简述断网安装 Docker 的方法. 去 Docker 或者相关镜像源中下载 Docker RPM 包,以下链接的 ...
- 推荐8款 .NET 开源、免费、实用的 Windows 效率软件
前言 今天大姚给大家推荐8款基于 .NET 开源.免费.实用的 Windows 效率软件,开发工作提升利器,希望可以帮助到有需要的小伙伴. DevToys DevToys是一个专门为开发者设计的Win ...
- 【Spring】事务操作
事务概念 1.什么事务 事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败 典型场景:银行转账 lucy 转账 100 元 给 mary lucy 少 100,mar ...
- Python科学计算系列3—多项式操作
1.因式分解 例1:分解下列多项式 代码如下: from sympy import symbols, factor x, y = symbols('x y') f = 3 * x ** 4 - 2 * ...
- jmeter返回数据重新编码的方法
下图内容为请求后的返回值,红色箭头内容是需要正则处理传参给后面的接口使用 其中==后面的\U0026为未编码内容 而实际能够提交的链接为下图"&" 所以,图1请求后需要先转 ...
- MaxKB 开启模型联网搜索
前言 模型联网搜索是当前大语言模型(LLM)领域的重要技术方向,其核心在于通过结合互联网实时数据与模型推理能力,突破预训练数据的时间限制,提供更精准.动态的回答. 核心应用场景 实时信息补充 例如查询 ...
- 搭建zookeeper集群常见的报错原因(总结)
N.1 报错:Connection broken for id 2, my id = 3, error = java.io.IOException: Channel eof ... 原因:server ...
- 使用 AOT 编译保护 .NET 核心逻辑,同时支持第三方扩展
引言 在开发大型ERP .NET 应用程序时,我面临一个挑战:如何创建一个可供第三方引用的组件(DLL)以便二次开发,但同时保护核心逻辑不被轻易反编译,还要支持反射机制(包括私有字段访问),并且坚持使 ...
- 毒瘤idea合集
给定 \(n,m\) ,求: \[\sum_{i=1}^{n}\sum_{i=1}^{m}max\big(gcd(i,j)^i,lcm(i,j)^j\big) \]
- DeepSeek又在节前放大招!
写在前面 事情是这样的,就在五一假期开始前夕,DeepSeek放出了模型DeepSeek-Prover-V2-671B: 这是延续了节假日狂飙的传统? 言归正传,我们看看这次放出了哪些核心技术. ...