本文来介绍如何处理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. 《Unity預計算即時GI》笔记:二、光照图

    说明 这篇文章是对<Unity預計算即時GI>这个系列文章的笔记. 光照图 什么是光照图 光照图在第三章中有如下的定义,读起来很是费解. 一個光照圖(Chart)是表示一個光照貼圖的區域, ...

  2. iBrand 教程:Xshell 软件安装过程截图及配置

    下载 教程中使用的相关软件下载网盘: https://pan.baidu.com/s/1bqVD5MJ 密码:4lku 安装 请右键以管理员身份运行进行软件安装,安装过程如下: 配置 安装完成并运行软 ...

  3. Centos install ICU, INTL for php

    1. Install ICU from source wget http://download.icu-project.org/files/icu4c/56.1/icu4c-56_1-src.tgz ...

  4. UVA 12118 Inspector's Dilemma(连通性,欧拉路径,构造)

    只和连通分量以及度数有关.不同连通分量只要连一条边就够了,连通分量为0的时候要特判.一个连通分量只需看度数为奇的点的数量,两个端点(度数为奇)是必要的. 如果多了,奇点数也一定是2的倍数(一条边增加两 ...

  5. Android(java)学习笔记98:如何让你的GridView不再滚动

    1. 如何让你的GridView不再滚动: GridView显示不完整的原因是因为,他的外层也套用了一个滑动的控件,这个解决办法是:重写GridView,是控制GridView不能滚动,就是写一个类继 ...

  6. 【BZOJ2730】[HNOI2012] 矿场搭建(找割点)

    点此看题面 大致题意: 一张无向图,要求你在去掉任意一个节点之后,剩余的每个节点都能到达一个救援出口,问至少需要几个救援出口. 第一步:\(Tarjan\)求割点 首先,我们要跑一遍\(Tarjan\ ...

  7. 3204: 数组做函数参数--排序函数2--C语言

    3204: 数组做函数参数--排序函数2--C语言 时间限制: 1 Sec  内存限制: 128 MB提交: 211  解决: 143[提交][状态][讨论版][命题人:smallgyy] 题目描述 ...

  8. sessionStorage 和 localStorage

    html5 中的 web Storage 包括了两种存储方式:sessionStorage 和 localStorage. sessionStorage 用于本地存储一个会话(session)中的数据 ...

  9. 2018.11.3 Nescafe18 T1 七夕祭

    题目 背景 七夕节因牛郎织女的传说而被扣上了「情人节」的帽子.于是 TYVJ 今年举办了一次线下七夕祭.Vani 同学今年成功邀请到了 cl 同学陪他来共度七夕,于是他们决定去 TYVJ七夕祭游玩. ...

  10. position的 relative+absolute实现固定标签在窗口的某个位置

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...