一、如何识别
-
识别方法: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。