selenium4.x 之浏览器弹窗处理

devtools/2024/9/24 13:13:47/

一、浏览器自带弹窗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.ppmy.cn/devtools/24985.html

相关文章

Unity 合并子物体获得简化Mesh

合并子物体获得简化Mesh &#x1f959;环境&#x1f96a;Demo &#x1f959;环境 PackageManager安装Editor Coroutines 导入插件&#x1f448; &#x1f96a;Demo 生成参数微调&#xff1a;Assets/EasyColliderEditor/Scripts/VHACDSettings/VHACDSettings.asset

达梦(DM) SQL聚集函数及日期运算操作

达梦DM SQL聚集函数及日期运算操作 聚集函数MAX、MIN、SUM、AVG、COUNT使用分析函数 sum (…) over (order by…) 可以生成累计和更改累计和的值计算出现次数最多的值 日期运算加减日、月、年加减时、分、秒日期间隔之时、分、秒日期间隔之日、月、年求两个日期间的工作天数确定…

LangChain入门:24.通过Baby AGI实现自动生成和执行任务

随着 ChatGPT 的崭露头角,我们迎来了一种新型的代理——Autonomous Agents(自治代理或自主代理)。 这些代理的设计初衷就是能够独立地执行任务,并持续地追求长期目标。 在 LangChain 的代理、工具和记忆这些组件的支持下,它们能够在无需外部干预的情况下自主运行,这在真…

Python常见数据结构

元组&#xff08;Tuple&#xff09;和列表&#xff08;List&#xff09;是Python中两种主要的序列类型&#xff0c;它们在功能上有许多相似之处&#xff0c;但也存在一些关键的区别&#xff1a; 可变性&#xff1a; 列表是可变的&#xff0c;这意味着你可以更改列表的内容&am…

如何在Pycharm中使用Git来进行版本管理

推荐视频:git pycharm的使用 连接github_哔哩哔哩_bilibilipycharm git的使用简单介绍 最近应该不会更新技能相关视频了 准备开题, 视频播放量 13042、弹幕量 2、点赞数 208、投硬币枚数 143、收藏人数 343、转发人数 58, 视频作者 呃呃燕, 作者简介 努力入门的计算机双非研究生…

STM32 学习13 低功耗模式与唤醒

STM32 学习13 低功耗模式与唤醒 一、介绍1. STM32低功耗模式功能介绍2. 常见的低功耗模式&#xff08;1&#xff09;**睡眠模式 (Sleep Mode)**:&#xff08;2&#xff09;**停止模式 (Stop Mode)**:&#xff08;3&#xff09;**待机模式 (Standby Mode)**: 二、睡眠模式1. 进入…

算法设计与分析 3.2 牛顿法及改进、迭代法、矩阵谱半径、雅可比迭代、高斯迭代

思考题1 改进cosx&#xff1f;优化算法 关键点在于cos计算过于麻烦&#xff0c;而每次都要求sinx的值 故直接简化为cosx的导数 -sinx 即&#xff1a; 原&#xff1a;//double daoshu(double x) { // return 18 * x - cos(x); //} 改&#xff1a;double daoshu(double x) {retu…

摩根大通推出创新工具 FlowMind,引领金融自动化新变革

近日&#xff0c;摩根大通人工智能研究部推出了一款极具创新性的工具——FlowMind&#xff0c;为金融行业带来了全新的工作模式和效率提升。 FlowMind 能够自动化金融工作流程&#xff0c;在信贷审批、风险评估、合规监测等重要任务中发挥着关键作用。它利用 GPT 自动生成工作…