自动化测试中对Alert, 多窗口,下拉框的处理

1 python与selenium的API交互

1.1 alert

selenium的API提供了对alert弹出框的处理方式,可以对alert弹出框来进行处理的,如弹出框,我们获取弹出框的Text,或者接受弹出框,或者是取消(关闭)弹出框,下面分别是alert,Confirmation,Prompt进行一一的说明。selenium操作alert需要导入alert的发类,具体为:fromselenium.webdriver.common.alert import Alert alert类的属性汇总如下:

方法

描述

Example

text

获取弹出框的文本

alert.text

accept

接收javascript警告框

alert.accept()

dismiss

拒绝javascript警告框

alert.dismiss()

Send_keys(value)

模拟输入

alert.send_keys(value)

text

text是获取alert弹出框的文本,在百度搜索设置中,设置成功后,点击"搜索设置",弹出alert框,alert框文本显示为:“已经记录下您的使用偏好”,见效果图:

我们通过如下的代码,获取该alert弹出框的text,见如下的代码:

#coding:utf-8

fromselenium import webdriver

fromselenium.webdriver.common.by import By

fromselenium.webdriver.common.action_chains import ActionChains

fromselenium.common.exceptions import NoSuchElementException,UnexpectedTagNameException

fromselenium.webdriver.support.ui import Select

fromselenium.webdriver.common.alert import Alert

fromtime import sleep

driver=webdriver.Firefox()

driver.maximize_window()

driver.implicitly_wait(30)

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

sleep(2)

driver.find_element_by_link_text(u'设置').click()

driver.find_element_by_xpath(".//*[@id='wrapper']/div[5]/a[1]").click()

select=Select(driver.find_element_by_name('NR'))

select.select_by_value(u'50')

driver.find_element_by_xpath(".//*[@id='gxszButton']/a[1]").click()

#获取弹出alert框的text

printdriver.switch_to_alert().text

driver.quit()

accept()

accept表示接受javascript的警告框,一个 alert弹出框弹出后,用户可以选择接受或者拒绝,我们任然已百度搜索为案例,实现对搜索设置的接收,见实现的代码:

#coding:utf-8

fromselenium import webdriver

fromselenium.webdriver.common.by import By

fromselenium.webdriver.common.action_chains import ActionChains

fromselenium.common.exceptions import NoSuchElementException,UnexpectedTagNameException

fromselenium.webdriver.support.ui import Select

fromselenium.webdriver.common.alert import Alert

fromtime import sleep

driver=webdriver.Firefox()

driver.maximize_window()

driver.implicitly_wait(30)

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

sleep(2)

driver.find_element_by_link_text(u'设置').click()

driver.find_element_by_xpath(".//*[@id='wrapper']/div[5]/a[1]").click()

select=Select(driver.find_element_by_name('NR'))

select.select_by_value(u'50')

driver.find_element_by_xpath(".//*[@id='gxszButton']/a[1]").click()

#接受

printdriver.switch_to_alert().accept()

#验证是否已接受alert

sleep(3)

driver.find_element_by_link_text(u'设置').click()

driver.find_element_by_xpath(".//*[@id='wrapper']/div[5]/a[1]").click()

assert driver.find_element_by_name('NR').get_attribute('value') in '50'

driver.quit()

dismiss()

dismiss表示取消javascript的警告框,即拒绝,我们任然已百度搜索设置为案例,来说明dismiss的使用方法,见实现的代码:

#coding:utf-8

fromselenium import webdriver

fromselenium.webdriver.common.by import By

fromselenium.webdriver.common.action_chains import ActionChains

fromselenium.common.exceptions import NoSuchElementException,UnexpectedTagNameException

fromselenium.webdriver.support.ui import Select

fromselenium.webdriver.common.alert import Alert

fromtime import sleep

driver=webdriver.Firefox()

driver.maximize_window()

driver.implicitly_wait(30)

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

sleep(2)

driver.find_element_by_link_text(u'设置').click()

driver.find_element_by_xpath(".//*[@id='wrapper']/div[5]/a[1]").click()

select=Select(driver.find_element_by_name('NR'))

select.select_by_value(u'20')

driver.find_element_by_xpath(".//*[@id='gxszButton']/a[1]").click()

#拒绝alert框

printdriver.switch_to_alert().dismiss()

driver.quit()

4.1.1 alert

alert是一种警告框,自动化的测试中,对alert的,一般会获取alert的文本,或者是接受 alert警告框,或者是拒绝警告框。如下是些的一个测试的alert的源码,见源码:

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title></title>

<script>

alert("这是一个测试alert的数据")

</script>

</head>

<body>

</body>

</html>

效果图为:

我们获取alert的text,并且接受alert的警告框,实现这样的一个过程的测试脚本为:

#coding:utf-8

from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.common.action_chainsimport ActionChains

from selenium.common.exceptions importNoSuchElementException, UnexpectedTagNameException

from selenium.webdriver.support.uiimport Select

from selenium.webdriver.common.alert importAlert

from time import sleep

driver=webdriver.Firefox()

driver.maximize_window()

driver.implicitly_wait(30)

driver.get('file:///C:/Users/liwangping/Desktop/demo.html')

#输出alert的text

print driver.switch_to_alert().text

driver.switch_to_alert().accept()

driver.quit()

4.1.2Confirmmation

conirmation是确认的对话框,用户可以点击确定或者取消,如下是编写的见html的代码:

<html>

<head>

<meta charset="UTF-8">

<title></title>

<script type="text/javascript">

function disp_confirm()

{

varr=confirm("Press a button")

if(r==true)

{

document.write("You pressed OK!")

}

else

{

document.write("You pressed Cancel!")

}

}

</script>

</head>

<body>

<input type="button"onclick="disp_confirm()"

value="请点击" />

</body>

</html>

效果图是:

我们实现点击“请点击”,然后点击“确定”的按钮,实现这样的一个过程的自动化的测试脚本为:

#coding:utf-8

from selenium import webdriver

from selenium.webdriver.common.by import By

fromselenium.webdriver.common.action_chains import ActionChains

from selenium.common.exceptions importNoSuchElementException, UnexpectedTagNameException

from selenium.webdriver.support.uiimport Select

from selenium.webdriver.common.alert importAlert

from time import sleep

driver=webdriver.Firefox()

driver.maximize_window()

driver.implicitly_wait(30)

driver.get('file:///C:/Users/liwangping/Desktop/demo.html')

#点击“请点击”

driver.find_element_by_xpath("html/body/input").click()

#点击确定按钮

driver.switch_to_alert().accept()

sleep(6)

driver.quit()

4.1.3Prompt

prompt是javascript中的一个方法,prompt() 方法是用于可提示用户输入的对话框,如下代码是一个实例,见具体的代码:

<html>

<head>

<meta charset="UTF-8">

<title></title>

<scripttype="text/javascript">

functiondisp_prompt(){

var name=prompt("Please enter yourname","")

if (name!=null &&name!=""){

document.write("Hello " +name + "!")

}

}

</script>

</head>

<body>

<inputtype="button" onclick="disp_prompt()"

value="请点击"/>

</body>

</html>

案例是点击按钮,弹出输入框,输入内容,然后会显示:hello输入的内容,见效果图;

点击确定后,见显示的效果图:

实现这样的一个过程的自动化测试脚本如下:

#coding:utf-8

fromselenium import webdriver

fromselenium.webdriver.common.by import By

fromselenium.webdriver.common.action_chains import ActionChains

fromselenium.common.exceptions import NoSuchElementException,UnexpectedTagNameException

fromselenium.webdriver.support.ui import Select

fromselenium.webdriver.common.alert import Alert

fromtime import sleep

driver=webdriver.Firefox()

driver.maximize_window()

driver.implicitly_wait(30)

driver.get('file:///C:/Users/liwangping/Desktop/demo.html')

#点击“请点击”

driver.find_element_by_xpath("html/body/input").click()

#输入内容

driver.switch_to_alert().send_keys('webdriver')

driver.switch_to_alert().accept()

driver.quit()

4.2 Select类

选择类是一类特殊的selenium,主要使用场景在下拉菜单或者列表中,它提供了各种方法和属性的用户交互。操作select我们需要陪导入select类:from selenium.webdriver.support.ui import Select 选择类的属性和方法汇总如下:

方法

描述

Example

all_selected_options

得到列表的所有选择项

element.all_selected_options

first_selected_option

得到第一个选择项

element.first_selected_option

options

得到了所有选项的列表

element.options

deselect_all()

清楚所有从一个下拉框

element.deselect_all()

deselect_by_index(index)

取消选择在给定的下拉框的选项

element. deselect_by_index(1)

deselect_by_value(value)

匹配下拉框中的值

element. deselect_by_value(value)

deselected_by_visible_text(text)

显示文本的选项匹配参数下拉

element. deselected_by_visible_text(text)

select_by_index(index)

选择给定索引的下拉框

element.select_by_index(1)

select_by_value(value)

选择下拉框匹配的value

element.select_by_value(value)

select_by_visible_text(text)

选择文本匹配的下拉框

element.select_by_visible_text(text)

测试案例的html代码见如下:

<html>

<head>

<meta charset="UTF-8">

<title></title>

</head>

<body>

<selectid="selectMethod"onchange="updateShipping(options[selectedIndex]);"name="selectMethod">

<optionvalue="c">C语言</option>

<optionvalue="c++">C++语言</option>

<optionvalue="java">java语言</option>

<optionvalue="c#">C#语言</option>

<optionvalue="python">python语言</option>

<optionvalue="ruby">ruby语言</option>

<optionvalue="html">html脚本</option>

</select>

</body>

</html>

该html执行后的效果为:

all_selected_options

all_selected_options是得到列表的所有选择项,具体案例代码见如下:

#!coding:utf-8

fromselenium import webdriver

fromselenium.webdriver.common.by import By

fromselenium.webdriver.common.action_chains import ActionChains

fromselenium.common.exceptions import NoSuchElementException,UnexpectedTagNameException

fromselenium.webdriver.support.ui import Select

fromtime import sleep

driver=webdriver.Firefox()

driver.maximize_window()

driver.implicitly_wait(30)

driver.get('file:///C:/Users/liwangping/Desktop/demo.html')

select=Select(driver.find_element_by_id('selectMethod'))

printselect.all_selected_options

driver.quit()

first_selected_option

first_selected_option是得到下拉框的第一个选项,案例中的下拉框第一个选项是C语言,实现过程见如下的代码:

#coding:utf-8

fromselenium import webdriver

fromselenium.webdriver.common.by import By

fromselenium.webdriver.common.action_chains import ActionChains

fromselenium.common.exceptions import NoSuchElementException,UnexpectedTagNameException

fromselenium.webdriver.support.ui import Select

fromtime import sleep

driver=webdriver.Firefox()

driver.maximize_window()

driver.implicitly_wait(30)

driver.get('file:///C:/Users/liwangping/Desktop/demo.html')

select=Select(driver.find_element_by_id('selectMethod'))

print select.first_selected_option

driver.quit()

select_by_index(index)

select_by_index(index)是获取下拉框的对应的索引文件,如获取java语言,对应的索引为2,切记索引从0开始,实现的过程见如下的代码:

#coding:utf-8

fromselenium import webdriver

fromselenium.webdriver.common.by import By

fromselenium.webdriver.common.action_chains import ActionChains

fromselenium.common.exceptions import NoSuchElementException,UnexpectedTagNameException

fromselenium.webdriver.support.ui import Select

fromtime import sleep

driver=webdriver.Firefox()

driver.maximize_window()

driver.implicitly_wait(30)

driver.get('file:///C:/Users/liwangping/Desktop/demo.html')

select=Select(driver.find_element_by_id('selectMethod'))

select.select_by_index(2)

sleep(3)

driver.quit()

select_by_value(value)

select_by_value(value)是获取下拉框中匹配的value值,如下拉框想选择"python语言",对应的value="python",下拉框的效果图为:

实现代码见如下:

#coding:utf-8

fromselenium import webdriver

fromselenium.webdriver.common.by import By

fromselenium.webdriver.common.action_chains import ActionChains

fromselenium.common.exceptions import NoSuchElementException,UnexpectedTagNameException

fromselenium.webdriver.support.ui import Select

fromtime import sleep

driver=webdriver.Firefox()

driver.maximize_window()

driver.implicitly_wait(30)

driver.get('file:///C:/Users/liwangping/Desktop/demo.html')

select=Select(driver.find_element_by_id('selectMethod'))

select.select_by_value('python')

sleep(3)

driver.quit()

select_by_visible_text(text)

select_by_visible_text(text)在选择下拉框中,是依据text来匹配的,如想选择"python语言"一项,对应的text="python语言",实现该功能的代码见如下:

#coding:utf-8

fromselenium import webdriver

fromselenium.webdriver.common.by import By

fromselenium.webdriver.common.action_chains import ActionChains

fromselenium.common.exceptions import NoSuchElementException,UnexpectedTagNameException

fromselenium.webdriver.support.ui import Select

fromtime import sleep

driver=webdriver.Firefox()

driver.maximize_window()

driver.implicitly_wait(30)

driver.get('file:///C:/Users/liwangping/Desktop/demo.html')

select=Select(driver.find_element_by_id('selectMethod'))

select.select_by_visible_text(u'python语言')

sleep(3)

driver.quit()

在百度搜索设置的页面中,搜索结果显示条数,可以在下拉框选择对应的数据,见百度的案例效果图;

我们搜索结果显示条数下拉框“每页显示50条”实现的代码为:

#coding:utf-8

fromselenium import webdriver

fromselenium.webdriver.common.by import By

fromselenium.webdriver.common.action_chains import ActionChains

fromselenium.common.exceptions import NoSuchElementException,UnexpectedTagNameException

fromselenium.webdriver.support.ui import Select

fromtime import sleep

driver=webdriver.Firefox()

driver.maximize_window()

driver.implicitly_wait(30)

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

driver.find_element_by_link_text(u'设置').click()

driver.find_element_by_xpath(".//*[@id='wrapper']/div[5]/a[1]").click()

select=Select(driver.find_element_by_name('NR'))

select.select_by_value(u'50')

driver.quit()

4.3浏览器多窗口的处理

在web测试中,特别是在注册页面,或者点击XX链接,还会弹出一些子窗口,在手工测试中,可以很轻松的实现在多个窗口之间进行切换操作,很幸运的,selenium也提供了处理的过程,处理的过程是先获取到所有的窗口句柄,再获取到当前窗口的句柄,判断是否是当前窗口,如果是,就可以对当前窗口进行操作,如果不是,就是另外一个窗口,从而对另外一个窗口进行操作。

window_handles()是返回所有窗口句柄current_window_handle和window_handles都是对窗口句柄的处理,一般使用的场景是在自动化测试中,某些时候,在当前页面,点击一个链接,跳转到一个新的页面,这样至少产生了二个页面,而利用current_window_handle和window_handles就可以解决该问题,可以在当前窗口进行操作,也可以在新的页面进行操作。就已百度登录页面为实例,在百度登录,点击“立即注册”,页面跳转到注册的页面,这样的一个实例来具体说下current_window_handle和window_handles的使用方法,具体处理的流程是这样的:

1、 在当前页面,先获取当前页面窗口的句柄;

2、 点击跳转到新的页面,获取所有窗口句柄;

3、 使用if判断是在当前窗口还是在新的窗口,判断不是当前窗口,在新的窗口操作,操作完成后,关闭新的窗口;

4、回到当前的窗口,操作当前窗口,操作完成后,关闭浏览器。

已百度登录页面为实例,点击立即注册,会弹出注册的窗口,见该效果图以及测试脚本:

#coding:utf-8

fromselenium import webdriver

import time

driver=webdriver.Firefox()

driver.maximize_window()

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

driver.find_element_by_link_text(u'登录').click()

#获取当前窗口句柄

handle=driver.current_window_handle

driver.find_element_by_class_name('pass-reglink').click()

#获取所有窗口句柄

handles=driver.window_handles

fordataHandle in handles:

if handle!=dataHandle:

driver.switch_to_window(dataHandle)

driver.find_element_by_id('TANGRAM__PSP_4__account').send_keys(u'我现在在注册页面')

time.sleep(3)

driver.close()

#到登录页面

driver.switch_to_window(handle)

driver.find_element_by_id('TANGRAM__PSP_8__userName').send_keys(u'我现在在登录页面')

time.sleep(3)

driver.quit()

本文分享自微信公众号 - Python自动化测试(wuya-python)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2015-07-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏武培轩的专栏

HTTP 0.9 HTTP 1.0 HTTP 1.1 HTTP 2.0区别

HTTP协议 :Hyper Text Transfer Protocol(超文本传输协议),是用于从万维网(WWW:World Wide Web)服务器传输超文...

35750
来自专栏C/C++基础

DOS常用命令大全

2010-04-17 22:27:19|  分类: 电脑技术 |  标签:dos命令大全 |字号大中小 订阅

27510
来自专栏好好学java的技术栈

并发基础篇(一): 线程介绍

15230
来自专栏用户2442861的专栏

recv函数说明返回值

客户端的程序连接上服务器后recv函数阻塞接受,有时会返回0,说明接收超时服务器主动断开了连接,需要重新connect服务器,但重新connect时会报“Tr...

71810
来自专栏云霄雨霁

应用层的常见协议

20100
来自专栏Albert陈凯

HTTP、TCP、UDP:通信协议的规则和区别

TCP、HTTP、UDP:都是通信协议,也就是通信时所遵守的规则,只有双方按照这个规则“说话”,对方才能理解或为之服务。 TCP HTTP UDP三者的...

34180
来自专栏华仔的技术笔记

Block类型变量-缓存Http请求与回调

36260
来自专栏我是攻城师

关于Hbase多版本存储的一个注意点

565160
来自专栏老秦求学

汇编语言学习之汇编语言源程序的输入

  在dos下输入汇编源程序的方法   一 环境的搭建   windows下运行“windows+r”键入“cmd”,就就进入dos系统,输入“debug”进入...

36350
来自专栏大闲人柴毛毛

Linux系统服务——Daemon

什么是Daemon? Daemon是Linux的一些系统服务,它们是一些常驻内存的进程。 Daemon分类 Daemon拥有两种分类方式,按照“daemon是...

45540

扫码关注云+社区

领取腾讯云代金券