Selenium switch_to 处理多Web页签窗口与封装

news2024/12/22 15:50:14

目录

前言

脚本案例

未做页签切换处理的

做了页签切换处理的脚本

面签切换封装

1、按面签位置切换封装

2、按页签标题切换封装

3、两个封装的调用


前言

在做自动化测试时,经常会遇到一个链接,它会重新打开一个Web签,如下图的样式

如:进入csdn首页,点击--C站免费「学+练」产品

当它有两个页签或者多个页签时,webdriver是不知道自动切换到当前操作页签的,如果我们不告诉它切换,它还是会继续在原有的页签去操作他的元素,这时自动化执行便会抛出异常。元素找不到了。此时自动化测试也就卡住了。

为啥找不到,因为webdriver没有切换操作页签。它默认一直是在操作第一顺位页签,我们需要使用脚本将期切换到当前操作页签来。

那应该如何切换呢?仔细的研究下面三行

webdriver.window_handles     #获取当时控制的浏览有多少个页签的句柄,返回list

for handle in webdriver.window_handles     #遍历出每一个句柄

webdriver.switch_to.window(handle)      #通过确认的句柄,切换到对应的操作页签(窗口)

可以通过页签(窗口)的顺序位置或者页签的标题来确认当前操作页签,最后会告诉大家如何封装传入数字或者窗口标题便可切换页签的封装函数

现在先看两个小案例

脚本案例

案例里自动化操作步骤是

1、打开浏览器

2、进入csdn首页

3、点击-- C站免费「学+练」产品

4、点击-- 1.4 运行方式

我们使用Python脚本来实现这几个操作步骤的自动化    

未做页签切换处理的

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2022/12/27 22:31
# @Author  : 魂尾
# @File    : demo.py.py
# @Description : 未做web页签处理的脚本

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 初始化浏览器
dr = webdriver.Chrome()
dr.maximize_window()
dr.get(url='https://www.csdn.net')
time.sleep(3)
dr.find_elements(by=By.XPATH, value='//*[@id="www-home-right"]/div[1]/div[1]/div[2]/div/span')[0].click()

time.sleep(3)
dr.find_elements(by=By.LINK_TEXT, value='1.4 运行方式')[0].click()

运行结果:1.4 运行方式   点击失败,报错

上面的自动化脚本运行起来,完不成目标任务,不是一个健壮的脚本。让我们来看看下一个脚本。

做了页签切换处理的脚本

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2022/12/27 22:31
# @Author  : 魂尾
# @File    : demo.py
# @Description : 添加页签处理的脚本

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 初始化浏览器
dr = webdriver.Chrome()
dr.maximize_window()
dr.get(url='https://www.csdn.net')
time.sleep(3)
dr.find_elements(by=By.XPATH, value='//*[@id="www-home-right"]/div[1]/div[1]/div[2]/div/span')[0].click()

#-----------------------------------------------------
count = 2     #第二个页签为操作页签,用来做判断
handles = dr.window_handles     #获取当前所有页签句柄
index = 0             #用例标记句柄的位置
for handle in handles:
    index += 1
    if index == count:   #判断句柄是不是在当前操作位置了
        dr.switch_to.window(handle)     #切换当前操作页签
# -----------------------------------------------------

time.sleep(3)
dr.find_elements(by=By.LINK_TEXT, value='1.4 运行方式')[0].click()

运行正常如下:1.4 运行方式 点击正常

做了页签处理的脚本正常运行,这时便不会因为脚本问题卡住自动化测试了

面签切换封装

1、按面签位置切换封装

传入webdriver对象,页签位置

如何知道要传入哪个位置,见下图自行理解

 封装代码如下:

def Change_CurrentOpr_Page_By_index(dr:webdriver, count=1):
    '''
    切换当前操作页,按照位置
    :param dr:webdriver对象
    :param count: 顺序位置,数字
    :return:
    '''
    handles = dr.window_handles     #获取当前所有页签句柄
    index = 0             #用例标记句柄的位置
    for handle in handles:
        index += 1
        if index == count:   #判断句柄是不是在当前操作位置了
            dr.switch_to.window(handle)     #切换当前操作页签
            return

    print('没找到对应位置的页签')

使用时只需要调用

Change_CurrentOpr_Page_By_index(dr, 2)

第二个页签,传入2,第三个页签传入3

2、按页签标题切换封装

传入webdriver对象页签标题

标题如何理解,下图框出来便是标题。

def Changet_CurrentOpr_page_By_Title(dr:webdriver, title):
    '''
    切换当前操作页,按照面签名称
    :param dr:webdriver对象
    :param tilte: 页签标题名称
    :return:
    '''
    handles = dr.window_handles  # 获取当前所有页签句柄
    for handle in handles:
        dr.switch_to.window(handle)  # 切换当前操作页签
        if title == dr.title:
            return

    print('没找到对应标题页签')

3、两个封装的调用

# 初始化浏览器
dr = webdriver.Chrome()
dr.maximize_window()
dr.get(url='https://www.csdn.net')
time.sleep(3)
dr.find_elements(by=By.XPATH, value='//*[@id="www-home-right"]/div[1]/div[1]/div[2]/div/span')[0].click()

# Change_CurrentOpr_Page_By_index(dr, 2)            #按位置调用
Changet_CurrentOpr_page_By_Title(dr, 'Python入门技能树')    #按名称调用

time.sleep(3)
dr.find_elements(by=By.LINK_TEXT, value='1.4 运行方式')[0].click()

本文到此结束

希望点赞,收藏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/127041.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Tif地形数据下载CTB切片nginx发布及cesium调用

访问这个网站:https://urs.earthdata.nasa.gov/ 需要注册 选择数据类型如下 点击Search,可以看到很多搜索结果 点击下载一项tif 下载成功后,需要切片的话,可以选择两种方式 1CesiumLab3,如下图 可以选择多个tif,输出类型选择散…

LeetCode118.杨辉三角 | LeetCode119.杨辉三角Ⅱ

LeetCode刷题记录 文章目录📜杨辉三角Ⅰ⌨C代码📜杨辉三角Ⅱ⌨C代码📜杨辉三角Ⅰ 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例1 输入: n…

Linux进程间通信

1.进程间通信介绍 1.1进程间通信目的 数据传输:一个进程需要将它的数据发送给另一个进程。资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某…

深度学习入门(六十六)循环神经网络——束搜索

深度学习入门(六十六)循环神经网络——束搜索)前言循环神经网络——束搜索课件贪心搜索穷举搜索束搜索总结教材1 贪心搜索2 穷举搜索3 束搜索4 小结前言 核心内容来自博客链接1博客连接2希望大家多多支持作者 本文记录用,防止遗忘…

MySQL批量导入数据时,为何表空间膨胀了N倍

GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。作者:叶金荣文章来源:GreatSQL社区原创 问题缘起 同事在客户现场利用DTS工具,从A实例将数据…

I2C(IIC)的仲裁、时钟同步和时钟扩展

I2C(IIC)的仲裁、时钟同步和时钟扩展 注意,CSDN以及博客园上有大量抄袭和以讹传讹的情况,注意鉴别。 本文参考了Philip的I2C specification以及wiki pedia,并且通过实践验证。 阅读本文要求你已经对i2c的协议有基本的…

调剂的事情该什么时间想?

小部分硕士考生已经开始关心调剂的事情了,其实这个事情还早,但对于考试成绩不是很理想又想要今年顺利读书的考生,调剂有可能会成为实现其目标的一条途径。针对这个问题小立老师针对MBA/MPA/MEM管理类硕士为大家做个前期的梳理,以平…

立足信创国产化运维,打造安全可控IT运维管理系统

随着国产化信创应用试点行业的不断扩大,应用信创产品的企事业单位逐渐增多。大多数企业均面临着陌生的国产化环境与产品,其使用习惯和解决问题的方式都面临改变。北京智和信通切实立足用户需求,提供信创运维服务。 通过“监、管、控、析、安…

监控 DolphinDB 进程对服务器资源的使用情况

本方案主要用于监控 DolphinDB 进程对服务器资源的使用情况及 DolphinDB 性能,如 DolphinDB 进程 CPU 占用情况、DolphinDB 进程内存占用情况、DolphinDB 进程磁盘资源使用情况等。DolphinDB 内置了相应的运维函数以获取当前节点的资源使用情况,Promethe…

OpenHarmony#深入浅出学习eTs#(五)eTs语言初识

本项目Gitee仓地址:深入浅出eTs学习: 带大家深入浅出学习eTs (gitee.com) 一、eTs介绍 概述 基于TS扩展的声明式开发范式的方舟开发框架是一套开发极简、高性能、跨设备应用的UI开发框架,支持开发者高效的构建跨设备应用UI界面。 基础能力 使用基于…

实战:一个脚本实现统计linux进程相关的信息

文章目录公司任务脚本思路脚本源码及写作过程执行测试又遇到问题问题解决总结公司任务 王同学刚刚入职,就被安排了一项任务,据说还比较紧急。 公司一共有200多台服务器,要求王同学统计一下每台服务器的IP,以及各个进程的数量。 …

Spring Boot[概述、功能、快速入门]

系列文章目录 从今天开始,将会发关于SpringBoot的内容,持续更新基础篇、高级篇(查看源码部分)。今天是第一天,我们来了解SpringBoot和快速创建SpringBoot项目。 该系列文章会持续更新~ 目录 系列文章目录 前言 一…

在国内用Windows给BT做种,真是一山绕过一山缠(附解决方案)

国内的网盘,动不动就乱删东西,实在是狗的不像样子,于是我有了玩一下BT(俗称 比特洪流,种子)的想法。 BT技术的玩法是,我有一份资源,制作一个种子,然后分享这个种子&#…

【1.2】认识微服务--微服务技术对比SpringCloud

认识微服务--微服务技术对比&SpringCloud微服务结构微服务技术对比DubboSpringCloudSpringCloudAlibaba企业需求SpringCloud知识内容来自于黑马程序员视频教学和百度百科。博主仅作笔记整理便于回顾学习。如有侵权请私信我。 微服务结构 微服务这种方案需要技术框架来落地…

如何用电脑录制视频?图文教学,快速学会

​与图片相比,视频可以更生动地表达信息。除了记录一些应用程序的内容外,有时我们还需要记录电脑桌面和录制视频。如何用电脑录制视频?本篇文章,将会以图文讲解的方式,教你如何用电脑录制视频。 电脑录制视频1&#xf…

第001课 - 项目介绍

文章目录 项目背景项目技术和特色项目前置要求分布式基础篇,就是快速开发一个电商的后台管理系统。 后端使用的技术栈,就是springboot+springcloud+mybatis+docker作为后端的基础环境。 结合前端的vue和elementui。 使用逆向工程的方式,快速帮助我们开发出来一个后台管理…

想入行软件测试不知道往哪个职业发展方向

现在关于软件测试领域的群体就有4种情况:‘低管理,低技术’ ‘低管理,高技术’ ‘高管理,低技术’ ‘高管理,高技术’ 好多人对自己测试的职业发展很迷茫,个人觉得这篇文章不错,转给大家分享下&…

数据可视化④:大学生就业可视化呈现

大学生就业是和我们息息相关的话题,每一位大学生都关注着,我们常常在网络上看到有关大学生就业的话题,比如毕业季的一些讨论。在大一的创新创业课中,我们也了解到自己所学的专业和以后如何就业,往哪方面就业。但我们了…

高校课程知识库系统|基于Springboot+vue实现高校课程知识库在线学校平台

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

前端常见问题汇总(九)

一、let ,const, var 有什么区别 用let声明变量,它的用法类似var,但是let所声明的变量,只在所在的代码块内有效 {let a 10 var b 1}console.log(a) //: a is not definedconsole.log(b) //1let const 不存在变量提升,规范代码&#xff08…