selenium之 辨识alert、window以及操作

原创 2016年08月24日 11:01:04
  • 4820
  • 0
  • 2

更多关于python selenium的文章,请关注我的专栏:Python Selenium自动化测试详解


很多人分辨不出什么是alert、什么是window,今天讨论下怎么辨识alert和window,以及页面元素如div伪装的对话框。

1.分辨

首先区别下alert、window和伪装对话框:

  • alert,浏览器弹出框,一般是用来确认某些操作、输入简单的text或用户名、密码等,根据浏览器的不同,弹出框的样式也不一样,不过都是很简单的一个小框。在firebug中是无法获取到该框的元素的,也就是说alert是不属于网页DOM树的。如下图所示: 
     
     

  • window,浏览器窗口,点击一个链接之后可能会打开一个新的浏览器窗口,跟之前的窗口是平行关系(alert跟窗口是父子关系,或者叫从属关系,alert必须依托于某一个窗口),有自己的地址栏、最大化、最小化按钮等。这个很容易分辨。

  • div伪装对话框,是通过网页元素伪装成对话框,这种对话框一般比较花哨,内容比较多,而且跟浏览器一看就不是一套,在网页中用firebug能够获取到其的元素,如下图: 

2.alert操作

针对alert,selenium提供了相应的类来进行处理。

selenium.webdriver.common.alert.Alert(driver)

先列出Alert的所有操作:

  1. Alert(driver).accept() # 等同于点击“确认”或“OK”
  2. Alert(driver).dismiss() # 等同于点击“取消”或“Cancel”
  3. Alert(driver).authenticate(username,password) # 验证,针对需要身份验证的alert,目前还没有找到特别合适的示例页面
  4. Alert(driver).send_keys(keysToSend) # 发送文本,对有提交需求的prompt框(上图3)
  5. Alert(driver).text # 获取alert文本内容,对有信息显示的alert框
  • 1
  • 2
  • 3
  • 4
  • 5

示例代码:

示例1:switch_to.alert , accept() , text

测试链接http://sahitest.com/demo/alertTest.htm

  1. # -*- coding: utf-8 -*-
  2. from selenium import webdriver
  3. from time import sleep
  4. driver = webdriver.Firefox()
  5. driver.maximize_window()
  6. driver.get('http://sahitest.com/demo/alertTest.htm')
  7. driver.find_element_by_name('b1').click()
  8. a1 = driver.switch_to.alert # 通过switch_to.alert切换到alert
  9. sleep(1)
  10. print a1.text # text属性输出alert的文本
  11. a1.accept() # alert“确认”
  12. sleep(1)
  13. driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

结果

  1. Alert Message
  • 1

示例2:Alert(driver) , dismiss()

测试链接http://sahitest.com/demo/confirmTest.htm

  1. # -*- coding: utf-8 -*-
  2. from selenium import webdriver
  3. from time import sleep
  4. from selenium.webdriver.common.alert import Alert
  5. driver = webdriver.Firefox()
  6. driver.maximize_window()
  7. driver.get('http://sahitest.com/demo/confirmTest.htm')
  8. driver.find_element_by_name('b1').click()
  9. a1 = Alert(driver) # 直接实例化Alert对象
  10. sleep(1)
  11. print a1.text # text属性输出alert的文本
  12. a1.dismiss() # alert“取消”
  13. sleep(1)
  14. driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

结果

  1. Some question?
  • 1

示例3:switch_to.alert , send_keys(keysToSend)

测试链接http://sahitest.com/demo/promptTest.htm

  1. # -*- coding: utf-8 -*-
  2. from selenium import webdriver
  3. from time import sleep
  4. driver = webdriver.Firefox()
  5. driver.maximize_window()
  6. driver.get('http://sahitest.com/demo/promptTest.htm')
  7. driver.find_element_by_name('b1').click()
  8. a1 = driver.switch_to.alert # 通过switch_to.alert切换到alert
  9. sleep(1)
  10. print a1.text # text属性输出alert的文本
  11. a1.send_keys('send some words to alert!') # 往prompt型alert中传入字符串
  12. sleep(1)
  13. a1.accept()
  14. print driver.find_element_by_name('t1').get_attribute('value')
  15. driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

结果

  1. Some prompt?
  2. send some words to alert!
  • 1
  • 2

authenticate(username,password)方法没有找到合适的示例网页,不在这里写示例代码,不过用法是和send_keys一样,不过是传入两个参数而已。并且这种框很少出现,便不做更多研究。

3.window操作

window类似于alert,不过与原window是平行的,所以只需要切换到新的window上便可以操作该window的元素。

driver.switch_to.window(window_handle)

而window是通过window句柄handle来定位的。而selenium提供了两个属性方法来查询window句柄:

driver.current_window_handle 
driver.window_handles

用以上两个属性获取到当前窗口以及所有窗口的句柄,就可以切换到其他的window了。

示例代码:

测试链接http://sahitest.com/demo/index.htm

  1. # -*- coding: utf-8 -*-
  2. from selenium import webdriver
  3. from time import sleep
  4. from selenium.webdriver.common.alert import Alert
  5. driver = webdriver.Firefox()
  6. driver.maximize_window()
  7. driver.get('http://sahitest.com/demo/index.htm')
  8. current_window = driver.current_window_handle # 获取当前窗口handle name
  9. driver.find_element_by_link_text('Window Open Test With Title').click()
  10. all_windows = driver.window_handles # 获取所有窗口handle name
  11. # 切换window,如果window不是当前window,则切换到该window
  12. for window in all_windows:
  13. if window != current_window:
  14. driver.switch_to.window(window)
  15. print driver.title # 打印该页面title
  16. driver.close()
  17. driver.switch_to.window(current_window) # 关闭新窗口后切回原窗口,在这里不切回原窗口,是无法操作原窗口元素的,即使你关闭了新窗口
  18. print driver.title # 打印原页面title
  19. driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

结果:

  1. With Title
  2. Sahi Tests
  • 1
  • 2

这里有一些注意事项:

  1. 只能通过window的name来切换窗口,但window的name不是你想象的窗口title之类的,而是一串字符串,如‘{976ae257-19be-4b32-a82e-4ba5063ed0a2}’,所以你用title、url之类的想切window是不可能的
  2. 关闭了新窗口之后,driver并不会自动跳转回原窗口,而是需要你switch回来,直接去定位窗口元素会报NoSuchElementException

3.div类对话框

div类对话框是普通的网页元素,通过正常的find_element就可以定位并进行操作。不在这里进行详述。注意设置一定的等待时间,以免还未加载出来便进行下一步操作,造成NoSuchElementException报错。

#对于对话框是frame的对话框,采用switch_to_frame来进行定位。当遇到对话框是DIV的时候则采用本文的方法进行处理

driver = webdriver.Firefox()
driver.get('http://www.baidu.com')

#点击登录链接
driver.find_element_by_name('tj_login').click()

#通过二次定位找到用户名输入框。先找到弹出的DIV,然后再在页面上定位到需要操作的元素
div = driver.find_element_by_class_name('tang-content').find_element_by_name('userName')
div.send_keys('username')

#输入登录密码
driver.find_element_by_name('password')

#点击登录
driver.find_element_by_id('TANGRAM_PSP_10_submit').click()

python - 辨识alert、window以及操作的更多相关文章

  1. selenium+python之 辨识alert、window以及操作

    1.分辨 首先区别下alert.window和伪装对话框: alert,浏览器弹出框,一般是用来确认某些操作.输入简单的text或用户名.密码等,根据浏览器的不同,弹出框的样式也不一样,不过都是很简单 ...

  2. 基本的window.document操作及实例

    基本的window.document操作及实例 找元素 1.根据id找 var d1 = document.getElementById("d1"); alert(d1); 2.根 ...

  3. 2016/2/22 1、DOM的基本概念 2、Window对象操作 3、Windows.history对象 4、Window.location对象 5、Window.status对象

    1.DOM的基本概念 DOM是文档对象模型,这种模型为树模型:文档是指标签文档:对象是指文档中每个元素:模型是指抽象化的东西. 2.Window对象操作 一.属性和方法: 属性(值或者子对象): op ...

  4. Python程序中的进程操作--—--开启多进程

    Python程序中的进程操作-----开启多进程 之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创 ...

  5. Android 悬浮窗 System Alert Window

    悬浮窗能显示在其他应用上方.桌面系统例如Windows,macOS,Ubuntu,打开的程序能以窗口形式显示在屏幕上. 受限于屏幕大小,安卓系统中主要使用多任务切换的方式和分屏的方式.视频播放,视频对 ...

  6. DOM、Window对象操作

    一.DOM的基本概念 DOM是文档对象模型,这种模型为树模型:文档是指标签文档:对象是指文档中每个元素:模型是指抽象化的东西. 一.基本语法: 数据类型(字符串,小数,整数,布尔,时间) var, v ...

  7. python 文件及文件夹操作

    python 文件.目录操作(新增.移动.删除等) python 文件夹与文件操作 mport string, os, sys dir = '/var' print '----------- no s ...

  8. 使用Python对Excel进行读写操作

    学习Python的过程中,我们会遇到Excel的读写问题.这时,我们可以使用xlwt模块将数据写入Excel表格中,使用xlrd模块从Excel中读取数据.下面我们介绍如何实现使用Python对Exc ...

  9. Python/Django(CBV/FBV/ORM操作)

    Python/Django(CBV/FBV/ORM操作) CBV:url对应的类(模式) ##====================================CBV操作============ ...

随机推荐

  1. untiy AnimationEvent添加返回参数

    using UnityEngine; using System.Collections; public class Try : MonoBehaviour { public class Action ...

  2. vue教程2-组件化开发

    全局组件 <div id="app"> <cs1></cs1> </div> <script> Vue.componen ...

  3. JMeter(7) 优化判断返回类型和返回值

    之前判断接口类型和返回值用beanshell,可见JMeter(5)-JMeter之BeanShell使用 优化点 接口测试里面对返回字段的类型验证和值验证为基本需求,将方法导成jar文件,导入之后方 ...

  4. 管道是如何随着WebHost的开启被构建出来的?

    管道是如何随着WebHost的开启被构建出来的? 注册的服务器和中间件共同构成了ASP.NET Core用于处理请求的管道, 这样一个管道是在我们启动作为应用宿主的WebHost时构建出来的.要深刻了 ...

  5. js 回车提交表单

    一.整个页面用一个回车提交事件: <input type="button" value="回车提交" id="auto" onclic ...

  6. 将SpringBoot默认使用的tomcat替换为undertow

    随着微服务的兴起,越来越多的互联网应用在选择web容器时使用更加轻量的undertow或者jetty.SpringBoot默认使用的容器是tomcat,如果想换成undertow容器,只需修改pom. ...

  7. Java基础:(八)异常

    Throwable可以用来表示任何可以作为异常抛出的类,分为两种:Error和Exception.其中Error用来表示JVM无法处理的错误, Exception又分为两种: 受检异常:需要用try. ...

  8. 【转】Maven项目中将配置文件打包到jar包中

    参考博客:http://blog.csdn.net/ciedecem/article/details/10382275 问题: 项目中需要用到从文件中加载json数据,如图放在conf目录下. 程序中 ...

  9. iOS VIPER架构(二)

    第一篇文章对VIPER进行了简单的介绍,这篇文章将从VIPER的源头开始,比较现有的几种VIPER实现,对VIPER进行进一步的职责剖析,并对各种细节实现问题进行挖掘和探讨.最后给出两个完整的VIPE ...

  10. ComboBox控件“设置 DataSource 属性后无法修改项集合”的解决【转】

    编写Winform程序,遇到comboBox的绑定事件和索引项变更事件的冲突问题,就是“设置 DataSource 属性后无法修改项集合”的错误问题,网上查了很多,大多说在索引项变更是进行非空判断,还 ...