谈谈Selenium中的三种切换之alert

谈谈,selenium,三种,切换,alert · 浏览次数 : 149

小编点评

**三种切换方法的比较:** | 方法 | 描述 | |---|---| | `alert()` | 使用 `alert()` 方法显示确认或取消对话框。 | | `confirm()` | 使用 `confirm()` 方法显示确认或取消对话框,并默认选择“确定”。 | | `prompt()` | 使用 `prompt()` 方法显示输入框,并默认选择“确定”。 | **识别方法:** * `alert()` 元素的 `id` 属性值通常为 `alert`。 * `confirm()` 元素的 `id` 属性值通常为 `confirm`。 * `prompt()` 元素的 `id` 属性值通常为 `prompt`。 **特例:** * `alert()` 元素无法用 `inspector` 找到。 * `confirm()` 元素默认选择“确定”,可以使用 `confirm()` 方法显示其他选择选项。 * `prompt()` 元素默认选择“确定”,可以使用 `prompt()` 方法显示其他选择选项。 **其他提示:** * 使用 `sleep` 延迟几秒以确保对话框显示完毕。 * 使用 `WebDriver.wait` 对象等待元素可见或出现指定事件。 * 确保浏览器已安装了 Chrome驱动程序。

正文

谈谈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相似的内容:

谈谈Selenium中的三种切换之alert

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

谈谈Selenium中浏览器驱动的日志

谈谈Selenium中浏览器驱动的日志 来源于一位同学,“老师为啥firefox执行后会有日志文件,chrome没有呢?” 比对 你打开chrome浏览器 from selenium import webdriver driver = webdriver.Chrome() 这样是没有日志的 同样的代

谈谈为什么要分库分表?

由于数据库的承载能力是有限的,当业务增长量达到一定规模后,数据库的性能就会达到瓶颈。于是产生了分库分表的解决方案,本文将详细讲解什么是分库分表,以及分库分表的原因和可能产生的问题。

谈谈 JVM 垃圾回收机制

前言 垃圾回收需要思考三件事情,哪些内存需要回收?什么时候回收?如何回收? 一、哪些内存需要回收 JVM 的内存区域中,程序计数器、虚拟机栈和本地方法栈的生命周期是随线程而生,随线程而灭的。这几个区域的内存分配和回收都具有确定性,不需要过多考虑回收问题,当方法或线程结束时,内存自然就跟着回收了。 J

谈谈 Spring 的过滤器和拦截器

我们在进行 Web 应用开发时,时常需要对请求进行拦截或处理,故 Spring 为我们提供了过滤器和拦截器来应对这种情况。那么两者之间有什么不同呢?本文将详细讲解两者的区别和对应的使用场景。

谈谈分布式事务原理

分布式系统中,不同服务之间的交互可能会出现各种问题,如网络、异常等,可能会导致服务间的数据产生不一致的情况,如何避免?本文将详细讲述分布式事务的原理和解决方案。

[转帖]谈谈Service与Ingress

https://zhuanlan.zhihu.com/p/596889677 你好,我是张磊。今天我和你分享的主题是:谈谈Service与Ingress。 在上一篇文章中,我为你详细讲解了将Service暴露给外界的三种方法。其中有一个叫作LoadBalancer类型的Service,它会为你在Cl

[转帖]谈谈对K8S CNI、CRI和CSI插件的理解

K8S的设计初衷就是支持可插拔架构,解决PaaS平台不好用、不能用、需要定制化等问题,K8S集成了插件、附加组件、服务和接口来扩展平台的核心功能。附加组件被定义为与环境的其他部分无缝集成的组件,提供类似本机的特性,并扩展集群管理员可用的组件,扩展还可以用于添加自定义软硬件的支持;服务和接口提供了看似

[转帖]谈谈ClickHouse性能情况以及相关优化

https://zhuanlan.zhihu.com/p/349105024 ClickHouse性能情况 主要分为4个方面 1、单个查询吞吐量 场景一: 如果数据被放置在page cache中,则一个不太复杂的查询在单个服务器上大约能够以2-10GB/s(未压缩)的速度进行处理(对于简单的查询,速

谈谈JSF业务线程池的大小配置

本文旨在通过一个简化场景(“单服务应用”)下的负载测试,为“JSF业务线程池大小配置”提供基准测试结果,并形成一些普遍适用的结论。