当前位置: 首页 > news >正文

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()

相关文章:

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

1、多标签/多窗口之间的切换 场景: 在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要切换到新打开的窗口上进行操作。这种情况下,需要识别多标签或窗口的情况。 操作方法: switch_to.window()方法:切换…...

物联网AI MicroPython传感器学习 之 RTC时钟模块

学物联网,来万物简单IoT物联网!! 一、产品简介 DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态RAM,实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数…...

Mac安装nginx(Homebrew)

查看需要安装 nginx 的信息 brew info nginxDocroot 默认为 /usr/local/var/www 在 /opt/homebrew/etc/nginx/nginx.conf 配置文件中默认端口被配置为8080,从而使 nginx 运行时不需要加 sudo nginx将在 /opt/homebrew//etc/nginx/servers/ 目录中加载所有文件 …...

租用服务器后需要注意什么呢

租用服务器后需要注意什么呢 1、从IDC服务商中接收到服务器时,需要对服务器的各项性能进行测试确认,并做好记录以便对服务器的性能做到心中有数。 2、在服务器租用交接时,要了解服务器的安全设置情况,对服务器安全技术方面不了解…...

pip 时报错 no such option: --bulid-dir 的解决办法

Pycharm 安装第三方库报错及解决方案——no such option: --build-dir Pycharm 安装第三方库报错及解决方案——no such option: --build-dir 最近在学习路径规划相关内容,在运行GitHub上下载例程时缺少“plotly”库,根据网上查到的安装步骤操作&#x…...

[Spring] SpringBoot2 简介(一)—— 基础配置

目录 一、SpringBoot 简介 1、Spring 的缺点 2、SpringBoot 功能 二、SpringBoot 入门案例 1、实现步骤 2、访问服务器 3、入门小结 4、Idea 快速构建 SpringBoot 工程 5、起步依赖无需版本号 6、主启动类的在项目中的位置(*重要*) 三、Sprin…...

【软考】计算机指令系统寻址的几种方式及其速度的比较

速度比较:立即>寄存器>直接> 间接 1. 立即寻址: 直接在指令中给出操作数 2. 寄存器寻址(Register Addressing): 寄存器寻址是指操作数直接存储在寄存器中。指令中的地址字段指定要使用的寄存器编号&#…...

golang笔记17--编译调试go源码

golang笔记17--编译调试go源码 前置条件编译源码在 fmt 包中加自定义函数说明 当前go语言越来越流行了,各大厂商都有加大go工程师的需求,作为go语言的学习者,我们除了要了解如何使用go语言外,也有必要了解一下如何编译、调试go源码…...

DailyPractice.2023.10.22

文章目录 1.[39. 组合总和]2.[22. 括号生成]3.[79. 单词搜索]4.[131. 分割回文串] 1.[39. 组合总和] 39. 组合总和 class Solution { public: vector<vector<int>> res; vector<int> path;void dfs(vector<int>& candidates,int target,int star…...

Go学习第四章——程序流程控制

Go学习第四章——程序流程控制 1 分支结构1.1 单分支1.2 双分支1.3 多分支1.4 switch分支 2 循环结构2.1 for循环2.2 while和dowhile的实现2.3 经典案例——打印金字塔2.4 经典案例——打印九九乘法表 3 跳转控制语句3.1 break3.2 continue3.3 goto3.4 return 流程控制的作用&a…...

自然语言处理---Transformer机制详解之Decoder详解

1 Decoder端的输入解析 1.1 Decoder端的架构 Transformer原始论文中的Decoder模块是由N6个相同的Decoder Block堆叠而成&#xff0c;其中每一个Block是由3个子模块构成&#xff0c;分别是多头self-attention模块&#xff0c;Encoder-Decoder attention模块&#xff0c;前馈全…...

【读书笔记】《软技能》

句子摘抄&#xff1a; 软技能-代码之外的生存指南 “自强不息 孜孜不倦” 强调了坚持不懈、不断奋斗和追求进步的精神。无论遇到多少困难和挫折&#xff0c;都要坚持努力&#xff0c;不断提高自己&#xff0c;不知疲倦地追求目标。这句谚语鼓励人们积极进取&#xff0c;不轻言…...

视频怎么压缩?视频过大这样压缩变小

在日常生活中&#xff0c;我们常常会遇到需要压缩视频的情况&#xff0c;视频压缩不仅可以减小文件大小&#xff0c;方便存储和传输&#xff0c;还可以在保证质量的同时&#xff0c;满足不同的使用需求。那么&#xff0c;如何有效地压缩视频呢&#xff1f; 方法一&#xff1a;嗨…...

蓝桥杯中级题目之组合(c++)

系列文章目录 数位递增数_睡觉觉觉得的博客-CSDN博客拉线开关。_睡觉觉觉得的博客-CSDN博客蓝桥杯中级题目之数字组合&#xff08;c&#xff09;_睡觉觉觉得的博客-CSDN博客 文章目录 系列文章目录前言一、个人名片二、描述三、输入输出以及代码示例1.输入2.输出3.代码示例 总…...

julia 笔记:复合类型 struct

1 struct关键字 1.1 声明 struct关键字与复合类型一起引入&#xff0c;后跟一个字段名称的块&#xff0c;可选择使用 :: 运算符注释类型 struct Foobarbaz::Intqux::Float64end 没有类型注释的字段默认为 Any 类型&#xff0c;所以可以包含任何类型的值。 1.2 创建新对象 …...

【JavaEE初阶】 线程池详解与实现

文章目录 &#x1f334;线程池的概念&#x1f384;标准库中的线程池&#x1f340;ThreadPoolExecutor 类&#x1f6a9;corePoolSize与maximumPoolSize&#x1f6a9;keepAliveTime&#x1f6a9;ThreadFactory&#x1f6a9;workQueue&#x1f6a9;RejectedExecutionHandler handl…...

web:[极客大挑战 2019]HardSQL

题目 打开页面显示为 查看源代码没有发现其他的提示信息&#xff0c;随便尝试一下 错误 题目名为hardsql&#xff0c;先来尝试有无sql注入存在 尝试输入单引号输入 显示页面存在注入 这里按照常规思路继续使用order by函数和union select函数进行查询&#xff0c;但是页面没有…...

Android apkanalyzer简介

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、用法3.1 使用 Android Studio3.1.1…...

PJSIP 2.7.2对G.729的支持,编译bcg729步骤

PJSIP 2.7.2对G.729的支持&#xff0c;编译bcg729步骤 下载BCG729源码升级cmake编译BCG729编译pjsip2.7.2 pjsua测试 下载BCG729源码 git clone git://git.linphone.org/bcg729.git升级cmake 注&#xff1a;编译BCG729要求cmake版本大于3.0&#xff0c;如果版本已经达到要求&…...

(二)Python类型总结

Python 是一种面向对象的语言。这意味着在 Python 中&#xff0c;一切都是对象&#xff0c;包括变量、函数和模块。Python 支持类和对象的概念&#xff0c;通过定义类来创建对象&#xff0c;并使用对象的方法和属性来操作数据。 Python 与 Java 和 C 在数据类型方面有一些相似…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...