谈谈Selenium中的三种切换之alert

时间:2023-02-14 15:10:12

一、如何识别

  • 识别方法:alert中的确定、取消、输入框无法用inspector定位到,当然还有一些特例。

  • alert分为三种

    • alert
    • confirm
    • prompt
  • 分别对应3个js的命令(可在chrome的console面板中调试)

    • alert('确认')

谈谈Selenium中的三种切换之alert

  • confirm('确认或取消')

谈谈Selenium中的三种切换之alert

  • prompt('输入信息后确认或取消')

谈谈Selenium中的三种切换之alert

二、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 >
        <input type="button" >
        <input type="button" >
        <input type="button" >
    </div>
</body>
</html>
  • 效果如图所示,点击三个按钮会弹出之前说明的3种对话框

谈谈Selenium中的三种切换之alert

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"  ...
    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"  ...
    # 弹出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"  ...
    # 弹出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禁止显示

谈谈Selenium中的三种切换之alert

  • 我司提供的一个案例:点击confirm(elementUI风格)按钮,你用inspector移动到元素上就能看到这个元素的属性,说明就不是一个alert

谈谈Selenium中的三种切换之alert

  • 一个同学提供的素材:弹出框也不是网页的元素,但这也不是alert。

谈谈Selenium中的三种切换之alert

谈谈Selenium中的三种切换之alert