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定时采集摄像头图像上传ftp服务器功能实现
Dec 23 Python
Python中struct模块对字节流/二进制流的操作教程
Jan 21 Python
Django如何实现内容缓存示例详解
Sep 24 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
Apr 02 Python
django自带的server 让外网主机访问方法
May 14 Python
django 多数据库配置教程
May 30 Python
TensorFlow的权值更新方法
Jun 14 Python
Python中的字符串切片(截取字符串)的详解
May 15 Python
PyCharm搭建Spark开发环境实现第一个pyspark程序
Jun 13 Python
python函数参数(必须参数、可变参数、关键字参数)
Aug 16 Python
matlab 计算灰度图像的一阶矩,二阶矩,三阶矩实例
Apr 22 Python
Python filter过滤器原理及实例应用
Aug 18 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
解析Extjs与php数据交互(增删查改)
2013/06/25 PHP
form自动提交实例讲解
2017/07/10 PHP
PHP标准库(PHP SPL)详解
2019/03/16 PHP
客户端脚本中常常出现的一些问题和调试技巧
2007/01/09 Javascript
jquery与google map api结合使用 控件,监听器
2010/03/04 Javascript
文档对象模型DOM通俗讲解
2013/11/01 Javascript
js闭包的用途详解
2014/11/09 Javascript
JavaScript中实现Map的示例代码
2015/09/09 Javascript
node.js抓取并分析网页内容有无特殊内容的js文件
2015/11/17 Javascript
javascript实现瀑布流动态加载图片原理
2016/08/12 Javascript
BootStrap 模态框实现刷新网页并关闭功能
2017/01/04 Javascript
微信小程序实现带刻度尺滑块功能
2017/03/29 Javascript
Vue.js教程之axios与网络传输的学习实践
2017/04/29 Javascript
JavaScript获取tr td 的三种方式全面总结(推荐)
2017/08/15 Javascript
详解微信小程序canvas圆角矩形的绘制的方法
2018/08/22 Javascript
JS+HTML5 Canvas实现简单的写字板功能示例
2018/08/30 Javascript
angularJS实现不同视图同步刷新详解
2018/10/09 Javascript
vue-router 中 meta的用法详解
2019/11/01 Javascript
JavaScript常用工具函数库汇总
2020/09/17 Javascript
vue绑定class的三种方法
2020/12/24 Vue.js
python之virtualenv的简单使用方法(必看篇)
2017/11/25 Python
对pytorch网络层结构的数组化详解
2018/12/08 Python
Python3爬虫之自动查询天气并实现语音播报
2019/02/21 Python
python变量的存储原理详解
2019/07/10 Python
Python 继承,重写,super()调用父类方法操作示例
2019/09/29 Python
Python散点图与折线图绘制过程解析
2019/11/30 Python
完美解决keras保存好的model不能成功加载问题
2020/06/11 Python
python数据类型强制转换实例详解
2020/06/22 Python
小学生演讲稿
2014/01/12 职场文书
党员公开承诺事项
2014/03/25 职场文书
经理任命书模板
2014/06/06 职场文书
感恩教育月活动总结
2014/07/07 职场文书
艺术设计专业毕业生推荐信
2014/07/08 职场文书
机械专业毕业生自我鉴定2014
2014/10/04 职场文书
队名及霸气口号大全
2015/12/25 职场文书
python_tkinter事件类型详情
2022/03/20 Python