一、如何识别
- 识别方法:alert中的确定、取消、输入框无法用inspector定位到,当然还有一些特例。
- alert分为三种- alert- confirm- prompt
- 分别对应3个js的命令(可在chrome的console面板中调试)- alert(‘确认’)

- confirm(‘确认或取消’)

- prompt(‘输入信息后确认或取消’)

二、selenium中如何处理
示例的demo_alert.html
<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>alert</title><script>functionshow_confirm(){var r=confirm("请选择!");if(r==true){
document.write("你选择了确定!");}else{
document.write("你选择了取消!");}}</script></head><body><divid="div1"><inputtype="button"id="alert"value='alert'onclick="alert('欢迎来到松勤软件测试')"><inputtype="button"id="confirm"value='confirm'onclick="show_confirm('请选择你的操作')"><inputtype="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 sleepsleep(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 sleepsleep(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 sleepsleep(1)# 5. 切换并输入内容driver.switch_to.alert.send_keys('hello world') - 此时观察网页,你会发现,并没有如预期般输入内容
- 如果你继续,点击确定
# 6. 切换并点击确定driver.switch_to.alert.accept() - 你会在网页中看到
hello world - 说明实际是写的,但
在chrome中弹出的prompt对话框中并不能看到这个信息 - 如果换成firefox是可以看到效果的,完整代码如下
from selenium import webdriverdriver = webdriver.Firefox()driver.get(r'file:///D:\demo\demo_alert.html')driver.find_element('id','prompt').click()from time import sleepsleep(1)driver.switch_to.alert.send_keys('hello world')driver.switch_to.alert.accept()
另外一种切换方式Alert
- selenium还提供了另外一种方式来操作alert类型元素
from selenium.webdriver.common.alert import AlertAlert(driver).accept()# 跟driver.switch_to.alert.accept()是等价的 - 依次类推
Alert(driver).dismiss()Alert(driver).send_keys('hello')
稳定的切换
- 由于涉及到弹窗,总是会有不稳定的情况出现,这时候显式等待就可以发挥它的作用了
# ... 前面的代码不写了driver.find_element('id','alert').click()from time import sleepsleep(1)from selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECWebDriverWait(driver,5,0.5).until(EC.alert_is_present()).accept() - 你需要有一定的显式等待基础
源码说明
- alert_is_present
classalert_is_present(object):""" Expect an alert to be present."""def__init__(self):passdef__call__(self, driver):try: alert = driver.switch_to.alert return alert # 正常捕获到alert的话,返回的是driver.switch_to.alert,所以显式等待后就直接用.accept()except NoAlertPresentException:returnFalse - driver.switch_to.alert点击alert
@propertydefalert(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。


本文转载自: https://blog.csdn.net/Mantou023/article/details/135010763
版权归原作者 wuxianfeng023 所有, 如有侵权,请联系我们删除。
版权归原作者 wuxianfeng023 所有, 如有侵权,请联系我们删除。