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脚本使得web页面上的代码高亮显示
Apr 24 Python
深入理解python中的select模块
Apr 23 Python
利用python3随机生成中文字符的实现方法
Nov 24 Python
unittest+coverage单元测试代码覆盖操作实例详解
Apr 04 Python
python dlib人脸识别代码实例
Apr 04 Python
TensorFlow基于MNIST数据集实现车牌识别(初步演示版)
Aug 05 Python
Django REST Framework之频率限制的使用
Sep 29 Python
如何在Python 游戏中模拟引力
Mar 27 Python
带你学习Python如何实现回归树模型
Jul 16 Python
Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法
Jul 28 Python
python实现发送带附件的邮件代码分享
Sep 22 Python
利用python为PostgreSQL的表自动添加分区
Jan 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
php基础设计模式大全(注册树模式、工厂模式、单列模式)
2015/08/31 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
2016/01/11 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
PHP7修改的函数
2021/03/09 PHP
线路分流自动跳转代码;希望对大家有用!
2006/12/02 Javascript
Javascript事件实例详解
2013/11/06 Javascript
escape函数解决js中ajax传递中文出现乱码问题
2014/10/30 Javascript
web前端开发JQuery常用实例代码片段(50个)
2015/08/28 Javascript
详解js跨域原理以及2种解决方案
2015/12/09 Javascript
详谈JS中实现种子随机数及作用
2016/07/19 Javascript
微信JS-SDK自定义分享功能实例详解【分享给朋友/分享到朋友圈】
2016/11/25 Javascript
vue router仿天猫底部导航栏功能
2017/10/18 Javascript
如何使用VuePress搭建一个类型element ui文档
2019/02/14 Javascript
详解微信小程序开发用户授权登陆
2019/04/24 Javascript
vue项目中mock.js的使用及基本用法
2019/05/22 Javascript
vue从一个页面跳转到另一个页面并携带参数的解决方法
2019/08/12 Javascript
uni-app微信小程序登录授权的实现
2020/05/22 Javascript
Python重新引入被覆盖的自带function
2014/07/16 Python
Django中URLconf和include()的协同工作方法
2015/07/20 Python
Python对list列表结构中的值进行去重的方法总结
2016/05/07 Python
Python检测生僻字的实现方法
2016/10/23 Python
python 删除大文件中的某一行(最有效率的方法)
2017/08/19 Python
用TensorFlow实现戴明回归算法的示例
2018/05/02 Python
python自动发微信监控报警
2019/09/06 Python
将python依赖包打包成window下可执行文件bat方式
2019/12/26 Python
Python3实现飞机大战游戏
2020/04/24 Python
如何基于Python Matplotlib实现网格动画
2020/07/20 Python
python,Java,JavaScript实现indexOf
2020/09/09 Python
Python文件名匹配与文件复制的实现
2020/12/11 Python
Pytorch自定义Dataset和DataLoader去除不存在和空数据的操作
2021/03/03 Python
路易威登和香奈儿手袋:LuxeDH
2017/01/12 全球购物
美国牙科折扣计划:DentalPlans.com
2019/08/26 全球购物
总经理助理岗位职责范本
2014/07/20 职场文书
2015年学校教科室工作总结
2015/07/20 职场文书
高一作文之乐趣
2019/11/21 职场文书
Apache POI的基本使用详解
2021/11/07 Servers