本文来介绍如何处理driver在多窗口之间切换,想一下这样的场景,在页面A点击一个连接,会触发在新Tab或者新窗口打开页面B,由于之前的driver实例对象在页面A,但是你接下来的脚本是操作页面B的元素,这样就造成了找不到元素的报错。本来介绍selenium中switch_to.window()方法来处理这个问题。

测试场景:打开百度新闻(页面A),点击热点新闻中第一个新闻链接(一般是国家领导人的新闻),会在第二个窗口打开这个新闻的具体详情页(页面B),测试需要去判断你点击这个这个新闻,在打开的详情页是否正确。

问题拆分:

1. 我们已经知道switch_to.window()方法可以处理窗口切换的问题

2. 在页面A跳转到页面B之前,我们需要用一个变量保存这个新闻的标题

3. 切换到页面B后,我们获取这个新闻标题,然后和前面这个变量保存的值去对比,如果相等,那么就测试通过。

我们分两个步骤去解答这个测试需求:

1. 先实现页面A切换到页面B

2. 页面A和页面B两个新闻标题进行对比

先看看窗口切换的脚本代码:

# coding=utf-8
import time
from selenium import webdriver

driver = webdriver.Chrome()
driver.maximize_window()
driver.get('http://news.baidu.com')
time.sleep(1)

driver.find_element_by_xpath("//*[@id='pane-news']/div/ul/li[1]/strong/a").click()
print driver.current_window_handle # 输出当前窗口句柄
handles = driver.window_handles # 获取当前全部窗口句柄集合
print handles # 输出句柄集合

for handle in handles:# 切换窗口
if handle != driver.current_window_handle:
print 'switch to second window',handle
driver.close() # 关闭第一个窗口
driver.switch_to.window(handle) #切换到第二个窗口

代码解释:
1. 先打印当前窗口(页面A)句柄,一个长字符串

2. 获取全部窗口句柄,这里我们有两个,打印出这两个句柄。

3. for 循环遍历,当发现其中一个句柄和当前句柄不相等,这里做了三件事,第一件,打印一个语句,告诉你马上要切换到第二个窗口,第二件,关闭当前窗口,这里指页面A,第三,切换到页面B窗口。

这里在切换到第二个页面时候,我关闭之前的页面A,只是我个人测试习惯,你可以不关闭,但是你的要思路清晰,哪些元素在页面A还是在页面B,如果操作了页面B后还要操作页面A的元素,你还要切换到页面A,为了麻烦,建议你每次切换都把前面页面给关闭。

判断在打开新页面显示的新闻标题是不是你刚刚点击的新闻,脚本代码如下:

# coding=utf-8
import time
from selenium import webdriver

driver = webdriver.Chrome()
driver.maximize_window()
driver.get('http://news.baidu.com')
time.sleep(1)

news_link = driver.find_element_by_xpath("//*[@id='pane-news']/div/ul/li[1]/strong/a")
page1_title_string = news_link.text #得到页面A新闻标题
news_link.click() # 点击新闻链接
time.sleep(1)
handles = driver.window_handles

for handle in handles:# 切换窗口(切换到搜狗)
if handle != driver.current_window_handle:
print 'switch to second window',handle
driver.close() # 关闭第一个窗口
driver.switch_to.window(handle) #切换到第二个窗口
page2_title_string = driver.find_element_by_xpath("//*[@id='yc_con_txt']/p[1]").text # 详情页有一个原标题

try :
assert page1_title_string in page2_title_string # 判断页面B标题是否包含页面A标题
print ('Test Pass.')
except Exception as e:
print ('Test Fail')
注意:很有可能遇到,页面A的标题是简短,页面B的标题是长标题,这个时候就需要采取,字符串包含的关系去断言,我这里刚好打开的详情页有一个叫 “原标题:xxxx”,由于这个新闻具有时效性,等你看这篇文章,可能脚本运行不成功,需要调整下脚本,如果不好断言,就放弃断言部分,本文只学窗口切换,至于测试断言技能,需要你不断去写脚本,去掌握和提高的部分。

欢迎关注老王公众号

Python+Selenium练习篇之19-多窗口之间切换的更多相关文章

  1. Python+Selenium练习篇之1-摘取网页上全部邮箱

    前面已经介绍了Python+Selenium基础篇,通过前面几篇文章的介绍和练习,Selenium+Python的webUI自动化测试算是入门了.接下来,我计划写第二个系列:练习篇,通过一些练习,了解 ...

  2. Python+Selenium中级篇之8-Python自定义封装一个简单的Log类《转载》

    Python+Selenium中级篇之8-Python自定义封装一个简单的Log类: https://blog.csdn.net/u011541946/article/details/70198676

  3. Python+Selenium基础篇之5-第一个完整的自动化测试脚本

    前面文章,我们介绍了如何采用XPath表达式去定位网页元素,在掌握了如何抓取或者如何书写精确的XPath表达式后,我们可以开始写自己的第一个真正意义上的webui 自动化测试脚本,就相当于,你在学习P ...

  4. Python+Selenium基础篇之1-环境搭建

    Python + Selenium 自动化环境搭建过程 1. 所需组建 1.1 Selenium for python 1.2 Python 1.3 Notepad++ 作为刚初学者,这里不建议使用P ...

  5. python+selenium多窗口之间切换

    #!/usr/bin/env python # coding:utf8 # author:Z time:2018/9/19 import time from selenium import webdr ...

  6. Python+Selenium基础篇-打开和关闭火狐浏览器

    本节介绍如何初始化一个webdriver实例对象driver,然后打开和关闭firefox浏览器.要用selenium打开fiefox浏览器.首先需要去下载一个driver插件geckodriver. ...

  7. Python+Selenium中级篇之-封装一个自己的类-浏览器引擎类

    前一篇文章我们知道了,如何去封装几个简单的Selenium方法到我们自定义的类,这次我们编写一个类,叫浏览器引擎类,通过更改一个字符串的值,利用if语句去判断和控制启动那个浏览器.这里我们暂时,支持三 ...

  8. Python+Selenium基础篇之2-打开和关闭火狐浏览器

    本节介绍如何初始化一个webdriver实例对象driver,然后打开和关闭firefox浏览器.要用selenium打开fiefox浏览器.首先需要去下载一个driver插件geckodriver. ...

  9. Windows+Python+Selenium基础篇之1-环境搭建

    1.所需工具包1.1Selenium for python1.2  Python  1.3  Notepad++或python IDE 2.  环境搭建2.1  下载和安装Pythonpython2. ...

随机推荐

  1. python基础-三元运算和bytes数据

    三元运算       进制 二进制,01 八进制,01234567 十进制,0123456789 十六进制,0123456789ABCDEF   bytes类型 http://www.cnblogs. ...

  2. HTTPS的加密流程(通俗易懂,不可错过)

    为什么要有HTTPS 都说进技术的产生就是为了解决旧技术的一些弊端. HTTP具有相当优秀的一面,但是凡事有利也有弊,在HTTP进行高速通信的过程中可能产生以下几个问题: HTTP采用明文传输.明文传 ...

  3. 如何使用cPanel管理域名和数据库

    cPanel是一个基于web的基于web的控制面板,它简化了许多常见的系统管理任务,如网站创建.数据库部署和管理等.本指南向您展示了如何使用cPanel用户帐户管理域和数据库.所有这些指令都与位于端口 ...

  4. Copy Failed Error Access to fobidden

    使用SVN的branch/tag命令来切包时,报出了一下错误提示 就这个错误,调了整整一天,如果你也遇到了类似问题,我真心希望下面解决问题的过程能帮助到你:D 解决过程: 1.网上查了很多帖子,发现跟 ...

  5. 流媒体 5——MPEG声音

    1. 听觉系统的感知特性: MPEG声音的数据压缩和编码不是依据波形本身的相关性和模拟人的发音器官的特性,而是利用人的听觉系统的特性来达到压缩声音数据的目的,这种压缩编码称为感知声音编码. 许多科学工 ...

  6. UVA 215 Spreadsheet Calculator (模拟)

    模拟题.每个单元格有表达式就dfs,如果有环那么就不能解析,可能会重复访问到不能解析的单元格,丢set里或者数组判下重复. 这种题首先框架要对,变量名不要取的太乱,细节比较多,知道的库函数越多越容易写 ...

  7. NOIP2018赛前停课集训记——最后的刷板子计划

    前言 再过两天就\(NOIP2018\)了. 于是,我决定不做其他题目,开始一心一意刷板子了. 这篇博客记录的就是我的刷板子计划. [洛谷3383][模板]线性筛素数 这种普及-的题目我还写挂了两次( ...

  8. 【BZOJ1433】[ZJOI2009] 假期的宿舍(二分图匹配入门)

    点此看题面 大致题意:有\(n\)个学生,其中一部分是在校学生,一部分不是,而在校学生中一部分回家,一部分不回家,并且我们用一个01矩阵表示学生之间相互认识关系.已知每个学生只能睡自己认识的人的床(当 ...

  9. 2017.12.25 Linux系统的使用

    Linux系统的使用 现在标配的系统是 Linux + Nginx + PHP + MySQL ,这样的配置越来越多的大公司在用的了说到配置不同的是一个公司的规约,比如说挂载一般分为2个盘, / 下面 ...

  10. SqlServer触发器的理解

    SqlServer触发器是与表事件相关的特殊存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发.比如当对一个表进行操作( insert,delete, update)时就会激活它执行. ...