写在前面

感觉到很惭愧呀,因为居然在Selenium+Java系列中没有写过多窗口处理及句柄切换的文章,不过也无妨,不管什么语言,其思路是一样的,下面我们来演示,使用python语言来实现窗口句柄的切换。

什么是窗口句柄

可能有的同学会问了,到底啥是窗口,什么又是多窗口,句柄到底是啥玩楞?

那么,他到底长啥样?如下图所示:

怎么处理多窗口句柄

如何获取窗口句柄

语法:

driver.current_window_handle

1、模拟场景

打开搜狗首页,输入淘宝进入久曲健 博客园,并输出页面标题

2、使用具柄判断切换

就是通过窗口句柄判断切换,示例代码入下:

for window_handle in window_handles:
if window_handle != old_Window:
driver.switch_to.window(window_handle)
print(driver.title)
else:
driver.close()

3、使用URL判断切换

就是根据跳转的当前URL切换,示例代码如下:

for window_handle in window_handles:
driver.switch_to.window(window_handle)
newUrl = driver.current_url
if 'cnblogs' in newUrl:
print(driver.title)
else:
driver.close()

4、通过下标切换

window_handles = driver.window_handles返回的是一个集合,所以自然用下标去切换,简单点说就是,只要找到想要切换的窗口下标即可实现切换,多个窗口不建议使用此方法。

示例代码如下:

driver.close()
driver.switch_to.window(window_handles[1])
print(driver.title)

5、关闭新窗口句柄,切回原来主页

笔者反复试验发现,用句柄删除不好用,还是这个url靠谱,示例代码如下:

for window_handle in window_handles:
driver.switch_to.window(window_handle)
newUrl = driver.current_url
if 'cnblogs' in newUrl:
driver.close()
else:
print(driver.title)

所有汇总代码如下:

# -*- coding: utf-8 -*-
"""
@Time : 2022/10/26 14:12
@Auth : 软件测试君
@File :switch_window.py
@IDE :PyCharm
@Motto:ABC(Always Be Coding)
多窗口处理之句柄切换 """
import time from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service '''
初始化操作
'''
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) def init():
# 最大化操作
driver.maximize_window()
driver.set_script_timeout(60)
# 智能等待找到元素后立即继续执行,全局生效
driver.implicitly_wait(60)
driver.set_page_load_timeout(60) init() driver.get("https://www.sogou.com/")
driver.find_element(By.ID, "query").clear()
driver.find_element(By.ID, "query").send_keys("久曲健 博客园")
driver.find_element(By.ID, "stb").click()
time.sleep(2)
# 获取当前页面窗口句柄(每个句柄的表示都是唯一的)
old_Window = driver.current_window_handle
print('当前窗口句柄为:{0}'.format(old_Window))
driver.find_element(By.LINK_TEXT, "久曲健 - 博客园").click()
time.sleep(2)
window_handles = driver.window_handles
print(window_handles)
'''
### 方法一:
for window_handle in window_handles:
if window_handle != old_Window:
driver.switch_to.window(window_handle)
print(driver.title)
else:
driver.close() '''
'''
### 方法二:
driver.close()
driver.switch_to.window(window_handles[1])
print(driver.title) '''
'''
### 方法三:
for window_handle in window_handles:
driver.switch_to.window(window_handle)
newUrl = driver.current_url
if 'cnblogs' in newUrl:
print(driver.title)
else:
driver.close()
''' # 关闭新窗口句柄,切回原来主页
for window_handle in window_handles:
driver.switch_to.window(window_handle)
newUrl = driver.current_url
if 'cnblogs' in newUrl:
driver.close()
else:
print(driver.title) driver.quit()

写在最后

最近心情还是很不好,恐慌的不是单身可怕,而是年纪越来越大,也不知道现在的女孩都在想什么,好想结婚呀!

感兴趣的同学,请自己去尝试,关于Selenium4.0+Python3系列教程,未完待续····

Selenium4+Python3系列(五) - 多窗口处理之句柄切换的更多相关文章

  1. Selenium4+Python3系列(六) - Selenium的三种等待,强制等待、隐式等待、显式等待

    为什么要设置元素等待 直白点说,怕报错,哈哈哈! 肯定有人会说,这也有点太直白了吧. 用一句通俗易懂的话就是:等待元素已被加载完全之后,再去定位该元素,就不会出现定位失败的报错了. 如何避免元素未加载 ...

  2. VSTO之旅系列(五):创建Outlook解决方案

    原文:VSTO之旅系列(五):创建Outlook解决方案 本专题概要 引言 Outlook对象模型 自定义Outlook窗体 小结 一.引言 在上一个专题中,为大家简单介绍了下如何创建Word解决方案 ...

  3. [时序图笔记] 步步为营UML建模系列五、时序图(Squence diagram)【转】

    概述 顺序图是一种详细表示对象之间以及对象与参与者实例之间交互的图,它由一组协作的对象(或参与者实例)以及它们之间可发送的消息组成,它强调消息之间的顺序. 顺序图是一种详细表示对象之间以及对象与系统外 ...

  4. CSS 魔法系列:纯 CSS 绘制各种图形《系列五》

    我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多比人想象不到的效果.特别是随着 CSS3 的广泛使用,更多新奇的 CSS 作品涌现出来. ...

  5. Netty4.x中文教程系列(五)编解码器Codec

    Netty4.x中文教程系列(五)编解码器Codec 上一篇文章详细解释了ChannelHandler的相关构架设计,版本和设计逻辑变更等等. 这篇文章主要在于讲述Handler里面的Codec,也就 ...

  6. WCF编程系列(五)元数据

    WCF编程系列(五)元数据   示例一中我们使用了scvutil命令自动生成了服务的客户端代理类: svcutil http://localhost:8000/?wsdl /o:FirstServic ...

  7. 【Xamarin挖墙脚系列:多窗口之间的导航】

    原文:[Xamarin挖墙脚系列:多窗口之间的导航] 在Android中:Intent对象,通知松散耦合的Activity等组件 在IOS中:Segue对象连接视图 <button opaque ...

  8. JVM系列五:JVM监测&工具

    JVM系列五:JVM监测&工具[整理中]  http://www.cnblogs.com/redcreen/archive/2011/05/09/2040977.html 前几篇篇文章介绍了介 ...

  9. SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型

    原文:SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测 ...

随机推荐

  1. Mysql 实现数据库读写分离

    Amoeba+Mysql实现数据库读写分离 一.Amoeba 是什么 Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发.座落与Client.DB Server(s)之间.对客户端透明. ...

  2. 【ARK UI】HarmonyOS ETS 资源管理基本使用

    ​代码实现 api讲解 getStringArray getStringArray(resId: number, callback: AsyncCallback<Array>): void ...

  3. JavaScript基础回顾知识点记录6-操作元素样式和事件对象(介绍基本使用)

    js 中 操作元素样式 通过js修改元素内联样式(设置和读取的都是内联样式) 获取当前元素显示的样式 <html> <head> <meta charset=" ...

  4. 46th ECfinal 游记

    Day0 坐高铁坐了七小时从北戴河到西安,但第一次线下赛,来的路上还是很激动的 路上看到华山,下次来西安一定去爬 刚下高铁站遇到了一个不知道干啥的xjj xjj:可以占用您一点时间吗?谢谢了. 我:不 ...

  5. 这三大特性,让 G1 取代了 CMS!

    大家好,我是树哥. 之前我们聊过 CMS 回收器,但那时候我们说 CMS 回收器已经落伍了,现在应该是用 G1 回收器的时候了.那么 G1 回收器到底有什么魔力,它比 CMS 回收器相比强在哪里呢?今 ...

  6. VM虚拟机安装

    VM虚拟机安装 1.安装vm虚拟机软件 1.1 双击打开虚拟机文件 1.2 根据向导安装 下一步 安装好了 不要着急点完成在 安装目录中有许可证. 1.3激活操作 2.虚拟机原理简介 3. 新建虚拟机 ...

  7. K8S_总结

    K8S 核心组件 配置存储中心 --> etcd服务 主控(master)节点 ​ [1] kube-apiserver 服务 apiserver:(K8S 大脑) 1. 提供了集群管理的 RE ...

  8. LyScript 内存扫描与查壳实现

    LyScript 中提供了多种内存特征扫描函数,每一种扫描函数用法各不相同,在使用扫描函数时应首先搞清楚他们之间的差异,如下将分别详细介绍每一种内存扫描函数是如何灵活运用的,最后将实现一个简易版内存查 ...

  9. 跟羽夏学 Ghidra ——工具

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...

  10. JS数据结构之 Map

    JS数据结构之 Map Map介绍 Map(映射)是ES6引入的一种数据结构.这是一种存储键值对列表很方便的方法,类似于其他编程语言的哈希表. HashMap(哈希表),也叫做散列表.是根据关键码值 ...