谈谈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。

selenium切换alert弹窗有两种常用的方法。第一种方法是使用`switch_to.alert`方法将控制权切换alert弹窗上,然后可以使用`accept()`方法确认(alert.accept())弹窗或`dismiss()`方法取消(alert.dismiss())弹窗。例如,以下代码演示了使用这种方法切换和处理alert弹窗: ```python from selenium import webdriver driver = webdriver.Chrome() driver.get('your_url_here') # 点击触发alert弹窗 driver.find_element_by_id('your_element_id').click() # 切换alert弹窗 my_alert = driver.switch_to.alert # 确认或取消alert弹窗 my_alert.accept() # 确认 my_alert.dismiss() # 取消 driver.quit() ``` 另一种方法是使用显式等待来等待alert弹窗的出现,然后再切换到弹窗并进行处理。以下代码演示了使用这种方法切换和处理alert弹窗: ```python from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get('your_url_here') # 点击触发alert弹窗 driver.find_element_by_id('your_element_id').click() # 等待弹窗出现 wait = WebDriverWait(driver, 20) wait.until(EC.alert_is_present()) # 切换alert弹窗 alert = driver.switch_to.alert # 处理弹窗 print(alert.text) # 打印弹窗文本内容 alert.accept() # 确认弹窗 alert.dismiss() # 取消弹窗 alert.send_keys('input_text') # 向弹窗输入内容 driver.quit() ``` 综上所述,在selenium切换和处理alert弹窗可以使用`switch_to.alert`方法或者配合显式等待来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [selenium三大切换 & 三种等待方式](https://blog.csdn.net/m0_53628535/article/details/118630775)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [selenium切换alert弹窗处理](https://blog.csdn.net/qq_38741986/article/details/91468673)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wuxianfeng023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值