selenium+python自动化测试之多窗口切换


Posted in Python onJanuary 23, 2019

在很多页面上都有可点击的链接,点击这些链接会打开一个新的窗口,这时如果要在新打开的窗口中操作页面,就需要先切换到新窗口中,如果不进行切换操作,还是操作的上一个页面窗口

浏览器窗口的切换通过句柄(handle)来操作,每个窗口都有一个句柄,代表当前窗口,需要操作哪个页面的窗口,切换到窗口对应的句柄。通过driver.switch_to.window(handle)来切换句柄

在新的窗口中打开页面

打开百度首页,点击右上角的新闻链接,默认会在当前窗口中打开。现在通过修改点击元素的属性,让新打开的页面显示在一个新的窗口中。

找到新闻元素的定义

<a class="mnav" href="http://news.baidu.com" rel="external nofollow" name="tj_trnews">新闻</a>

修改上面的代码,为news元素增加一个属性:target=”_blank”,增加这个属性后,再次点击链接,就会开启一个新的窗口来打开页面。通过执行js语句为元素增加属性

# -*- coding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(3)

#通过执行js语句为元素添加target="_blank"属性
js = 'document.getElementsByName("tj_trnews")[0].target="_blank"'
driver.execute_script(js)

news = driver.find_element_by_name('tj_trnews')
news.click()

webdriver执行js语句的内容在后面的博客中会有讲解,这里先使用一下,这样设置后,再次打开新闻页面时就会在新的窗口中打开。在上面的代码中再加入两句

# -*- coding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(3)
print(driver.current_window_handle) #打印当前页面的句柄
print(driver.title) #打印页面标题

#通过执行js语句为元素添加target="_blank"属性
js = 'document.getElementsByName("tj_trnews")[0].target="_blank"'
driver.execute_script(js)

news = driver.find_element_by_name('tj_trnews')
news.click()
time.sleep(3)

handles = driver.window_handles #获取所有打开窗口的句柄
print(handles)

程序输出:

selenium+python自动化测试之多窗口切换

第一次打印的结果是首页的句柄,第二次结果是获取到的当前所有打开的窗口句柄。一共打开了两个窗口,一个是主页,另一个是点击新闻打开的页面,所以第二次获取到的是一个list,包含两个窗口的句柄。

获取到窗口的句柄后,就可以通过切换句柄来操作页面,打开新闻页面后,当前的句柄还是主页的句柄,如果要操作第二个页面,需要将句柄切换到第二个窗口

driver.switch_to.window(handles[1])
print(driver.current_window_handle)
print(driver.title)

输出结果:

selenium+python自动化测试之多窗口切换

可以看到,切换后再次打印的句柄是list的第二个元素,也就是将句柄切换到了第二个打开的新窗口中,这样就可以操作第二个页面中的元素了。在切换句柄后打印了一下页面标题,根据标题得知句柄已经切换到新闻页面窗口了

在操作完新闻页面后,使用close()关闭当前页面,close和quit的区别在selenium+python自动化测试(二)?使用webdriver操作浏览器中已经说明过,关闭当前页面后会回到首页,需要将句柄再切换回主页

driver.switch_to.window(handles[0])
print(driver.title)

输出结果:

selenium+python自动化测试之多窗口切换

句柄又切换为了首页的句柄,现在又可以操作主页的元素了

全部代码:

# -*- coding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(3)
print(driver.current_window_handle) #打印当前窗口的句柄
print(driver.title) #打印当前页面标题

#通过执行js语句为元素添加target="_blank"属性
js = 'document.getElementsByName("tj_trnews")[0].target="_blank"'
driver.execute_script(js)

news = driver.find_element_by_name('tj_trnews')
news.click()
time.sleep(3)

handles = driver.window_handles #获取当前打开的所有窗口的句柄
print(handles)

driver.switch_to.window(handles[1]) #切换到第二个窗口的句柄
print(driver.current_window_handle)
print(driver.title)

driver.switch_to.window(handles[0]) #切换回主页句柄
print(driver.title)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python计算一个序列的平均值的方法
Jul 11 Python
Python提取Linux内核源代码的目录结构实现方法
Jun 24 Python
Python读取word文本操作详解
Jan 22 Python
python使用tornado实现登录和登出
Jul 28 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
Oct 23 Python
Python中@property的理解和使用示例
Jun 11 Python
解决django同步数据库的时候app models表没有成功创建的问题
Aug 09 Python
pytorch自定义二值化网络层方式
Jan 07 Python
Python操作MySQL数据库实例详解【安装、连接、增删改查等】
Jan 17 Python
40行Python代码实现天气预报和每日鸡汤推送功能
Feb 27 Python
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
Apr 03 Python
Django给表单添加honeypot验证增加安全性
May 06 Python
python 去除二维数组/二维列表中的重复行方法
Jan 23 #Python
selenium+python自动化测试之鼠标和键盘事件
Jan 23 #Python
selenium+python自动化测试之页面元素定位
Jan 23 #Python
python 实现矩阵上下/左右翻转,转置的示例
Jan 23 #Python
selenium+python自动化测试之使用webdriver操作浏览器的方法
Jan 23 #Python
对Python实现累加函数的方法详解
Jan 23 #Python
python实现K近邻回归,采用等权重和不等权重的方法
Jan 23 #Python
You might like
PHP中的Streams详细介绍
2014/11/12 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
PHP分享图片的生成方法
2018/04/25 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/02/09 Javascript
JavaScript constructor和instanceof,JSOO中的一对欢喜冤家
2009/05/25 Javascript
自写简单JS判断是否已经弹出页面
2010/10/20 Javascript
JavaScript中的细节分析
2012/06/30 Javascript
javascript中createElement的两种创建方式
2015/05/14 Javascript
javascript控制层显示或隐藏的方法
2015/07/22 Javascript
jQuery EasyUI Dialog拖不下来如何解决
2015/09/28 Javascript
JavaScript实现图片滑动切换的代码示例分享
2016/03/06 Javascript
JS和jQuery使用submit方法无法提交表单的原因分析及解决办法
2016/05/17 Javascript
BootStrap3学习笔记(一)之网格系统
2016/05/20 Javascript
AngularJS实现单独作用域内的数据操作
2016/09/05 Javascript
js数组去重的hash方法
2016/12/22 Javascript
vue-cli脚手架config目录下index.js配置文件的方法
2018/03/13 Javascript
详解vue 兼容IE报错解决方案
2018/12/29 Javascript
详解基于React.js和Node.js的SSR实现方案
2019/03/21 Javascript
[02:15]2014DOTA2国际邀请赛 赛后退役选手回顾
2014/08/01 DOTA
[01:01:24]LGD vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[47:46]完美世界DOTA2联赛 Magma vs GXR 第三场 11.07
2020/11/10 DOTA
python中文乱码的解决方法
2013/11/04 Python
谈谈如何手动释放Python的内存
2016/12/17 Python
python paramiko模块学习分享
2017/08/23 Python
python画微信表情符的实例代码
2019/10/09 Python
python垃圾回收机制(GC)原理解析
2019/12/30 Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
2020/03/24 Python
用 Python 制作地球仪的方法
2020/04/24 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
2020/08/07 Python
python zip()函数的使用示例
2020/09/23 Python
彻底弄明白CSS3的Media Queries(跨平台设计)
2010/07/27 HTML / CSS
Strawberrynet草莓网新加坡站:护肤、彩妆、香水及美发产品
2018/08/31 全球购物
法国在线购买汽车轮胎网站:123pneus.fr
2019/02/25 全球购物
国庆节演讲稿
2014/05/27 职场文书
2016年“11.11”光棍节活动总结
2016/04/05 职场文书
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
2021/08/23 MySQL