selenium4.x 之浏览器弹窗处理

一、浏览器自带弹窗alert弹窗

webdriver中处理JavaScript所生成的alert、confirm以及prompt弹窗是很简单的。具体思路是使用switch_to.alert()方法定位到alert/confirm/prompt弹窗。然后使用text/accept/dismiss/send_keys方法按需进行操做

操作  说明返回
text返回alert/confirm/prompt 中的文字信息。用于显示带有一条指定消息和一个 确认 按钮的警告框。
accept() 点击弹窗中的确认按钮。(接收警告)

用于显示一个带有指定消息和确认及取消按钮的对话框。

如果访问者点击"确定",此方法返回 true,否则返回 false。
dismiss()点击弹窗中的取消按钮,如果有的话。(弹窗中的)

用于显示可提示用户进行输入的对话框。

这个方法返回用户输入的字符串。
send_keys() 输入文本到警告框,alert\confirm 没有对话框就不能用了,不然会报错。

用于显示可提示用户进行输入的对话框。

这个方法返回用户输入的字符串

页面代码片段:

<!DOCTYPE html>
<html lang="zh-cn">
<head><meta charset="UTF-8"><style type="text/css">button {padding: 8px;background: #f8f8f8;border-radius: 5px}</style>
</head>
<body>
<button type="button_alert" value="alert" id="alert" onclick="al()">button_alert</button>
<br>
<button type="button_confirm" value="confirm" id="confirm" onclick="con()">button_confirm</button>
<br>
<button type="button_prompt" value="prompt" id="prompt" onclick="pro()">button_prompt</button>
<br><script>function al() {alert('你是一个懂得爱自己的人!')}function con() {confirm('你是一个懂得爱自己的人?')}function pro() {prompt('请对自己说一句话!')}
</script>
</body>
</html>

语法(操作步骤):

(1) 操作触发弹窗的元素

(2)  获取弹窗(进入弹窗)

alert = driver.switch_to.alert

(3)  操作弹窗

        alert.text   获取弹窗文本
        alert.accept() 点击弹窗确定按钮
        alert.dismiss() 点击弹窗取消按钮

 代码: 

1. text()和accept()方法

触发弹窗的元素button_alert,完成text和accept()方法

# 触发弹窗的元素button_alert,完成text和accept()方法
# 定位alert按钮,触发弹窗
el = driver.find_element_by_id("alert")
el.click()
sleep(2)# 获取弹窗(进入弹窗)
alert = driver.switch_to.alert# 获取弹窗文本值
print("弹窗文本值:", alert.text)# 点击弹窗确定按钮
alert.accept()
sleep(2)

 2. dismiss()方法

触发弹窗的元素button_confirm,完成dismiss()方法

# 触发弹窗的元素button_confirm,完成dismiss()方法
#  定位confirm按钮,触发弹窗
el = driver.find_element_by_id("confirm")
el.click()
sleep(2)# 4获取弹窗(进入弹窗)
confirm = driver.switch_to.alert# 获取弹窗文本值
print("弹窗文本值:", confirm.text)# 点击弹窗取消按钮
confirm.dismiss()
sleep(2)

 3. send_keys()方法

触发弹窗的元素button_prompt,完成send_keys("输入内容")方法

#  触发弹窗的元素button_prompt,完成send_keys("输入内容")方法
#  定位prompt按钮,触发弹窗
el = driver.find_element_by_id("prompt")
el.click()
sleep(2)#  获取弹窗(进入弹窗)
prompt = driver.switch_to.alert# 获取弹窗文本值
print("弹窗文本值:", prompt.text)# 点击弹窗确定按钮
prompt.send_keys("怎么显示不了")
sleep(2)# 点击弹窗确定按钮
prompt.accept()
sleep(2)

注意:prompt弹窗输入框,Chrome有的版本不显示输入文本,比如:Chrome版本:74.0.3729.131(正式版本)32位,有问题 

 

 二、页面自定义弹窗操作

由于alert弹窗不美观,现在大多数网站都会使用自定义弹窗,使用Selenium自带的方法就驾驭不了了,此时就要搬出JS方法来进行处理。
需求:去掉淘宝首页的自定义弹窗
淘宝的自定义弹窗如下:

 

提示:网页中弹出的对话框,也属于页面自定义弹窗,都可以用下面方式处理。

实现方式:
上图中的这种弹窗就是自定义弹窗的表现形式,处理这种弹窗可以利用HTML、DOM、Style对象中的一个display属性来处理,可以设置元素如何被显示。
将display的值设置成none:此元素不会被显示,就可以去除这个弹窗了。
注意:手动页面刷新之后还会出现弹窗。

# JavaScript语法
js = 'document.getElementById("div_company_mini").style.display="none";'# 使用Python执行JS语句
driver.execute_script(js1)

提示:
document.getElementById()是JS获取元素的方式,在JS获取元素方式中,就只有ById()获取的是一个元素。
其他获取元素的方式,都获取的是结果集,需要获取具体元素的时候,注意要使用索引。

简单举例:

通过ID获取(getElementById)
通过name属性(getElementsByName)
通过标签名(getElementsByTagName)
通过类名(getElementsByClassName)

# 1.导入selenium
from selenium import webdriver
from time import sleep# 2.打开浏览器
driver = webdriver.Chrome()# 3.打开页面
url = "https://www.taobao.com/"
driver.get(url)
sleep(5)# 4.关闭自定义弹窗
js = 'document.querySelector("body > div.tbh-fixedtool.J_Module > div").style.display="none"'
driver.execute_script(js)
sleep(2)# 5.关闭浏览器
driver.quit()

三、知识点补充

1. document.querySelector()方法 

2. alert弹窗处理失败解决办法

原来写的方法: 

def alert(self):time.sleep()alert = self._driver.switch_to.alertalert.accept()

 但是在Chorme上运行一直报错,改为下面的方法:

def alert(self):time.sleep()# alert = driver.switch_to.alertdef _a():return self._driver.switch_to.alert  # 可能会失败,可能会成功alert = self._wait.until(_a)alert.accept()

 上面可以成功!!!

 完整如下:

import logging
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
logger = logging.getLogger("PO")class BasePage:"""poge的基类"""def __init__(self, driver: webdriver.Chrome):self._driver = driverself._wait = WebDriverWait(driver, 10)   # 自动等待 logger.info("PO实例化成功")def get_element(self, xpath):logger.info("正在进行元素定位")el = self._wait.until(lambda x: self._driver.find_element(By.XPATH, xpath))logger.info("元素定位成功") return eldef alert(self):time.sleep()# alert = driver.switch_to.alertdef _a():return self._driver.switch_to.alert  # 可能会失败,可能会成功alert = self._wait.until(_a)alert.accept()

 
    
   
    
   

 

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

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

相关文章

22 重构系统升级-实现不停服的数据迁移和用户切量

专栏的前 21 讲&#xff0c;从读、写以及扣减的角度介绍了三种特点各异的微服务的构建技巧&#xff0c;最后从微服务的共性问题出发&#xff0c;介绍了这些共性问题的应对技巧。 在实际工作中&#xff0c;你就可以参考本专栏介绍的技巧构建新的微服务&#xff0c;架构一个具备…

Centos 7 安装 Redis

Centos 7 安装 Redis 安装步骤1、安装软件源2、安装redis3、创建符号链接4、修改配置文件5、启动 redis6、停止redis 安装步骤 1、安装软件源 如果是Centos 8 直接yum install 就可以了 yum install -y redis但是如果是Centos 7&#xff0c;redis 默认的是 redis 3 系列&…

用于复杂任务的 AI 编码引擎:多文件多步骤拆解实现 | 开源日报 No.239

plandex-ai/plandex Stars: 3.1k License: AGPL-3.0 plandex 是一个用于复杂任务的 AI 编码引擎。 使用长时间运行的代理完成跨多个文件且需要多个步骤的任务将大型任务分解为较小子任务&#xff0c;逐一实现&#xff0c;直至完成整个工作帮助处理积压工作、使用陌生技术、摆…

想开发一款带有视频通话/共享屏幕功能的产品?那WebRTC是你必须要知道的!

作为一名技术爱好者&#xff0c;我总是对各种协议、各种功能感兴趣&#xff0c;两周前我想为我的开源项目ChatCraft集成视频通话功能&#xff0c;我就开始了对应技术的研究&#xff0c;然后我盯上了WebRTC。在这个研究过程中&#xff0c;我恶补了大量有关WebRTC的知识&#xff…

Golang错误处理机制

文章目录 Golang错误处理机制panic异常recover捕获异常自定义错误 Golang错误处理机制 panic异常 panic异常 Go的类型系统会在编译时捕获很多错误&#xff0c;但有些错误只能在运行时检查&#xff0c;比如除零错误、数组访问越界、空指针引用等&#xff0c;这些运行时错误会引…

上位机图像处理和嵌入式模块部署(树莓派4b进行自动化测试)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 硬件、软件功能开发ok只是产品开发的第一步。怎么做到自动化测试、保证产品质量才是关键。很多时候&#xff0c;我们给客户提供了功能&#xff0c;…

Leetcode-17.04. 消失的数字

面试题 17.04. 消失的数字 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/missing-number-lcci/ 目录 面试题 17.04. 消失的数字 - 力扣&#xff08;LeetCode&#xff09; 题目 解题(注释) 第一种方法 第二种方法 第三种方法 题目 数组nums包含…

73、栈-柱状图中最大的矩形

思路&#xff1a; 矩形面积&#xff1a;宽度*高度 高度如何确定呢&#xff1f;就是在宽度中最矮的元素。如何确定宽度&#xff0c;就是要确定左右边界。 当我们在处理直方图最大矩形面积问题时&#xff0c;遇到一个比栈顶柱子矮的新柱子时开始计算面积的原因关键在于如何确定…

医院手术室麻醉信息管理系统源码 自动生成麻醉的各种医疗文书(手术风险评估表、手术安全核查表)

目录 手术风险评估表 一、患者基本信息 二、既往病史 三、手术相关信息 四、风险评估因素 五、风险评估结果 手术安全核查表 一、患者身份与手术信息核对 二、术前准备核查 三、手术团队与职责确认 四、手术物品与设备核查 五、术中关键步骤核查 六、术后核查 七…

远程桌面的端口配置与优化

在现代企业环境中&#xff0c;远程桌面连接已成为日常工作中不可或缺的一部分。然而&#xff0c;随着网络攻击的增加&#xff0c;确保远程桌面连接的安全性变得尤为重要。其中一个关键的安全因素是端口配置。 一、远程桌面默认端口 远程桌面协议&#xff08;RDP&#xff09;默…

亚马逊关键字搜索商品列表API接口:探索海量商品的利器

亚马逊关键字搜索商品列表API接口允许开发者通过输入关键字或特定参数&#xff0c;在亚马逊平台上进行商品搜索&#xff0c;并返回符合搜索条件的商品列表信息。这些信息包括商品的标题、图片、价格、评价等&#xff0c;为商家、开发者以及市场分析师提供了丰富的商品数据支持。…

docker里部署SpringBoot项目,访问不到扬声器,如何解决??

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

# 从浅入深 学习 SpringCloud 微服务架构(七)Hystrix(1)

从浅入深 学习 SpringCloud 微服务架构&#xff08;七&#xff09;Hystrix&#xff08;1&#xff09; 一、Hystrix&#xff1a;基于 RestTemplate 的熔断配置 1、Hystrix 介绍&#xff1a; 1&#xff09;Hystrix 是由 Netflix 开源的一个延迟和容错库&#xff0c; 用于隔离访…

《21天学通C++》(第十二章)运算符类型与运算符重载

1.为什么要重载运算符&#xff1f; 通过重载运算符&#xff0c;可以将复杂的操作封装成简单的运算符形式&#xff0c;简化代码&#xff0c;提高可读性下面举一个简单的例子 计算两个点的坐标之和。 1.不重载运算符 #include <iostream> using namespace std; class P…

GCB | 陆地生态系统C:N:P化学计量对降水变化的响应

西北农林科技大学水保学院上官周平研究员团队在陆地生态系统C:N:P化学计量对降水变化的响应方面取得新进展&#xff0c;并以“C:N:P stoichiometry of plants, soils, and microorganisms: Response to altered precipitation”为题发表在国际生态环境领域著名期刊Global Chang…

AI发展势头强劲,或许会催生这些职业!

AI&#xff08;人工智能&#xff09;的发展正在并将继续催生多种新的职业&#xff0c;这些职业通常与AI的设计、开发、测试、部署、监管、维护以及与其互动和应用相关。 按照现在AI发展的趋势来看&#xff0c;可预测的一些新兴职业大概有下面这些&#xff1a; 当然以上只是一些…

中职数字化校园网络建设

中职&#xff08;职校&#xff09;数字化校园的校园网建设立足于职业教育、职业学校的特点&#xff0c;充分注意到信息技术的飞速发展、通信成本的迅速降低的特点。在规划和建设校园网时&#xff0c;遵循以下原则&#xff1a; 采用通用和成熟的技术&#xff1a;采用通用的、成熟…

【国产NI替代】NI-9235 10 kS/s/ch,120 Ω四分之一桥应变计,8通道C系列应变/桥输入模块

10 kS/s/ch&#xff0c;120 Ω四分之一桥应变计&#xff0c;8通道C系列应变/桥输入模块 NI‑9235可同步测量所有通道的动态应变&#xff0c;从而实现了高速同步测量。 该功能对于需要在特定时刻对多个通道进行比较的应用&#xff08;例如冲击测试&#xff09;非常重要。\n\nNI…

算法入门ABC

前言 初学算法时真的觉得这东西晦涩难懂&#xff0c;貌似毫无用处&#xff01;后来的后来&#xff0c;终于渐渐明白搞懂算法背后的核心思想&#xff0c;能让你写出更加优雅的代码。就像一首歌唱的那样&#xff1a;后来&#xff0c;我总算学会了如何去爱&#xff0c;可惜你早已远…

【漏洞复现】若依druid 未授权访问漏洞

0x01 产品简介 若依&#xff08;Ruoyi&#xff09;框架是一款基于Spring Boot、Spring Cloud、OAuth2与JWT鉴权等核心技术的快速开发平台。它支持多种安全框架和持久化框架&#xff0c;并采用前后端分离的模式进行开发&#xff0c;具备高度的灵活性和可扩展性。若依框架提供了…