1.简介

 对于前端隐藏元素,一直是自动化定位元素的隐形杀手,让人防不胜防。脚本跑到隐藏元素时位置时报各种各样的错误,可是这种隐藏的下拉菜单又没有办法避免,所以非常头痛,这一篇只为交流隐藏元素自动化定位处理方法以及宏哥自己的一点浅薄见解。

2.什么是隐藏元素

隐藏元素,熟悉前端的或者HTML的小伙伴或者童鞋们一定不陌生,元素的属性隐藏和显示,主要是 type="hidden"和style="display: none;"属性来控制的,当然了还有其他的方法控制,宏哥这里就不详细说明了,有兴趣的小伙伴或者童鞋们可以自己查一下资料。隐藏元素是什么,隐藏元素是通过属性值 hidden="hidden"  进行隐藏,如果前端代码中出现这个,就代表该元素已经被隐藏了,大家也知道,如果元素隐藏了,是没有办法进行操作的,所谓的操作就是输入,点击,以及清空这些基本元素操作。如果通过selenium中的点击进行操作元素的话,会报错误,没有找到元素信息,前面也介绍了,隐藏的元素只能定位到,但是没有办法进行操作。

1.有两个输入框和一个登录的按钮,本来是显示的,如下图所示:

视频教程: 

【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)

2.接下来在登录的元素属性里面让它隐藏,代码如下所示:

<!DOCTYPE html>  
<html lang="en">  
<head>  <meta charset="UTF-8">  <title>Login</title>  <link rel="stylesheet" type="text/css" href="Login.css"/>  
</head>  
<body>  <div id="login"> <form method="post">  <input type="text" required="required" placeholder="用户名" name="u"></input>  <input type="password" required="required" placeholder="密码" name="p"></input>  <button id="bjhg" class="but" type="submit" style="display: none;" onclick="display_alert()">登录</button>                </form>          </div>  
</body>
<script type="text/javascript">function display_alert(){alert("000")}
</script>  
</html>  

这样登录按钮就不会显示了,如下图所示:

3.定位隐藏元素

 宏哥前边说了,定位隐藏元素和普通的元素没啥区别,接下来就来验证下,是不是能定位到呢?其实前边的文章中已经验证了,可能小伙伴或者童鞋们没有留意或者注意到,那么宏哥在这里就再次验证一下。

3.1代码设计

3.2参考代码
# coding=utf-8🔥# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2024-05-15
@author: 000
000)
Project: Python+Playwright自动化测试 - 隐藏元素定位与操作
'''# 3.导入模块
from playwright.sync_api import Playwright, sync_playwright, expect
def run(playwright: Playwright) -> None:browser = playwright.chromium.launch(headless=False)context = browser.new_context()page = context.new_page()page.goto("E:\\Desktop\\test\\hidden\\login.html")loginButton = page.locator("#bjhg")print(loginButton.get_attribute("name"))# 通过id定位隐藏元素,然后进行判断(上一篇两种方法)print(page.is_visible("#bjhg"))print(page.locator("#bjhg").is_visible())page.wait_for_timeout(1000)print("browser will be close")page.close()context.close()browser.close()
with sync_playwright() as playwright:run(playwright)
3.3运行代码

1.运行代码,右键Run'Test',就可以看到控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作。如下图所示:

运行结果可以看出,隐藏元素用普通定位方法,事实上是定位到了,和普通元素的定位没有任何区别!不要觉得它有什么特殊之处,需特殊的定位方法。

4.操作隐藏元素

大家也都知道Palywright操作方法是通过模拟人的操作方法进行的,那么元素都看不到了,就没有所谓的操作不操作了,如果真的想要操作,我们可以使用前边宏哥介绍的JS语法进行操作,因为JS语法属于直接对前端的代码进行操作,隐藏元素在HTML代码中是存在的,隐藏元素主要是对于前端页面来说是不可见的。

隐藏元素可以正常定位到,只是不能操作(定位元素和操作元素是两码事,很多初学者或者面试官有时候分不清楚),操作元素是click,clear,sendKeys这些方法。

//点击隐藏登录框
loginButton = page.locator("#000")
loginButton.click()
4.1代码设计

按照上边的思路设计代码非常简单。

4.2参考代码
# coding=utf-8🔥# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2024-05-15
@author: 000
000)
Project: Python+Playwright自动化测试- 隐藏元素定位与操作
'''# 3.导入模块
from playwright.sync_api import Playwright, sync_playwright, expect
def run(playwright: Playwright) -> None:browser = playwright.chromium.launch(headless=False)context = browser.new_context()page = context.new_page()page.goto("E:\\Desktop\\test\\hidden\\login.html")loginButton = page.locator("#bjhg")# 操作隐藏元素loginButton.click()print(loginButton.get_attribute("name"))# 通过id定位隐藏元素,然后进行判断(上一篇两种方法)print(page.is_visible("#bjhg"))print(page.locator("#bjhg").is_visible())page.wait_for_timeout(1000)print("browser will be close")page.close()context.close()browser.close()
with sync_playwright() as playwright:run(playwright)
4.3运行代码

1.运行代码,右键Run'Test',就可以看到控制台输出(报错了),如下图所示:

2.运行代码后电脑端的浏览器的动作(看到没有触发点击事件,弹出窗口,最后报错了)。如下图所示:

隐藏元素用click()方法会抛异常“element is not visible - waiting...”这个报错是说元素不可见,不等待中...,同样的对“登录”按钮上的输入框如果隐藏了,执行输入(type)操作也是会报错。

5.JS操作隐藏元素

Palywright和Selenium一样是无法操作隐藏元素的(但是能正常定位到),本身这个框架就是设计如此,如果非要去操作隐藏元素,那就用js的方法去操作,Palywright提供了一个入口可以执行js脚本。 js和Palywright不同,只有页面上有的元素(在dom里面的),都能正常的操作,接下来用js试试吧!

那就继续完善上边可以定位到但是不能操作的代码。

5.1代码设计

5.2参考代码
# coding=utf-8🔥# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。
# 3.导入模块
from playwright.sync_api import Playwright, sync_playwright, expect
def run(playwright: Playwright) -> None:browser = playwright.chromium.launch(headless=False)context = browser.new_context()page = context.new_page()page.goto("E:\\Desktop\\test\\hidden\\login.html")loginButton = page.locator("#000")# 操作隐藏元素js = "document.getElementById('000').click()"page.wait_for_timeout(10000)page.evaluate(js)print(loginButton.get_attribute("name"))# 通过id定位隐藏元素,然后进行判断(上一篇两种方法)print(page.is_visible("#bjhg"))print(page.locator("#bjhg").is_visible())page.wait_for_timeout(1000)print("browser will be close")page.close()context.close()browser.close()
with sync_playwright() as playwright:run(playwright)
5.3运行代码

1.运行代码,右键Run'Test',就可以看到控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作(触发点击事件,弹出窗口,运行完之后,会发现页面正常的点击,弹出到关注宏哥的公众号窗口。)。如下图所示:

6.小结

6.1简化代码

百度搜到的可能方法是先用js去掉hidden属性,再用selenium操作,这个有点多此一举,你既然都已经会用js了,何必不一次性到位直接click呢?而且宏哥发现之前讲解的也是这种方法,有点“脱了裤子排气”。在这里宏哥纠正一下,直接一步到位哈!

6.2面试提问

如果面试官想问的是定位后操作隐藏元素的话,本质上说这个问题就是毫无意义的,web自动化的目的是模拟人的正常行为去操作。 如果一个元素页面上都看不到了,你人工也是无法操作的是不是?人工都不能操作,那你自动化的意义又在哪呢?所以这个只是为了单纯的考察面试者处理问题的能力,没啥实用性!(面试造飞机,进去拧螺丝) 既然面试官这么问了,那就想办法回答上给个好印象吧!记住一定不要回怼面试官,否则你的这次面试就凉了啊!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88319.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88319.shtml
英文地址,请注明出处:http://en.pswp.cn/web/88319.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跨境电商税务解决之道:在合规航道上驶向全球市场

首席数据官高鹏律师数字经济团队创作AI辅助当某3C品类跨境卖家因未同步境内交易流水被处以20万元罚款&#xff0c;当某服饰品牌因欧盟增值税申报疏漏导致货物滞留港口&#xff0c;当东南亚市场的“低税率红利”变成“税务稽查雷区”——跨境电商的黄金时代里&#xff0c;税务合…

(6)机器学习小白入门 YOLOv:图片的数据预处理

(1)机器学习小白入门YOLOv &#xff1a;从概念到实践 (2)机器学习小白入门 YOLOv&#xff1a;从模块优化到工程部署 (3)机器学习小白入门 YOLOv&#xff1a; 解锁图片分类新技能 (4)机器学习小白入门YOLOv &#xff1a;图片标注实操手册 (5)机器学习小白入门 YOLOv&#xff1a;…

康谋新闻 | 康谋加入ASAM组织,全球首个ASIL-D认证自动驾驶仿真平台aiSim引领安全新标杆

康谋新闻康谋科技正式加入全球汽车标准化组织 ASAM&#xff08;Association for Standardization of Automation and Measuring Systems&#xff09;&#xff0c;成为其正式会员单位&#xff01;ASAM作为国际汽车行业标准化领域的权威机构&#xff0c;致力于推动仿真、测试及数…

《PyQt6-3D:开启Python 3D开发新世界》

一、引言 在 Python 的广袤开发世界中&#xff0c;3D 开发领域正以惊人的速度蓬勃发展&#xff0c;为众多领域带来了前所未有的创新与变革。从沉浸式的游戏体验到逼真的虚拟现实场景&#xff0c;从精准的工业设计模拟到生动的影视动画制作&#xff0c;3D 技术的身影无处不在&am…

第一届OpenHarmonyCTF--Crypto--WriteUp

第一届OpenHarmonyCTF–Crypto–WriteUp Ea5y_rsa题目附件解压后寻找有用的源代码&#xff1a; // RsaUtil import { cryptoFramework } from kit.CryptoArchitectureKit; import { buffer } from kit.ArkTS;class RsaUtil{private keyPair: cryptoFramework.KeyPair | null n…

Copilot 在 VS Code 中的免费替代方案

## 引言随着 GitHub Copilot 推出付费 Pro 版&#xff0c;许多开发者开始寻找免费替代方案。本文精选 7 款 2025 年主流免费 AI 编程工具&#xff0c;涵盖不同使用场景和编程语言需求。## 主流替代方案对比| 工具名称 | 核心优势 | 支持语…

视频能转成gif动图吗?怎么弄?

在一些社交平台中&#xff0c;分享短小有趣的片段。GIF自动循环播放&#xff0c;无需用户点击。兼容性高&#xff0c;几乎所有平台都支持直接预览。例子&#xff1a;将电影/综艺的搞笑片段转为GIF传播。游戏精彩操作截取为GIF分享。这就需要我们掌握把视频转换成gif动图的技术&…

【Pyhton】Json.dump 语法说明

目录json.dump() 的语法参数说明1. obj2. fp3. skipkeys4. ensure_ascii5. check_circular6. allow_nan7. cls8. indent9. separators10. default11. sort_keys**示例代码****基本用法**使用 indent 和 separators使用 default 参数总结json.dump() 是 Python 中 json 模块用于…

LangGraph-2-interrupt 流程中断

interrupt 是 LangGraph 中一个强大的流程控制机制&#xff0c;允许在状态机执行过程中根据特定条件中断当前流程并跳转到其他节点。这种机制特别适用于处理异常情况、用户中断或特定业务规则的触发。在 LangGraph 中&#xff0c;interrupt_before 和 interrupt_after 是两个强…

前缀和|差分

题目&#xff1a;MT2047距离平方和你有&#x1d45b;n个点&#xff0c;请编写一个程序&#xff0c;求这&#x1d45b;n个点的距离的平方和。格式输入格式&#xff1a;第一行&#xff1a;一个整数&#x1d45b;&#xff08;0≤&#x1d45b;≤100000&#xff09;n&#xff08;0≤…

x86架构CPU市场格局

x86架构的CPU市场是全球处理器市场的核心&#xff0c;涵盖PC&#xff08;桌面端与移动端&#xff09;、服务器和超算等领域&#xff0c;主要玩家为英特尔&#xff08;Intel&#xff09;和AMD。以下基于最新数据分析市场格局及各领域份额&#xff0c;辅以国产厂商动态。 1. 总体…

【Swift开发】屏蔽NSSecureCoding频繁警告

解决 iOS 开发中 NSSecureCoding 警告的最佳实践 问题背景 在开发 Mac 应用时&#xff0c;我遇到了一个令人困扰的问题&#xff1a;Xcode 控制台不断输出 NSSecureCoding allowed classes list contains [NSObject class] 相关的警告信息。这些警告虽然不影响应用功能&#xff…

SpringBoot实现MCP

前言 之前的文章都是各种使用MCP,自从有了MCP我们立马感受到大模型真的可以帮我们干活了&#xff0c;实际上当我们想把企业内部的业务向AI方向转型的话主要就是实现MCP&#xff0c;另外加上多Agent在流程上的控制和自有的知识库这就可以满足企业80%的需求了&#xff0c;剩下的2…

windows对\和/敏感吗?

在Windows系统中&#xff0c;路径分隔符\和/的敏感性需要分情况来看&#xff1a; 1. 文件系统层面 Windows文件系统&#xff08;如NTFS、FAT32&#xff09;不区分\和/。 例如&#xff0c;以下路径是等效的&#xff1a; C:\Users\Documents\file.txt C:/Users/Documents/file.tx…

缓存穿透与击穿多方案对比与实践指南

缓存穿透与击穿多方案对比与实践指南 问题背景介绍 在高并发的分布式系统中&#xff0c;缓存是提升读写性能的重要组件。但在实际生产环境中&#xff0c;经常会遇到两类问题&#xff1a; 缓存穿透&#xff1a;客户端频繁请求不存在的数据&#xff0c;导致请求直达数据库&#x…

【音视频】HTTP协议介绍

参考博客&#xff1a;https://cloud.tencent.com/developer/article/2183902 一、HTTP协议概述 HTTP&#xff08;HyperText Transfer Protocol&#xff09; 即 超文本传输协议&#xff0c;它是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP 是万维网&#xff08…

神经网络基础及API使用详解

一、神经网络概述神经网络是一种模仿生物神经网络结构和功能的计算模型&#xff0c;它由大量的人工神经元相互连接构成&#xff0c;能够通过调整内部大量节点之间相互连接的关系&#xff0c;从而达到处理信息的目的。1.1 神经网络的基本组成输入层&#xff1a;接收原始数据隐藏…

分桶表的介绍和作用

一、分桶表的基本介绍1、什么是分桶表&#xff1f;分桶表主要是用于分文件的&#xff0c;在建表的时候&#xff0c;指定按照那些字段执行分桶操作&#xff0c;并可以设置需要分多少个桶&#xff0c;当插入数据的时候&#xff0c;执行MR的分区的操作&#xff0c;将数据分散各个分…

HighReport报表工具开始支持BS报表设计器

HighReport报表工具同时支持c/s报表设计器和b/s报表设计器&#xff0c;大部分情况下使用c/s报表设计器&#xff0c;在某些业务场景或者用户自己简单修改报表模板&#xff0c;可以用b/s报表设计器。b/s报表设计器和c/s报表设计器操作一样b/s报表设计器免费下载免费使用(c/s报表设…

数据结构--堆的实现

目录 一、堆的概念及结构 二、小根堆的实现 2.1 堆的数据结构 2.2 堆的初始化HeapInit 2.3 堆的销毁HeapDestory 2.4 堆的插入HeapPush ​2.4.1 插入代码HeapPush 2.4.2 向上调整代码AdjustUp 2.4.3 交换数据代码Swap 2.5 堆的删除HeapPop 2.5.1 删除代码HeapPop 2…