selenium多窗口、多iframe切换、alert、3种等待

1、多标签/多窗口之间的切换

场景:

在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要切换到新打开的窗口上进行操作。这种情况下,需要识别多标签或窗口的情况。
操作方法:

switch_to.window()方法:切换窗口。可以实现在不同的窗口之间切换。current_window_handle:获得当前窗口句柄。
window_handles: 获取所有窗口句柄。

提示:句柄就可以理解成浏览器窗口的id值。

操作说明:

获取所有窗口的句柄
handles = driver.window_handlers
调用该方法会得到一个列表,在selenium运行过程中的每一个窗口,都有一个对应的值存放在里面。
(换句话说,有多少个窗口,就有多少个句柄)
通过窗口的句柄进入的窗口
driver.switch_to_window(handles[n]) 

练习

"""
1.学习目标:必须掌握web中多窗口切换方法
2.语法(操作步骤)2.1 获取当前窗口句柄driver.current_window_handle2.2 点击页面中的超链接触发多窗口2.3 获取所有窗口句柄driver.window_handles2.4 进入新窗口switch_to.window(handles[1])2.5 操作新窗口中的元素按实际工作需求编写2.6 退出新窗口switch_to.window(handles[0])3.需求在页面中,实现多窗口切换。
"""
# 1.导入selenium
from selenium import webdriver
import time
from selenium.webdriver.common.by import By# 2.打开浏览器
driver = webdriver.Chrome()#3.打开百度一下页面
driver.get("https://www.baidu.com/")
time.sleep(2)## 4. 多窗口切换操作
# 4.1 获取当前窗口句柄
handle = driver.current_window_handle
print('点击之前的窗口句柄是:', handle)
print('点击前的url:', driver.current_url)# 4.2 点击页面中的百度热搜 超链接触发多窗口
driver.find_element(By.XPATH,'//a[text()="新闻"]').click()
time.sleep(3)# 4.2 获取所有窗口句柄
handles = driver.window_handles# 4.3 进入新窗口
driver.switch_to.window(handles[-1])
print('点击之后浏览器所有的窗口句柄是:', handles)
print('点击后的url:', driver.current_url)# 4.5 退出新窗口
# 你需要退到哪个窗口就写哪个窗口的handle索引
# 因为handle在上边赋值等于第一个窗口了,这里就可以写handle
# 也可以写handles[0]
driver.switch_to.window(handle)
time.sleep(10)# 5.关闭浏览器
driver.quit()
"""
点击之前的窗口句柄是: 2CC28D229393F6E1A07AA345F0E2D98D
点击前的url: https://www.baidu.com/
点击之后浏览器所有的窗口句柄是: ['2CC28D229393F6E1A07AA345F0E2D98D', '6A8E0C9DD6E357F82727264A8A28C281']
点击后的url: https://news.baidu.com/
"""

2、iframe切换

场景

页面会进行一层一层的嵌套,只有切换到嵌套的iframe页面,才可以定位到iframe页面里的标签属性

# 1、通过name属性进行定位,前提是iframe有name属性
driver.switch_to.frame("login_frame")# 2、通过iframe索引去切换,注意iframe层级关系
driver.switch_to.frame(1)# 3、通过元素去定位,先找到要定位的iframe元素,然后再作为参数传入
iframe = driver.find_element("xpath","//iframe[@id='login_frame']")
driver.switch_to.frame(iframe)# 扩展:
# 关于进入iframe页面怎么退回到主页面
driver.switch_to.default_content()
# 关于进入iframe页面怎么退回到父级的iframe
driver.switch_to.parent_frame()

练习

访问QQ邮箱为例:使用账号密码登录
在这里插入图片描述

"""
举例:已QQ邮箱为例
实现功能:使用账号密码登录QQ邮箱
步骤:定位到密码登录的iframe中(嵌套了2层),并在该iframe中找到”密码登录“元素并点击,然后到账号密码页面进行输入"""import time
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.get("https://mail.qq.com/")#隐性等待
driver.implicitly_wait(10)# 1、通过name属性进行定位,前提是iframe有name属性
# driver.switch_to.frame("login_frame")# 2、通过iframe索引去切换,注意iframe层级关系
# driver.switch_to.frame(1)# 3、通过元素去定位,先找到要定位的iframe元素,然后再作为参数传入【常用】
iframe = driver.find_element(By.XPATH, "//iframe[@class='QQMailSdkTool_login_loginBox_qq_iframe']")
driver.switch_to.frame(iframe)iframe2 = driver.find_element(By.XPATH, "//iframe[@id='ptlogin_iframe']")
driver.switch_to.frame(iframe2)
# 点击账号密码登录
driver.find_element(By.XPATH, "//a[text()='密码登录']").click()# 输入账号
driver.find_element(By.ID, "u").send_keys("username")# 输入密码
driver.find_element(By.ID, "p").send_keys("password")# 点击登录
driver.find_element(By.XPATH, "//input[@id='login_button']").click()# 强制等待5s
time.sleep(5)# 退出浏览器
driver.quit()

3、切换alert

accept():确定
dismiss():取消
send_keys():输入
在这里插入图片描述

import time
from time import sleepfrom selenium import webdriver
from selenium.webdriver.common.by import By"""
1、某一操作导致alert(或prompt、confirm)弹窗出现
2、切换到弹窗中,driver.switch_to.alert 返回的是一个类的实例化对象,例如用alert接收它
"""
driver = webdriver.Chrome()
driver.get("https://www.w3school.com.cn/tiy/t.asp?f=eg_js_alert")
iframe = driver.find_element(By.XPATH,'//iframe[@id="iframeResult"]')
driver.switch_to.frame(iframe)
time.sleep(5)
# 触发弹窗的操作
driver.find_element(By.XPATH, '//button[text()="试一试"]').click()
time.sleep(1)
# 切换到alert
alert = driver.switch_to.alert
# 关闭弹窗
alert.accept()
time.sleep(7)
driver.quit()

4、XPATH轴定位

ancestor: 祖先
parent: 父节点
following-sibling -同级的弟弟元素
preceding-sibling - 同级的哥哥元素
关系:要找的元素是已知元素的XXX关系
用法: //…已知元素/轴定位名称::标签名[@xx=xx]
①定位到课程人数
在这里插入图片描述

//p[text()=‘课程人数’]/preceding-sibling::p

在这里插入图片描述

//span[text()=“柠檬班导师ice”]/ancestor::tr//span[text()=“私信”]
或者
//span[text0=“柠檬班导师ice”]/ancestor:td/following-sibling:td//span[text0=“私信”

5、三种等待方式

①强制等待
强制等待是使线程休眠一定时间。强制等待一般在隐式等待和显式等待都不起作用时使用。示例代码如下:

time.sleep(3)

②隐式等待
隐式等待的作用是全局的,是作用于整个 session 的生命周期,也就是说只要设置一次隐式等待,后面就不需要设置。如果再次设置隐式等待,那么后一次的会覆盖前一次的效果。

当在 DOM 结构中查找元素,且元素处于不能立即交互的状态时,将会触发隐式等待。

driver.implicitly_wait(30)

③显式等待
显式等待是在代码中定义等待条件,触发该条件后再执行后续代码,就能够根据判断条件进行等待。程序每隔一段时间进行条件判断,如果条件成立,则执行下一步,否则继续等待,直到超过设置的最长时间。核心用法如下:

# 导入显示等待
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions
...
# 设置10秒的最大等待时间,等待 (By.TAG_NAME, "title") 这个元素点击
WebDriverWait(driver, 10).until(expected_conditions.element_to_be_clickable((By.TAG_NAME, "title"))
)
...

一个案例

#导入依赖
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWaitclass TestHogwarts():
def setup(self):self.driver = webdriver.Chrome()self.driver.get('https://ceshiren.com/')
#加入隐式等待self.driver.implicitly_wait(5)def teardown(self):
#强制等待time.sleep(10)self.driver.quit()def test_hogwarts(self):
#元素定位,这里的category_name是一个元组。category_name = (By.LINK_TEXT, "开源项目")
# 加入显式等待WebDriverWait(self.driver, 10).until(expected_conditions.element_to_be_clickable(category_name))
# 点击开源项目self.driver.find_element(*category_name).click()

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

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

相关文章

c 语言基础:L1-045 宇宙无敌大招呼

据说所有程序员学习的第一个程序都是在屏幕上输出一句“Hello World”,跟这个世界打个招呼。作为天梯赛中的程序员,你写的程序得高级一点,要能跟任意指定的星球打招呼。 输入格式: 输入在第一行给出一个星球的名字S,是…

【Eclipse】解决插件下载速度太慢

解决方案:修改镜像 下面列出几个国内的镜像网站: 中国科学技术大学(5.6MB/s) http://mirrors.ustc.edu.cn/eclipse/ 北京理工大学(600KB/s) http://mirror.bit.edu.cn/eclipse/ 大连东软信息学院(400KB/s) http://mirrors.neuso…

Dolphinscheduler的API接口问题

在使用java 调用dolphinscheduler的API接口时要注意的事项: 1:官方文档中写的是使用ui界面创建token,然后将token设置在header中,但是如果没有这个token怎么办?因为在一个陌生的环境中,一般没人会记这个to…

基于YOLOv8的多目标检测与自动标注软件【python源码+PyqtUI界面+exe文件】【深度学习】

基本功能演示 摘要:YOLOv8是YOLO系列最新的版本,支持多种视觉任务。本文基于YOLOv8的基础模型实现了80种类别的目标检测,可以对图片进行批量自动标注,并将检测结果保存为YOLO格式便于后续进行其他任务训练。本文给出完整的Python实…

八股文学习四(kafka)

一. 消息中间件kafka (1)基本概念 (2) 生产者 生产者将消息发送到topic中去,同时负责选择将message发送到topic的哪一个partition中。通过round-robin做简单的负载均衡。也可以根据消息中的某一个关键字来进行区分。通常第二种方式使用的更多。 (3)消费者 消费模…

【初识Linux】:常见指令(2)

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux的基础知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数…

OceanBase自动安装部署演示环境demo

OceanBase自动安装部署 前提条件 官方给出硬件条件需要满足以下要求 本文操作系统为:Red Hat Enterprise Linux 8 64 位 下载链接:https://pan.baidu.com/s/1rZ39xJFhk0HdmC4wEJcxvg 提取码:c01x 下载并安装 all-in-one 安装包 执行如下…

防蓝光护眼灯有用吗?教你认识防蓝光护眼台灯

要不是亲眼所见,真的很难想象一个台灯用处如此大,护眼效果非常明显。说起来很久没有用过护眼灯具了,这次用过之后有着明显的反差,如果能给孩子用,那将大大保障了孩子的用眼、护眼问题。我自己是用来睡前看书的&#xf…

大数据 DataX 详细安装教程

目录 一、环境准备 二、安装部署 2.1 二进制安装 2.2 python 3 支持 三、Data X 初体验 3.1 配置示例 3.1.1. 生成配置模板 3.1.2 创建配置文件 3.1.3 运行 DataX 3.1.4 结果显示 3.2 动态传参 3.2.1. 动态传参的介绍 3.2.2. 动态传参的案例 3.3 迸发设置 …

RK3288 Android11 RTL8723DS WiFi 和 蓝牙Bluetooth 适配

目录 一、RTL8723DS WiFi 适配 --- 篇章1、原理图分析(WiFi部分)补充:RTL8723DS时钟输入源讲解 2、根据原理图修改设备树和编辑驱动文件3、实验验证4、RTL8723DS WIFI驱动参考文档和博客网站 二、RTL8723DS 蓝牙Bluetooth 适配 --- 篇章1、原理图分析&am…

温湿度监测技术又进化了,这个操作太牛了!

无论是在家庭、医疗、农业、制造业,还是在物流和食品行业,精确的温湿度监控对于确保安全、质量和效率都至关重要。 客户案例 医疗行业 在医疗行业,温湿度监控对于存储药品、生物样本和医疗设备至关重要。山东某医院引入了泛地缘科技推出的温湿…

杂记-使用crypto-js的AES进行加密/解密

安装 npm i crypto-js -D使用 import CryptoJS from "crypto-js";const aseKey CryptoJS.enc.Utf8.parse("XX123456"); const IV CryptoJS.enc.Utf8.parse(XX123456);// 加密 export function encryption(value) {let key CryptoJS.enc.Utf8.parse(as…

React组件渲染和更新的过程

一、回顾Vue组件渲染和更新的过程 二、回顾JSX本质和vdom 三、组件渲染和更新 1、组件渲染过程 props state (组件有了props state)render()生成vnodepatch(elem, vnode) 2、组件更新过程 setState(newState) --> dirtyComponents (可能有子组件)render()生成newVnodepa…

探索音频传输系统:数字声音的无限可能 | 百能云芯

音频传输系统是一项关键的技术,已经在数字时代的各个领域中广泛应用,从音乐流媒体到电话通信,再到多媒体制作。本文将深入探讨音频传输系统的定义、工作原理以及在现代生活中的各种应用,以帮助您更好地了解这一重要技术。 音频传输…

Java代码生成二维码

在 Java 中,我们可以使用第三方库 zxing(Zebra Crossing)来生成二维码。zxing 是一个开源的、功能丰富的条形码和二维码处理库,支持多种编程语言。 以下是一个示例代码,展示如何使用 zxing 库在 Web 应用中生成二维码…

为什么推荐使用SSL付费证书?

虽然免费的SSL证书提供了一种获取加密连接的途径,但它们与付费证书相比存在一些局限性和不足之处。免费的SSL证书在某些情况下可能不建议使用,主要有以下几个原因: 1. 可能信任度较低:免费SSL证书通常由非权威的证书颁发机构&…

论文精讲目录

ViT论文逐段精读【论文精读】MoCo 论文逐段精读【论文精读】对比学习论文综述【论文精读】Swin Transformer论文精读【论文精读】CLIP 论文逐段精读【论文精读】双流网络论文逐段精读【论文精读】I3D 论文精读【论文精读】视频理解论文串讲(上)【论文精读…

Linux ARMv8 异常向量表

http://blog.chinaunix.net/uid-69947851-id-5830546.html 本章接着《Linux内核启动》部分讲解,我们知道了在进入start_kernel之前,通过指令adr_l x8, vectors;msr vbar_el1, x8设置了异常向量表,那么异常向量表的结构是怎么样…

Flutter视图原理之三棵树的建立过程

目录 三棵树的关系树的构建过程1.updateChild函数(element的复用)2.inflateWidget函数3.mount函数3.1 componentElement的实现3.2 RenderObjectElement的实现3.2.1 attachRenderObject函数 4.performRebuild函数 总结三棵树创建流程 三棵树的关系 Flutt…

简单的elementui倒计时按钮事件

html部分 <el-button :disabled"disableButton" style"width:35%; float: right;" click"startCountdown"><span>{{ buttonText }}</span></el-button> 初始化: disableButton: false,buttonText: 获取验证码,countdow…