Selenium2+python自动化13-多窗口、句柄(handle)

前言

有些页面的链接打开后,会重新打开一个窗口,对于这种情况,想在新页面上操作,就得先切换窗口了。获取窗口的唯一标识用句柄表示,所以只需要切换句柄,我们就能在多个页面上灵活自如的操作了。

本篇以打开百度新闻页面搜索按钮上的链接页面为例,依次打开每个按钮,并检验测试结果。用脚本批量操作,可以减少重复劳动,重复的事情让脚本去执行吧!

一、定位一组元素

1.打开百度新闻页面:17http://news.baidu.com/17

2.定位搜索框上一排按钮网页、贴吧,知道等

3.定位一组元素方法在第八篇已经讲过,这里就不多讲,通过firebug可以查看他们有共同属性标签为a,且有个老爸为:<div class="tab">

二、获取当前窗口句柄

1.当点击百度新闻页面上“网页”按钮时,会打开一个新的窗口

2.人为操作的话,可以通过点击窗口切换到不同的窗口上,但是脚本它不知道你要操作哪个窗口,这时候只能获取窗口唯一的标识:句柄

3.获取当前页面的句柄:driver.current_window_handle

1470719326447960.png903x456 15.6 KB

三、获取所有句柄

1.先通过css定位到所有按钮:".tab>a"

2.从定位的一组中随便取一个点击打开

3.然后获取当前页面的所有句柄,发现此时有两个了

四、切换句柄

1.循环判断是否与首页句柄相等

2.如果不等,说明是新页面的句柄

3.获取的新页面句柄后,可以切换到新打开的页面上

4.打印新页面的title,看是否切换成功

五、关闭新窗口,切回主页

1.打开新页面后,其实只想验证新页面跳转对不对,这里可以做个简单的验证,获取当前页面的title验证

2.验证完后切关闭新窗口

3.切回句柄到首页

4.打印当前页面的句柄,看是否切换到首页了

六、批量操作

1.把需要校验的结果放在list队列r里

2.for循环遍历执行每个按钮的点击操作

3.判断结果对应list里的每个结果

七、最终脚本

1.整理后最终脚本如下,结果如图所示

# coding:utf-8

from selenium import webdriver

import time

driver = webdriver.Firefox()

driver.get("http://news.baidu.com/")

driver.implicitly_wait(10)

# 获取当前窗口句柄

h = driver.current_window_handle

# 定位网页、贴吧等链接

s = driver.find_elements_by_css_selector(".tab>a")

r = [u"百度一下", u"贴吧", u"知道",  u"音乐",

u"图片", u"视频", u"地图", u"百科", u"文库"]

for a, b in zip(s, r):

a.click()

text = a.text

time.sleep(2)

all_h = driver.window_handles

# 循环判断是否与首页句柄相等

for i in all_h:

if i != h:

driver.switch_to.window(i)

time.sleep(1)

print driver.title

if b in driver.title:

print(text+u"页面打开正常")

else:

print(text+u"页面测试失败")

driver.close()                       # 关闭当前页面

driver.switch_to.window(h)           # 切回句柄到首页

driver.quit

时间: 2024-11-12 12:01:48

Selenium2+python自动化13-多窗口、句柄(handle)的相关文章

Selenium2+python自动化29-js处理多窗口

前言 在打开页面上链接的时候,经常会弹出另外一个窗口(多窗口情况前面这篇有讲解:Selenium2+python自动化13-多窗口.句柄(handle)),这样在多个窗口之间来回切换比较复杂,那么有没有办法让新打开的链接在一个窗口打开呢? 要解决这个问题,得从html源码上找到原因,然后修改元素属性才能解决.很显然js在这方面是万能的,于是本篇得依靠万能的js大哥了. 一.多窗口情况 1.在打baidu的网站链接时,会重新打开一个窗口  (注意:我的百度页面是已登录状态,没登录时候是不会重新打开

Selenium2+python自动化61-Chrome浏览器(chromedriver)【转载】

前言 selenium2启动Chrome浏览器是需要安装驱动包的,但是不同的Chrome浏览器版本号,对应的驱动文件版本号又不一样,如果版本号不匹配,是没法启动起来的. 一.Chrome遇到问题 1.如果在启动chrome浏览器时候,出现如下界面,无法打开网址,那么首先恭喜你,踩到了坑,接下来的内容或许对你有所帮助 >># coding:utf-8>>from selenium import webdriver >>driver = webdriver.Chrome()

Selenium2+python自动化59-数据驱动(ddt)

前言 在设计用例的时候,有些用例只是参数数据的输入不一样,比如登录这个功能,操作过程但是一样的.如果用例重复去写操作过程会增加代码量,对应这种多组数据的测试用例,可以用数据驱动设计模式,一组数据对应一个测试用例,用例自动加载生成. 一.环境准备 1.安装ddt模块,打开cmd输入pip install ddt在线安装 >>pip install ddt 二.数据驱动原理 1.测试数据为多个字典的list类型 2.测试类前加修饰@ddt.ddt 3.case前加修饰@ddt.data() 4.运

Selenium2+python自动化39-关于面试的题

前言 最近看到群里有小伙伴贴出一组面试题,最近又是跳槽黄金季节,小编忍不住抽出一点时间总结了下, 回答不妥的地方欢迎各位高手拍砖指点. 一.selenium中如何判断元素是否存在? 首先selenium里面是没有这个方法的,判断元素存在需要自己写一个方法了. 元素存在有几种形式,一种是页面有多个元素属性重复的,这种直接操作会报错的:还有一种是页面隐藏的元素操作也会报错 判断方法参考这篇:Selenium2+python自动化36-判断元素存在 二.selenium中hidden或者是displa

Selenium2+python自动化47-判断弹出框存在(alert_is_present)

前言 系统弹窗这个是很常见的场景,有时候它不弹出来去操作的话,会抛异常.那么又不知道它啥时候会出来,那么久需要去判断弹窗是否弹出了. 本篇接着Selenium2+python自动化42-判断元素(expected_conditions)讲expected_conditions这个模块 一.判断alert源码分析 class alert_is_present(object):    """ Expect an alert to be present.""&q

Selenium2+python自动化54-unittest生成测试报告(HTMLTestRunner)

前言 批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成HTML格式的. unittest里面是不能生成html格式报告的,需要导入一个第三方的模块:HTMLTestRunner 一.导入HTMLTestRunner 1.这个模块下载不能通过pip安装了,只能下载后手动导入,下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html 2.Download下HTMLTestRunner.py文件就是我们需

Selenium2+python自动化52-unittest执行顺序

前言 很多初学者在使用unittest框架时候,不清楚用例的执行顺序到底是怎样的.对测试类里面的类和方法分不清楚,不知道什么时候执行,什么时候不执行. 本篇通过最简单案例详细讲解unittest执行顺序. 一.案例分析 1.先定义一个测试类,里面写几个简单的case # coding:utf-8import unittestimport timeclass Test(unittest.TestCase):    def setUp(self):        print "start!"

Selenium2+python自动化43-判断title(title_is)

前言 获取页面title的方法可以直接用driver.title获取到,然后也可以把获取到的结果用做断言. 本篇介绍另外一种方法去判断页面title是否与期望结果一种,用到上一篇Selenium2+python自动化42-判断元素(expected_conditions) 提到的expected_conditions模块里的title_is和title_contains两种方法 一.源码分析 1.首先看下源码,如下 class title_is(object):    """

Selenium2+python自动化33-文件上传(send_keys)

前言 文件上传是web页面上很常见的一个功能,自动化成功中操作起来却不是那么简单. 一般分两个场景:一种是input标签,这种可以用selenium提供的send_keys()方法轻松解决: 另外一种非input标签实现起来比较困难,可以借助autoit工具或者SendKeys第三方库. 本篇以博客园的上传图片为案例,通过send_keys()方法解决文件上传问题 一.识别上传按钮 1.点开博客园编辑器里的图片上传按钮,弹出”上传本地图片”框. 2.用firebug查看按钮属性,这种上传图片按钮

Selenium2+python自动化41-绕过验证码(add_cookie)

前言 验证码这种问题是比较头疼的,对于验证码的处理,不要去想破解方法,这个验证码本来就是为了防止别人自动化登录的.如果你能破解,说明你们公司的验证码吗安全级别不高,那就需要提高级别了. 对应验证码,要么是让开发在测试环境弄个万能的验证码,如:1234,要么就是尽量绕过去,如本篇介绍的添加cookie的方法. 一.fiddler抓包 1.前一篇讲到,登录后会生成一个已登录状态的cookie,那么只需要直接把这个值添加到cookies里面就可以了. 2.可以先手动登录一次,然后抓取这个cookie,