谈谈Selenium中的三种切换之alert
谈谈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中的三种等待方式(显示等待WebDriverWait()、隐式等待implicitly()、强制等待sleep())---基于python
我们在实际使用selenium或者appium时,等待下个等待定位的元素出现,特别是web端加载的过程,都需要用到等待,而等待方式的设置是保证脚本稳定有效运行的一个非常重要的手段,在selenium中 ...
- 关于selenium中的三种等待方式与EC模块的知识
1. 强制等待 第一种也是最简单粗暴的一种办法就是强制等待sleep(xx),强制让闪电侠等xx时间,不管凹凸曼能不能跟上速度,还是已经提前到了,都必须等xx时间. 看代码: 1 2 3 4 5 6 ...
- selenium中的三种等待方式
1.强制等待,采用的time.sleep,然后后面加上要等待的时间: 2.隐性等待implicitly_wait,隐性等待设定后,会对之后的所有代码生效,会在设定的时间之内,不停的去查找元素,如果找到 ...
- Hive中的三种不同的数据导出方式介绍
问题导读:1.导出本地文件系统和hdfs文件系统区别是什么?2.带有local命令是指导出本地还是hdfs文件系统?3.hive中,使用的insert与传统数据库insert的区别是什么?4.导出数据 ...
- (java)selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待
selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待 本例包括窗口最大化,刷新,切换到指定窗口,后退,前进,获取当前窗口url等操作: import java. ...
- 简单谈谈Python中的几种常见的数据类型
简单谈谈Python中的几种常见的数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等 ...
- Java三大框架之——Hibernate中的三种数据持久状态和缓存机制
Hibernate中的三种状态 瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID. 持久状态:对象经过 ...
- Asp.Net中的三种分页方式
Asp.Net中的三种分页方式 通常分页有3种方法,分别是asp.net自带的数据显示空间如GridView等自带的分页,第三方分页控件如aspnetpager,存储过程分页等. 第一种:使用Grid ...
- httpClient中的三种超时设置小结
httpClient中的三种超时设置小结 本文章给大家介绍一下关于Java中httpClient中的三种超时设置小结,希望此教程能给各位朋友带来帮助. ConnectTimeoutExceptio ...
- MySQL buffer pool中的三种链
三种page.三种list.LRU控制调优 一.innodb buffer pool中的三种页 1.free page:从未用过的页 2.clean page:干净的页,数据页的数据和磁盘一致 3.d ...
随机推荐
- 4.mysql-进阶
1.事务 将多个操作步骤变成一个事务,任何一个步骤失败,则回滚到事务的所有步骤之前状态,大白话:要成功都成功:要失败都失败. 如转账操作,A扣钱.B收钱,必须两个步骤都成功,才认为转账成功 innod ...
- Kubernetes基础_Service暴露的两种方式
一.前言 kubernetes集群中,pod是多变的,可以被新建或删除,而且ip不稳定,不方便集群外部访问,所以提供了一种新的资源 Service ,就是就是 a set of Pod ,作用是提供一 ...
- 【第6篇】AI语音测试简介
1.4 AI语音测试简介 AI语音测试是针对人工智能语音交互的测试,人工智能语音交互一般包含语音识别技术(ASR).自然语言处理技术(NLP)和语音合成技术(TTS)等3大部分,通俗地来讲AI语音测试 ...
- 硬核!Apache Hudi Schema演变深度分析与应用
1.场景需求 在医疗场景下,涉及到的业务库有几十个,可能有上万张表要做实时入湖,其中还有某些库的表结构修改操作是通过业务人员在网页手工实现,自由度较高,导致整体上存在非常多的新增列,删除列,改列名的情 ...
- flex布局中,元素等间距设置,包括第一个元素的左边,最后一个元素的右边,也等间距
项目中很多地方会用到等间距排放的场景,使用flex 布局可以很方便的实现 .fu{ display: flex; ustify-content: space-between; } 通过上面代码,可以实 ...
- hashlib/subprocess/logging模块
内容概要 hashlib加密模块 subprocess模块 logging日志模块 软件开发主要流程 加密详情 1.加密的意义: 加密是指将明文数据转化程密文数据>>>>为了保 ...
- 如何实现一个优秀的 HashTable 散列表?
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 前言 大家好,我是小彭. 在前几篇文章里,我们聊到了 Java 中的几种线性表结构,包括 ArrayList ...
- 学习ASP.NET Core Blazor编程系列十五——查询
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- 手摸手,使用Dart语言开发后端应用,来吧!
前言 这几天连续发了几篇关于 Dart 开发后端应用的文章,主要是介绍了 Dart 的一些优点,比如异步任务,并发处理,编译部署等等. 俗话说,光说不练假把式,今天我们来真正开始一个 Dart 后端应 ...
- python注释、变量、数据类型详细
目录 1.python注释 2.PEP8规范 3.变量与常量 1.python中的变量 2.变量名的命名规范 3.常量的基本使用 1.python注释 什么是注释? 注释是对代码的解释说明,写注释是为 ...