谈谈Selenium中的三种切换之alert
2024-09-18 08:30:43
谈谈Selenium中的三种切换之alert
一、如何识别
识别方法:alert中的确定、取消、输入框无法用inspector定位到,当然还有一些特例。
alert分为三种
- alert
- confirm
- prompt
分别对应3个js的命令(可在chrome的console面板中调试)
- alert('确认')
- confirm('确认或取消')
- prompt('输入信息后确认或取消')
二、selenium中如何处理
示例的demo_alert.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>alert</title>
<script>
function show_confirm()
{
var r=confirm("请选择!");
if (r==true)
{
document.write("你选择了确定!");
}
else
{
document.write("你选择了取消!");
}
}
</script>
</head>
<body>
<div id="div1">
<input type="button" id="alert" value='alert' onclick="alert('欢迎来到松勤软件测试')">
<input type="button" id="confirm" value='confirm' onclick="show_confirm('请选择你的操作')">
<input type="button" id="prompt" value='prompt' onclick="var name = prompt('请输入你的名字:');document.write(name)">
</div>
</body>
</html>
- 效果如图所示,点击三个按钮会弹出之前说明的3种对话框
selenium的api
首先我们打开这个本地文件
# 1. 导入selenium的webdriver模块
from selenium import webdriver
# 2. 打开chrome浏览器
driver = webdriver.Chrome()
# 3. 打开本地html,如果用firefox打开,需要加上file:///
# driver.get(r'file:///D:\demo\demo_alert.html')
driver.get(r'D:\demo\demo_alert.html')
alert切换
点击alert元素
# 4. 点击alert元素(其id属性值为alert ==> <input type="button" id="alert" ...
driver.find_element('id','alert').click()
切换并点击确定
# 弹出alert对话框
driver.find_element('id','alert').click()
from time import sleep
sleep(1)
# 5. 切换并点击确定
driver.switch_to.alert.accept()
sleep需要加,不加的话你看不到效果,实际项目中不建议加
confirm切换
点击confirm元素
# 4. 点击confirm元素(其id属性值为confirm ==> <input type="button" id="confirm" ...
# 弹出confirm对话框
driver.find_element('id','confirm').click()
切换并点击确定或取消
from time import sleep
sleep(1)
# 5. 切换并点击取消
driver.switch_to.alert.dismiss()
# 如果要点击确定
# driver.switch_to.alert.accept()
在打开的网页中你能看到
你选择了取消!
prompt切换
点击prompt元素
# 4. 点击prompt元素(其id属性值为prompt ==> <input type="button" id="prompt" ...
# 弹出prompt对话框
driver.find_element('id','prompt').click()
切换并输入内容
from time import sleep
sleep(1)
# 5. 切换并输入内容
driver.switch_to.alert.send_keys('hello world')
此时观察网页,你会发现,并没有如预期般输入内容
如果你继续,点击确定
# 6. 切换并点击确定
driver.switch_to.alert.accept()
你会在网页中看到
hello world
说明实际是写的,但
在chrome中弹出的prompt对话框中并不能看到这个信息
如果换成firefox是可以看到效果的,完整代码如下
from selenium import webdriver
driver = webdriver.Firefox()
driver.get(r'file:///D:\demo\demo_alert.html')
driver.find_element('id','prompt').click()
from time import sleep
sleep(1)
driver.switch_to.alert.send_keys('hello world')
driver.switch_to.alert.accept()
另外一种切换方式Alert
selenium还提供了另外一种方式来操作alert类型元素
from selenium.webdriver.common.alert import Alert Alert(driver).accept() # 跟driver.switch_to.alert.accept()是等价的
依次类推
Alert(driver).dismiss()
Alert(driver).send_keys('hello')
稳定的切换
由于涉及到弹窗,总是会有不稳定的情况出现,这时候显式等待就可以发挥它的作用了
# ... 前面的代码不写了
driver.find_element('id','alert').click()
from time import sleep
sleep(1)
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
WebDriverWait(driver,5,0.5).until(EC.alert_is_present()).accept()
你需要有一定的显式等待基础
源码说明
alert_is_present
class alert_is_present(object):
""" Expect an alert to be present."""
def __init__(self):
pass def __call__(self, driver):
try:
alert = driver.switch_to.alert
return alert # 正常捕获到alert的话,返回的是driver.switch_to.alert,所以显式等待后就直接用.accept()
except NoAlertPresentException:
return False
driver.switch_to.alert点击alert
@property
def alert(self): # 方法
"""
Switches focus to an alert on the page. :Usage:
alert = driver.switch_to.alert
"""
alert = Alert(self._driver) # 本质还是用的Alert()
alert.text # 不知道他要这个做啥
return alert
三、补充说明
- 打开iqiyi.com你可能会看到这样的弹出框,这个并非alert,虽然他也无法用inspector找到元素。这种弹框的处理要用selenium提供的option禁止显示
- 我司提供的一个案例:点击confirm(elementUI风格)按钮,你用inspector移动到元素上就能看到这个元素的属性,说明就不是一个alert
- 一个同学提供的素材:弹出框也不是网页的元素,但这也不是alert。
最新文章
- html5 选择元素
- ShareSDK分享失败的原因
- 转: 认识 HTTPS
- 再次熟悉jdbc连接mysql
- IEEE浮点数表示法之出小数
- HDU 3518 Boring counting(后缀数组,字符处理)
- 微软职位内部推荐-This Job is no longer available.
- How to save/read file on different platforms
- Android开发JDBC连接mysql数据库导入驱动方法
- GDB调试总结__1
- vs2013中国集
- javascript面向对象2
- cisco 2950 3550 3750 系列交换机密码破解
- 安装zsh后出现命令行无法识别已安装的node
- hibernate使用注解简化开发
- java网络编程(4)——udp实现聊天
- python 识别图片上的数字
- 使用Visual Studio Team Services敏捷规划和项目组合管理(二)——VSTS中的工作项
- 解决不能再jupyter notebook中使用tensorflow
- IntelliJ IDE 常用配置
热门文章
- 2022-11-04 Acwing每日一题
- Go语言核心36讲24
- 在 Solidity 中 ++i 为什么比 i++ 更省 Gas?
- (C++) C++虚函数性能分析
- 【SQL真题】SQL1: 各个视频的平均完播率 【AVG/SUM/IF/CASE】
- 【SQL基础】多表查询:子查询、连接查询(JOIN)、组合查询(UNION集合运算)
- 【每日一题】【动态规划】2022年2月22日-NC59 矩阵的最小路径和
- Effective C++试读笔记
- 【译】2022 年回顾:Web 性能有哪些新变化?
- 基于ERNIELayout&;pdfplumber-UIE的多方案学术论文信息抽取