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中使用ConfigParser解析ini配置文件实例
Aug 30 Python
朴素贝叶斯算法的python实现方法
Nov 18 Python
在Python中使用lambda高效操作列表的教程
Apr 24 Python
Python访问纯真IP数据库脚本分享
Jun 29 Python
Python实现SMTP发送邮件详细教程
Mar 02 Python
微信跳一跳python辅助脚本(总结)
Jan 11 Python
python opencv实现运动检测
Jul 10 Python
Python编程在flask中模拟进行Restful的CRUD操作
Dec 28 Python
Python爬虫动态ip代理防止被封的方法
Jul 07 Python
python中的 zip函数详解及用法举例
Feb 16 Python
Node.js 和 Python之间该选择哪个?
Aug 05 Python
基于Python爬取京东双十一商品价格曲线
Oct 23 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
Ajax+PHP边学边练 之五 图片处理
2009/12/03 PHP
php jquery 实现新闻标签分类与无刷新分页
2009/12/18 PHP
使用php实现下载生成某链接快捷方式的解决方法
2013/05/07 PHP
CI框架装载器Loader.php源码分析
2014/11/04 PHP
php使用Jpgraph绘制3D饼状图的方法
2015/06/10 PHP
JavaScript异步回调的Promise模式封装实例
2014/06/07 Javascript
jquery.map()方法的使用详解
2015/07/09 Javascript
jQuery超精致图片轮播幻灯片特效代码分享
2015/09/10 Javascript
node.js回调函数之阻塞调用与非阻塞调用
2015/11/13 Javascript
ES6学习教程之块级作用域详解
2017/10/09 Javascript
JS中promise化微信小程序api
2018/04/12 Javascript
Vue.use源码学习小结
2018/06/20 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
vue.js多页面开发环境搭建过程
2019/04/24 Javascript
小程序click-scroll组件设计
2019/06/18 Javascript
layui 点击重置按钮, select 并没有被重置的解决方法
2019/09/03 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
2019/12/01 Javascript
vant实现购物车功能
2020/06/29 Javascript
[03:56]还原FTP电影首映式 DOTA2群星拼出遗迹世界
2014/03/26 DOTA
使用python BeautifulSoup库抓取58手机维修信息
2013/11/21 Python
Python实现多行注释的另类方法
2014/08/22 Python
Python数据类型详解(四)字典:dict
2016/05/12 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
2019/08/19 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
有机婴儿毛毯和衣服:Monica + Andy
2020/03/01 全球购物
英文简历中的自我评价
2013/10/06 职场文书
毕业生自我推荐
2013/11/04 职场文书
体育教育个人自荐信范文
2013/12/01 职场文书
高考学习决心书
2015/02/04 职场文书
关于学习的决心书
2015/02/05 职场文书
城南旧事读书笔记
2015/06/29 职场文书
2015暑假社会调查报告
2015/07/13 职场文书
女方家长婚礼致辞
2015/07/27 职场文书
Java基础之this关键字的使用
2021/06/30 Java/Android
mysql5.7的安装及Navicate长久免费使用的实现过程
2021/11/17 MySQL
如何使用python包中的sched事件调度器
2022/04/30 Python