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实现递归遍历文件夹并删除文件
Apr 18 Python
详解Python的Flask框架中生成SECRET_KEY密钥的方法
Jun 07 Python
再谈Python中的字符串与字符编码(推荐)
Dec 14 Python
Python编程实现的简单Web服务器示例
Jun 22 Python
Python编程实现的简单神经网络算法示例
Jan 26 Python
Python从数据库读取大量数据批量写入文件的方法
Dec 10 Python
Python函数返回不定数量的值方法
Jan 22 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
Jul 11 Python
Django 响应数据response的返回源码详解
Aug 06 Python
python实现四人制扑克牌游戏
Apr 22 Python
Python中使用filter过滤列表的一个小技巧分享
May 02 Python
pandas参数设置的实用小技巧
Aug 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
一些花式咖啡的配方
2021/03/03 冲泡冲煮
在同一窗体中使用PHP来处理多个提交任务
2006/10/09 PHP
php获取四位字母和数字的随机数的实现方法
2015/01/09 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
2019/08/13 PHP
JavaScript 新手24条实用建议[TUTS+]
2009/06/21 Javascript
javascript 系统文件夹文件操作及参数介绍
2013/01/08 Javascript
js判断undefined类型,undefined,null, 的区别详细解析
2013/12/16 Javascript
高性能JavaScript循环语句和条件语句
2016/01/20 Javascript
关于jquery中动态增加select,事件无效的快速解决方法
2016/08/29 Javascript
解决Vue不能检测数组或对象变动的问题
2018/02/24 Javascript
新手快速上手webpack4打包工具的使用详解
2019/01/28 Javascript
用Electron写个带界面的nodejs爬虫的实现方法
2019/01/29 NodeJs
详解vue配置后台接口方式
2019/03/29 Javascript
vue学习笔记之Vue中css动画原理简单示例
2020/02/29 Javascript
[46:58]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第一场 12.17
2020/12/19 DOTA
Python中使用gzip模块压缩文件的简单教程
2015/04/08 Python
Python实现的爬虫刷回复功能示例
2018/06/07 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
对python 读取线的shp文件实例详解
2018/12/22 Python
Python Django 实现简单注册功能过程详解
2019/07/29 Python
python 函数的缺省参数使用注意事项分析
2019/09/17 Python
python批量将excel内容进行翻译写入功能
2019/10/10 Python
使用 Python 清理收藏夹里已失效的网站
2019/12/03 Python
python 多维高斯分布数据生成方式
2019/12/09 Python
Python pandas库中的isnull()详解
2019/12/26 Python
html5用video标签流式加载的实现
2020/05/20 HTML / CSS
师范大学音乐表演专业求职信
2013/10/23 职场文书
售后服务承诺书范文
2014/03/26 职场文书
小班评语大全
2014/05/04 职场文书
审计局班子四风对照检查材料思想汇报
2014/10/07 职场文书
怎样写离婚协议书
2015/01/26 职场文书
Redis Cluster 字段模糊匹配及删除
2021/05/27 Redis
sql时间段切分实现每隔x分钟出一份高速门架车流量
2022/02/28 SQL Server
python中字符串String及其常见操作指南(方法、函数)
2022/04/06 Python
SpringCloud Function SpEL注入漏洞分析及环境搭建
2022/04/08 Java/Android
Python使用BeautifulSoup4修改网页内容
2022/05/20 Python