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类的多重继承问题深入分析
Nov 09 Python
Python学习教程之常用的内置函数大全
Jul 14 Python
python dataframe astype 字段类型转换方法
Apr 11 Python
Python3之读取连接过的网络并定位的方法
Apr 22 Python
python通过Windows下远程控制Linux系统
Jun 20 Python
Python玩转加密的技巧【推荐】
May 13 Python
ORM Django 终端打印 SQL 语句实现解析
Aug 09 Python
tensorflow之tf.record实现存浮点数数组
Feb 17 Python
python单例模式的应用场景实例讲解
Feb 24 Python
Python使用scapy模块发包收包
May 07 Python
pytorch损失反向传播后梯度为none的问题
May 12 Python
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
May 21 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
codeigniter中测试通过的分页类示例
2014/04/17 PHP
php计算整个mysql数据库大小的方法
2015/06/19 PHP
PHP扩展Memcache分布式部署方案
2015/12/06 PHP
CI框架使用composer安装的依赖包步骤与方法分析
2016/11/21 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
PHP简单验证码功能机制实例详解
2019/03/27 PHP
网页和浏览器兼容性问题汇总(draft1)
2009/06/01 Javascript
JQUERY实现左侧TIPS滑进滑出效果示例
2013/06/27 Javascript
Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
2015/01/01 NodeJs
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
AngularJS模块详解及示例代码
2016/08/17 Javascript
详解win7 cmd执行vue不是内部命令的解决方法
2017/07/27 Javascript
详解node nvm进行node多版本管理
2017/10/21 Javascript
vue实例中data使用return包裹的方法
2018/08/27 Javascript
JavaScript实现动态添加、移除元素或属性的方法分析
2019/01/03 Javascript
小程序如何支持使用 async/await详解
2019/09/12 Javascript
Nodejs监控事件循环异常示例详解
2019/09/22 NodeJs
vue 实现element-ui中的加载中状态
2020/11/11 Javascript
快速了解Python中的装饰器
2018/01/11 Python
详解python OpenCV学习笔记之直方图均衡化
2018/02/08 Python
Python cookbook(数据结构与算法)将序列分解为单独变量的方法
2018/02/13 Python
500行代码使用python写个微信小游戏飞机大战游戏
2019/10/16 Python
详解Python中第三方库Faker
2020/09/25 Python
canvas压缩图片以及卡片制作的方法示例
2018/12/04 HTML / CSS
Expedia韩国官网:亚洲发展最快的在线旅游门户网站
2018/02/26 全球购物
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
杭州时比特电子有限公司SQL
2013/08/22 面试题
EJB3.1都有哪些改进
2012/11/17 面试题
网上蛋糕店创业计划书
2014/01/24 职场文书
幼儿园教师培训方案
2014/02/04 职场文书
《蜗牛》教学反思
2014/02/18 职场文书
竞聘演讲稿
2014/04/24 职场文书
12.4法制宣传日活动总结
2014/08/26 职场文书
公司股份合作协议书
2014/12/07 职场文书
Nginx代理同域名前后端分离项目的完整步骤
2021/03/31 Servers
关于Nginx中虚拟主机的一些冷门知识小结
2022/03/03 Servers