谈谈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的更多相关文章

  1. selenium中的三种等待方式(显示等待WebDriverWait()、隐式等待implicitly()、强制等待sleep())---基于python

    我们在实际使用selenium或者appium时,等待下个等待定位的元素出现,特别是web端加载的过程,都需要用到等待,而等待方式的设置是保证脚本稳定有效运行的一个非常重要的手段,在selenium中 ...

  2. 关于selenium中的三种等待方式与EC模块的知识

    1. 强制等待 第一种也是最简单粗暴的一种办法就是强制等待sleep(xx),强制让闪电侠等xx时间,不管凹凸曼能不能跟上速度,还是已经提前到了,都必须等xx时间. 看代码: 1 2 3 4 5 6 ...

  3. selenium中的三种等待方式

    1.强制等待,采用的time.sleep,然后后面加上要等待的时间: 2.隐性等待implicitly_wait,隐性等待设定后,会对之后的所有代码生效,会在设定的时间之内,不停的去查找元素,如果找到 ...

  4. Hive中的三种不同的数据导出方式介绍

    问题导读:1.导出本地文件系统和hdfs文件系统区别是什么?2.带有local命令是指导出本地还是hdfs文件系统?3.hive中,使用的insert与传统数据库insert的区别是什么?4.导出数据 ...

  5. (java)selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待

    selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待 本例包括窗口最大化,刷新,切换到指定窗口,后退,前进,获取当前窗口url等操作: import java. ...

  6. 简单谈谈Python中的几种常见的数据类型

    简单谈谈Python中的几种常见的数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等 ...

  7. Java三大框架之——Hibernate中的三种数据持久状态和缓存机制

    Hibernate中的三种状态   瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID. 持久状态:对象经过 ...

  8. Asp.Net中的三种分页方式

    Asp.Net中的三种分页方式 通常分页有3种方法,分别是asp.net自带的数据显示空间如GridView等自带的分页,第三方分页控件如aspnetpager,存储过程分页等. 第一种:使用Grid ...

  9. httpClient中的三种超时设置小结

    httpClient中的三种超时设置小结   本文章给大家介绍一下关于Java中httpClient中的三种超时设置小结,希望此教程能给各位朋友带来帮助. ConnectTimeoutExceptio ...

  10. MySQL buffer pool中的三种链

    三种page.三种list.LRU控制调优 一.innodb buffer pool中的三种页 1.free page:从未用过的页 2.clean page:干净的页,数据页的数据和磁盘一致 3.d ...

随机推荐

  1. ftp多用户多目录配置

    测试环境:centos7 1. 装包与卸载 yum -y install vsftpd yum -y autoremove vsftpd&&rm -rf /etc/vsftpd /et ...

  2. windows10 ftp文件夹错误

    遇到问题: 解决办法: 1. cmd直接访问 ftp ip 2. 启用tftp client 从文件夹访问 注直接访问会弹出如之前报错一样的失败:ftp://ip ftp://用户:密码@ip 使用如 ...

  3. elasticsearch的教程

    简介: 假期自学了elasticsearch搭建与使用,写个博客记录一下 另外我电脑是linux,我懒得再说windows各种配置方法了,不过都是大同小异 1.软件的简介 ElasticSearch是 ...

  4. sublime text配置java运行环境

    java正常运行流程 首先一个 test.java 文件 如果要运行这个文件需要先编译 javac test.java 然后在同级目录会生成一个test.class 文件 然后 java test 来 ...

  5. 【JVM调优】Day03:GC参数、OOM出现方式、调优实战

    一.常用GC参数(20个左右即可) 1.各种垃圾回收器的参数 PS + PO 常用的只有几十个 CMS的比较多,不建议使用 G1的常用参数简单 ZGC只有三个参数 二.OOM出现的方式 1.写一个让内 ...

  6. python爬取网易云音乐评论及相关信息

    python爬取网易云音乐评论及相关信息 urllib requests 正则表达式 爬取网易云音乐评论及相关信息 urllib了解 参考链接: https://www.liaoxuefeng.com ...

  7. AssertionError: Class XXXXX missing "Meta.model" attribute

    源码示例: from rest_framework import serializers from set.models import Set class SetSerializers(seriali ...

  8. JavaScript:对象:如何创建对象?

    JS是面向对象的语言,除开基础数据类型,其他所有的数据类型都是对象,包括函数. 如何去理解对象,什么是对象呢? 举个例子,比如我们将日常生活中见到的猫这种动物,抽象成一个类Cat,这里不去谈类是什么概 ...

  9. JavaScript:操作符:赋值运算符和空赋值(??=)

    =号是赋值运算,即返回符号右边的结果,同时将结果赋值给符号左边的变量,考虑下面代码的运行结果: 赋值运算b = 1 + 1,做了两件事,先返回符号右边的结果,即2,这个2将参与a = 1 + 2的计算 ...

  10. 【转载】EXCEL VBA 选取非连续的单元格区域——Areas集合

    出处:http://www.360doc.com/content/21/1113/17/77710807_1004011085.shtml 前面我们讲的大多是**并操作单个的单元格,或者是连续的单元格 ...