selenium自动化测试-等待和窗口切换详解

news2024/9/20 18:42:24

目录

等待

强制等待

隐式等待

显式等待

窗口切换

标签页切换

iframe切换

alert弹窗切换


等待

在打开网页后,可能页面中某些元素在加载中,导致定位元素时找不到对应元素,然后报错出现异常,因此我们需要打开网页后,设置等待时间

一共有三种等待方式:强制等待、隐式等待、显式等待

强制等待

使用方法:

import time
#强制等待
time.sleep(delay-time)

delay-time的单位为,delay设置多少秒页面就会等待多少秒。(死等,不会有任何动作)

使用举例:

打开百度,然后过3秒,再定位搜索框输入python并点击搜索,该过程我上一章清晰的介绍了,如果看不懂可以去我上一章查看

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

driver = webdriver.Edge()

#强制等待
time.sleep(3)

input = driver.find_element(By.ID,"kw")
input.send_keys("python")
input.send_keys(Keys.ENTER)

#此处是为了防止计时结束后,还没看到搜索结果就结束了
time.sleep(3)

driver.close()

一般不建议使用此方法,会严重影响程序运行时间 

隐式等待

使用方法:

implicitly_wait(delay-time)

delay-time的单位为秒

隐式等待会设置一个超时时间,在超时时间段内,必须网页的全部元素加载完成才能继续执行下一步,否则会一直等待,直至超时才会执行下一步

这样做的一个弊端就是,有个别元素加载的非常慢,而大部分以及我们想操作的元素已经加载好了,但我们依然需要等待,直至超时,即计时结束

这里我们同样也是想要打开百度,然后搜索selenium,选择所有h3标签下class=‘’t”下的所有为a标签的元素

# coding = utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Edge()
# 打开百度首页
driver.get(r'https://www.baidu.com/')
#使用css选择器和id都可以,#代表选择具有id属性的元素
driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("selenium")
driver.find_element(By.ID,"su").click()
# 隐式等待15秒
driver.implicitly_wait(15)
result = driver.find_elements(By.CSS_SELECTOR,"h3.t>a")
for i in result:
    print(i.text)
# 退出
driver.quit()

然后这样在加载好后就获取到了我们想要的结果

显式等待

上面说了隐式等待的弊端,是必须等待网页中全部元素加载完毕才可以进行下一步。那显式等待就是为了解决这个问题。

显示等待又称作条件等待,只要在设置的超时时间段内,我想要的元素加载好了,那就直接进行下一步,而不用等待其他元素全部加载完了。如果过了超时时间,则会抛出异常TimeoutException

这是代码原型

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

主要有4个参数:

driver:浏览器驱动

timeout:等待时间

poll_frequency:检测的间隔时间,默认0.5s

ignored_exceptions:超时后的异常信息,默认抛出NoSuchElementException

用法示例:

我们打开百度搜索selenium,然后查找class=“tt”的,其实没有c这个属性的,因此5秒之后。会超时结束,然后报错

# coding = utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Edge()
# 打开百度首页
driver.get(r'https://www.baidu.com/')
driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("selenium")
driver.find_element(By.CSS_SELECTOR,"#su").click()
# 超时时间为5秒,每0.2秒检查1次,直到class="tt"的元素出现
text = WebDriverWait(driver,5,0.2).until(lambda x:x.find_element(By.CSS_SELECTOR,".tt")).text

# 退出
driver.quit()

可以发现报了一个超时错误 

窗口切换

标签页切换

当我们打开一个网页后,点击一个链接,可能会进入一个新的页面,但是此时我们依然想返回到原来的界面该怎么做呢?

这里使用到了

switch_to.window()这个函数

这个函数可以切换到指定标签页(窗口)

我们可以先记录下当前窗口curWindow,然后点击链接,进入新的窗口后,我们再switch_to.window到刚保存的curWindow即可

注意:当打开并进入新页面时,你的句柄仍然在上一个页面!

比如我在页面1 新打开并进入了页面2,此时我的页面是2,但是我的句柄依然在页面1,因此current_window_handle得到的是1的句柄

所以此时我们直接switch_to.window()就可以返回刚才的界面,即1

下面以打开qq网举例:

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Edge()

driver.get("http://qq.com")

driver.maximize_window()
driver.find_element(By.XPATH,"//li/a[contains(text(),'要闻')]").click()
#获取当前句柄(首页),虽然进入了要闻界面,但句柄依然在刚才的首页!!
curWindow = driver.current_window_handle
#转到刚才的句柄,此时会在首页
driver.switch_to.window(curWindow)

time.sleep(3)

driver.close()

还有另一种方法:

获取全部的窗口句柄,然后保存当前窗口的句柄,然后循环遍历这些窗口句柄,直到与保存的相等,我们在switch_to.window到这个窗口

举个例子:

我们打开腾讯网首页,然后点击左上角的要闻,此时我们会进入新的窗口。我们保存下当前窗口句柄(首页),然后我们再获得全部的窗口,再循环遍历,直到找到与其相等的

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Edge()

driver.get("http://qq.com")

driver.maximize_window()
driver.find_element(By.XPATH,"//li/a[contains(text(),'要闻')]").click()

#得到当前窗口句柄
curWindow = driver.current_window_handle
#得到所有的窗口句柄
windows = driver.window_handles
for iWindow in windows:
    if iWindow == curWindow:
        driver.switch_to.window(iWindow)

iframe切换

iframe窗口是在一个html界面中又嵌套了一个html界面,我们如果要对嵌套的这个iframe中的元素进行操作,那么就必须要先切换这个iframe窗口才可以进行操作。

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time


driver = webdriver.Edge()

driver.get("https://connect.qq.com/")
driver.maximize_window()
# 等待元素可见
login_btn_loc = (By.XPATH, '//div[@class="no-login"]/a')
WebDriverWait(driver, 30).until(EC.presence_of_element_located(login_btn_loc))
# 点击登录按钮
driver.find_element(*login_btn_loc).click()

# 等待frame加载到dom树中
frame_loc = (By.XPATH, '//*[@id="login_frame"]')
WebDriverWait(driver, 30).until(EC.presence_of_element_located(frame_loc))

# 切换到frame上,切换到frame上时,可以以三种形式传入参数:name属性,下标,webelement对象
# 切换到frame,传入 webelement对象
driver.switch_to.frame(driver.find_element(By.XPATH,'//*[@id="login_frame"]'))

driver.find_element(By.XPATH,"//div[@id='bottom_web']/a[text()='注册账号']").click()

time.sleep(2)
driver.close()

alert弹窗切换

有时候浏览器可能会弹出一些提示,如果我们不处理,便无法进行下一步。alert窗口就是js提示框,它不属于web界面

它对于alert弹窗有4种处理方式

driver.switch_to.alert.accept()  # 确定操作
driver.switch_to.alert.dismiss()    # 取消操作
driver.switch_to.alert.send_keys("")    # alert弹框输入文本
driver.switch_to.alert.text()      # 获取alert的文本内容

因为没有可以演示的网站,大家可以自己在桌面创建一个.txt文本文件,复制以下html代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Alert 弹窗示例</title>
</head>
<body>

<button onclick="showAlert()">显示 Alert 弹窗</button>

<script>
function showAlert() {
    alert("你好啊");
}
</script>

</body>
</html>

然后可以使用刚才的函数,比如我想点击确定,便可以这样写:

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time


driver = webdriver.Edge()
#这个路径为你电脑上刚才创建的文件的路径
driver.get("C:/Users/h/Desktop/aa.html")

driver.find_element(By.XPATH,"//button").click()

#确定
driver.switch_to.alert.accept()


time.sleep(3)

同样,如果我们怕alert弹窗不能及时加载出来,我们可以设置条件等待,条件是直到alert弹出显示

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time


driver = webdriver.Edge()
driver.get("C:/Users/h/Desktop/aa.html")

driver.find_element(By.XPATH,"//button").click()

# driver.switch_to.alert.accept()
WebDriverWait(driver,10,1).until(EC.alert_is_present()).accept()

time.sleep(3)

这样便完成了alert弹窗的处理

本文到这里就结束了,主要讲了对selenium的等待和弹窗的处理,如果有不明白,欢迎留言或私信哦~

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

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

相关文章

Go网络编程-RPC程序设计

gRPC 通信 RPC 介绍 RPC, Remote Procedure Call&#xff0c;远程过程调用。与 HTTP 一致&#xff0c;也是应用层协议。该协议的目标是实现&#xff1a;调用远程过程&#xff08;方法、函数&#xff09;就如调用本地方法一致。 如图所示&#xff1a; 说明&#xff1a; Servi…

将iPad 作为Windows电脑副屏的几种方法(二)

将iPad 作为Windows电脑副屏的几种方法&#xff08;二&#xff09; 1. 前言2. EV 扩展屏2.1 概述2.2 下载、安装、连接教程2.3 遇到的问题和解决方法2.3.1 平板连接不上电脑 3. Twomon SE3.1 概述3.2 下载安装教程 4. 多屏中心&#xff08;GlideX&#xff09;4.1 概述4.2 下载安…

均值滤波算法及实现

均值滤波器的使用场景&#xff1a; 均值滤波器使用于处理一些如上述蓝色线的高斯噪声场景 红色曲线是经过均值滤波处理后的数据。主要因为均值滤波设置数据缓冲区&#xff08;也即延时周期&#xff09;&#xff0c;使得测量值经过缓冲不会出现特别大的变化。 黄色曲线为高斯噪声…

[003-02-10].第10节:Docker环境下搭建Redis主从复制架构

我的博客大纲 我的后端学习大纲 我的Redis学习大纲 1.cluster&#xff08;集群&#xff09;模式-docker版 哈希槽分区进行亿级数据存储 1.1.面试题&#xff1a;1~2亿条数据需要缓存&#xff0c;请问如何设计这个存储案例 1.回答&#xff1a;单机单台100%不可能&#xff0c;肯…

第十届能源材料与电力工程国际学术会议(ICEMEE 2024)

第十届能源材料与电力工程国际学术会议&#xff08;ICEMEE 2024) 2024 10th International Conference on Energy Materials and Electrical Engineering 重要信息 ICEMEE 2024已通过SPIE - The International Society for Optical Engineering (ISSN: 0277-786X)单独出版…

beego框架_golang web框架_使用介绍

beego简介 beego是一个用于快速开发Go应用的http框架&#xff0c;由Go语言方面的技术大牛设计。beego可以用来快速开发API、Web、后端服务等各种应用&#xff0c;是一个RESTful的框架&#xff0c;主要设计灵感来源于tornado、sinatra、flask这三个框架&#xff0c;但结合了Go本…

Postfix+Dovecot+Roundcube开源邮件系统搭建系列5:Roundcube安装配置(含Nginx+PHP部署配置)

1. PHP安装配置 参考wordpress 6.5.2版本安装记录 中关于PHP安装方法&#xff0c;此处不再详述。 修改php-fpm的启动用户和组为vmail&#xff0c;这一步是和nginx配置相呼应。配置文件/etc/opt/remi/php83/php-fpm.d/www.conf 下面几个配置&#xff1a; user vmail group vm…

Typora 1.5.8 版本安装下载教程 (轻量级 Markdown 编辑器),图文步骤详解,免费领取

文章目录 软件介绍软件下载安装步骤激活步骤 软件介绍 Typora是一款基于Markdown语法的轻量级文本编辑器&#xff0c;它的主要目标是为用户提供一个简洁、高效的写作环境。以下是Typora的一些主要特点和功能&#xff1a; 实时预览&#xff1a;Typora支持实时预览功能&#xff0…

CrossKD: Cross-Head Knowledge Distillation for Dense Object Detection

CrossKD&#xff1a;用于密集目标检测的交叉头知识蒸馏 论文链接&#xff1a;https://arxiv.org/abs/2306.11369v2 项目链接&#xff1a;https://github.com/jbwang1997/CrossKD Abstract 知识蒸馏(Knowledge Distillation, KD)是一种有效的学习紧凑目标检测器的模型压缩技术…

微服务:nacos

Nacos 由Alibaba推出的集成于SpringCloudAlibaba中的一款开源注册中心框架 主要功能: 注册中心 配置管理 nacos的安装和部署 nacos默认访问端口8848 docker pull nacos/nacos-server:1.2.0 docker run --env MODEstandalone --name nacos --restartalways -d -p 8848:8…

模型训练中出现loss为NaN怎么办?

文章目录 一、模型训练中出现loss为NaN原因1. 学习率过高2. 梯度消失或爆炸3. 数据不平衡或异常4. 模型不稳定5. 过拟合 二、 针对梯度消失或爆炸的解决方案1. 使用torch.autograd.detect_anomaly()2. 使用 torchviz 可视化计算图3. 检查梯度的数值范围4. 调整梯度剪裁 三、更具…

鸿蒙语言基础类库:【@system.request (上传下载)】

上传下载 说明&#xff1a; 从API Version 6开始&#xff0c;该接口不再维护&#xff0c;推荐使用新接口[ohos.request]。本模块首批接口从API version 4开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import request from system.re…

C语言之指针的奥秘(三)

一、字符指针变量 在指针的类型中&#xff0c;有字符指针char*&#xff0c;一般使用&#xff1a; #include<stdio.h> int main() {char ch w;char* p &ch;*p w;return 0; } 还有一种方式&#xff1a; #include<stdio.h> int main() {const char* p &qu…

Android 10.0 Launcher3拖拽图标进入hotseat自适应布局功能实现一

1.前言 在10.0的系统rom定制化开发中&#xff0c;在对于launcher3的一些开发定制中&#xff0c;在对hotseat的一些开发中&#xff0c;需要实现动态hotseat居中 的功能&#xff0c;就是在拖拽图标进入和拖出hotseat&#xff0c;都可以保持hotseat居中的功能&#xff0c;接下来分…

html2canvas + jspdf 纯前端HTML导出PDF的实现与问题

前言 这几天接到一个需求&#xff0c;富文本编辑器的内容不仅要展示出来&#xff0c;还要实现展示的内容导出pdf文件。一开始导出pdf的功能是由后端来做的&#xff0c;然后发现对于宽度太大的图片&#xff0c;导出的pdf文件里部分图片内容被遮盖了&#xff0c;但在前端是正常显…

S参数入门

一、说明 S参数全称为散射参数&#xff0c;主要用来作为描述线性无源互联结构的一种行为模型&#xff0c;来源于网络分析方法。网络分析法是一种频域方法&#xff0c;在一组离散的频率点上&#xff0c;通过在输入和输出端口得到的参量完全描述线性时不变系统&#xff08;定义参…

园区AR导航系统构建详解:从三维地图构建到AR融合导航的实现

随着现代园区规模的不断扩大与功能的日益复杂&#xff0c;传统的二维地图导航已难以满足访客高效、精准定位的需求。园区内部错综复杂的布局、频繁变更的商户位置常常让访客感到迷茫&#xff0c;造成寻路上的时间浪费。园区AR导航系统以创新的技术手段&#xff0c;破解了私域地…

对redis进行深入学习

目录 1. 什么是redis&#xff1f;1.1 为什么使用redis作为缓存&#xff1f;1.1.0 数据库&#xff08;MySQL&#xff09;与 redis1. 存储介质不同&#xff08;408选手应该都懂hh&#xff09;2. 数据结构优化3. I/O模型差异4. CPU缓存友好性5. 单线程与多线程差异6. 持久化与缓存…

Volatility:分析MS10-061攻击

1、概述 # 1&#xff09;什么是 Volatility Volatility是开源的Windows&#xff0c;Linux&#xff0c;MaC&#xff0c;Android的内存取证分析工具。基于Python开发而成&#xff0c;可以分析内存中的各种数据。Volatility支持对32位或64位Wnidows、Linux、Mac、Android操作系统…

2024算力基础设施安全架构设计与思考(免费下载)

算网安全体系是将数据中心集群、算力枢纽、一体化大数据中心三个层级的安全需求进行工程化解耦&#xff0c;从国家安全角度统筹设计&#xff0c;通过安全 服务化方式&#xff0c;依托威胁情报和指挥协同通道将三层四级安全体系串联贯通&#xff0c;达成一体化大数据安全目标。 …