python - 辨识alert、window以及操作

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的所有操作:

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

示例代码:

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

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

# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.maximize_window()
driver.get(‘http://sahitest.com/demo/alertTest.htm‘)

driver.find_element_by_name(‘b1‘).click()

a1 = driver.switch_to.alert  # 通过switch_to.alert切换到alert
sleep(1)
print a1.text  # text属性输出alert的文本
a1.accept()  # alert“确认”
sleep(1)

driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

结果

Alert Message
  • 1

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

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

# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.alert import Alert

driver = webdriver.Firefox()
driver.maximize_window()
driver.get(‘http://sahitest.com/demo/confirmTest.htm‘)

driver.find_element_by_name(‘b1‘).click()

a1 = Alert(driver)  # 直接实例化Alert对象
sleep(1)
print a1.text  # text属性输出alert的文本
a1.dismiss()  # alert“取消”
sleep(1)

driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

结果

Some question?
  • 1

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

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

# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.maximize_window()
driver.get(‘http://sahitest.com/demo/promptTest.htm‘)

driver.find_element_by_name(‘b1‘).click()

a1 = driver.switch_to.alert  # 通过switch_to.alert切换到alert
sleep(1)
print a1.text  # text属性输出alert的文本
a1.send_keys(‘send some words to alert!‘)  # 往prompt型alert中传入字符串
sleep(1)
a1.accept()
print driver.find_element_by_name(‘t1‘).get_attribute(‘value‘)
driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

结果

Some prompt?
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

# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.alert import Alert

driver = webdriver.Firefox()
driver.maximize_window()
driver.get(‘http://sahitest.com/demo/index.htm‘)

current_window = driver.current_window_handle  # 获取当前窗口handle name
driver.find_element_by_link_text(‘Window Open Test With Title‘).click()

all_windows = driver.window_handles  # 获取所有窗口handle name
# 切换window,如果window不是当前window,则切换到该window
for window in all_windows:
    if window != current_window:
        driver.switch_to.window(window)

print driver.title  # 打印该页面title

driver.close()
driver.switch_to.window(current_window)  # 关闭新窗口后切回原窗口,在这里不切回原窗口,是无法操作原窗口元素的,即使你关闭了新窗口
print driver.title  # 打印原页面title

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

结果:

With Title
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报错。

版权声明:本文为博主原创文章,转载请声明出处并添加原文链接。举报

时间: 2024-08-11 08:46:29

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

Python基础之window常见操作

一.window的常见操作: cd c:\ #进入C盘d: #从C盘切换到D盘 cd python #进入目录cd .. #往上走一层目录dir #查看目录文件列表cd ../.. #往上上走一层目录 二.常见的文件后缀名: .txt 记事本文本文件.doc word文件.xls excel文件.ppt PPT文件.exe 可执行文件.jpg .png .jpeg 图片.gif 动态图片.pdf PDF文件.mp4 .avi 视频.py python文件.java java 文件.c .h c源

基本的window.document操作及实例

基本的window.document操作及实例 找元素 1.根据id找 var d1 = document.getElementById("d1"); alert(d1); 2.根据class找 var d2 = document.getElementsByClassName("d"); alert(d2[1]); 3.根据标签名找 var d3 = document.getElementsByTagName("div"); alert(d3[0

学习python对文件内容的操作

在Python中对文件的操作使用open(filename,"w"),这里filename是文件名称,w指写入操作,会自动覆盖文件中的所有内容,还有r读操作和a追加操作等. 需要注意的是:只能同时进行一项操作,比如写的时候不能读,即使你使用w+参数,也只是读出来空白内容,不过不会报错,所有执行完一项操作使用新的参数才能继续不同的操作,如: f = open(filename,'w')  #以写操作打开文件filename,文件存在则覆盖,不存在则建立 f.write('this is 

Python中列表list常见操作

主要涉及知识点 列表是我们python里面最常见的数据类型,我们主要有以下的操作. 1.索引 2.切片 3.追加 4.删除 5.长度 6.循环 (也称遍历) 7.包含 8.嵌套 例如定义列表: List2=['openstack','python','linux',"docker","zabbix","nginx","linux","linux","123","ww33##&q

Python/C++ 对字符串的操作

字符串操作在任何语言中都很常用. 本文列举了一些常见的Python/c++ 对字符串的操作. c++ 的使用了boost libraray,  所涉及到的函数都在  <boost/algorithm/string.hpp> 中定义.   python  c++ 大小写转换 'str'.upper(),  'str'.lower() boost::to_upper('str'), boost::to_upper_copy('str') 字符串包含某个substr str.find(substr)

Python/Django(CBA/FBA/ORM操作)

Python/Django(CBA/FBA/ORM操作) CBA:url对应的类(模式) 1 ##====================================CBA操作============================ 2 3 # class geting(View): 4 # def dispatch(self, request, *args, **kwargs): 5 # print('before') 6 # obj = super(geting,self).dispat

【Python】Python对文件夹的操作

上一篇介绍了Python对文件的读写操作,现在来介绍一下Python对文件夹的操作.由于我是项目中用到的,所以我就以我的实际应用实例来说明吧.希望对大家有所帮助. 1.实例需求: 现在有一个文件夹myDir,该文件夹中又有n个文件夹dir1,Dir2, ..., dirN,每个文件夹中又有m个文件,这个实例需要达到的目的就是要将这n个文件夹dir1,Dir2, ..., dirN中的所有文件全部写到一个新文件中,该新文件在文件夹myDir下. 2.源代码: test.py代码如下: import

python中关于文件的操作

今天让我们来一起学习一下python中关于文件的操作吧: 先看看以下如果打开文件: #open()打开文件的方法:r参数只能以读的方式打开文件,不能写 =(,,=)data=.read()(data)

DOM、Window对象操作

一.DOM的基本概念 DOM是文档对象模型,这种模型为树模型:文档是指标签文档:对象是指文档中每个元素:模型是指抽象化的东西. 一.基本语法: 数据类型(字符串,小数,整数,布尔,时间) var, var s = "3.14"; var n = parseFloat(s); ; s += 5; var d = parseInt(s); isNaN(字符串):判断是否是数字模样的字符串:是-false: 不是-true 运算符:四大类 表达式: function Show() { } 语