selenium中三种等待方式:sleep,implicitly_wait,WebDriverWait

article/2025/9/6 2:12:17

三种等待方式:sleep

  • 强制等待, sleep,设置等待多长时间,就要等待多长时间。等待完成后,才会继续下一步:
from selenium import webdriver
# 导入sleep
from time import sleep# 创建谷歌浏览器对象
chrome_driver = webdriver.Chrome()
# 访问百度
chrome_driver.get("http://www.baidu.com")
# 定位登录按钮并进行点击
chrome_driver.find_element_by_xpath('//*[@id="s-top-loginbtn"]').click()
# 设置等待时间,单位是秒
sleep(3)

在这里插入图片描述

  • 相比较于sleep的强制等待,selenium中还有种等待,可以称之为智能等待:implicitly_wait。所谓智能等待,就是在我设置的等待时间范围内,只要满足了我的条件,就会立即结束等待,继续往下进行,如果超时,则抛出异常。
    implicitly_wait也称之为隐性等待,不需要导入,直接使用webdriver对象调用。它主要执行两件事情,等待元素找到,执行命令。还以刚才的代码为例子,如果我们创建了webdriver对象之后,直接设置implicitly_wait等待,等待一旦设置,那么这个等会在浏览器对象的整个生命周期起作用:
# 创建谷歌浏览器对象
chrome_driver = webdriver.Chrome()
# 智能等待,在设置时间范围内,只要条件成立,马上结束等待, implicitly_wait
chrome_driver.implicitly_wait(5)
# 访问百度
chrome_driver.get("http://www.baidu.com")
# 定位登录按钮并进行点击,在5s之内,找到元素,会立即点击
chrome_driver.find_element_by_xpath('//*[@id="s-top-loginbtn"]').click()# 设置一个找不到的元素,会进行等待,等待5s后,依旧找不带,会抛出异常
chrome_driver.find_element_by_xpath('//*[@id="s-top-loginbtn1"]').click()

效果:
在这里插入图片描述

  • 最后一种等待,显性等待。相较于隐性等待,这个显性等待要明确等待条件和等待上限。比如隐性等待,只要元素存在,可找到就可以,但显性等待,我要明确条件是我的元素可见。而元素存在,并不一定是元素可见。
    显性等待的场景:操作引起了页面的变化,而接下来要操作变化的元素的时候,就需要使用显性等待。
    显性等待导入:
from selenium.webdriver.support.wait import WebDriverWait

WebDriverWait在创建对象时,需要传入三个参数:

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

driver:浏览器驱动
timeout:等待上限,单位是秒
poll_frequency:检测的轮询间隔,默认值是0.5秒
ignored_exceptions:超时后的抛出的异常信息,默认抛出NoSuchElementExeception异常。

创建WebDriverWait()对象后,要结合until()或者until_not()和expected_conditions类使用。
比如,等待元素id="TANGRAM__PSP_11__changeSmsCodeItem"加载到dom树中:

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By# 使用显性等待, 等待元素id="TANGRAM__PSP_11__changeSmsCodeItem"加载到dom树中,等待上限是10s,每0.8秒去验证一下条件是否成立.
WebDriverWait(chrome_driver, 10, 0.8).until(EC.presence_of_element_located((By.ID,'TANGRAM__PSP_11__changeSmsCodeItem')))

还是以百度首页登录界面为例子,比如点击登录后,在登录界面点击短信登录进行切换:
在这里插入图片描述
当我们不点击登录时,发现在dom树中,根本没有短信登录的元素,所以,我们要想点击这个元素,那就需要等待这个元素加载到dom树中,可以找到才行:
在这里插入图片描述

用显性等待,代码:

from selenium import webdriver
from time import sleep
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By# 创建谷歌浏览器对象, 会话开始
chrome_driver = webdriver.Chrome()# 访问百度
chrome_driver.get("http://www.baidu.com")
# 定位登录按钮并进行点击
chrome_driver.find_element_by_xpath('//*[@id="s-top-loginbtn"]').click()sleep(5)
# 使用显性等待, 等待元素id="TANGRAM__PSP_11__changeSmsCodeItem"加载到dom树中,等待上限是10s,每0.8秒去验证一下条件是否成立.
WebDriverWait(chrome_driver, 10, 0.8).until(EC.presence_of_element_located((By.ID,'TANGRAM__PSP_11__changeSmsCodeItem')))chrome_driver.find_element_by_id('TANGRAM__PSP_11__changeSmsCodeItem').click()

效果:
在这里插入图片描述
下面继续基于这一行代码解释:

WebDriverWait(chrome_driver, 10, 0.8).until(EC.presence_of_element_located((By.ID,'TANGRAM__PSP_11__changeSmsCodeItem')))

By.ID,By是webdriver定义好的一个类,这个类只有8个常量,定义了八种元素定位的方式,一般当我们要传入一个元素定位时,会使用到,比如上面的presence_of_element_located的方法,要传入的参数要求是一个定位:
在这里插入图片描述
presence_of_element_located是等待元素加载到dom树中的方法,属于expected_conditions类。expected_conditions还有提供了很多的条件判断方法:

方法说明
title_is判断当前页面的 title 是否完全等于(==)预期字符串,返回布尔值
title_contains判断当前页面的 title 是否包含预期字符串,返回布尔值
presence_of_element_located判断元素是否被加到了 dom 树里(注意,加载到dom树中,并不代表这个元素可见)
visibility_of_element_located判断元素是否可见
visibility_of同visibility_of_element_located方法,只是visibility_of_element_located方法参数为locator,这个方法参数是 定位后的元素
presence_of_all_elements_located判断是否至少有 1 个元素存在于 dom 树中。举例:如果页面上有 n 个元素的 class 都是’wp’,那么只要有 1 个元素存在,这个方法就返回 True
text_to_be_present_in_element判断某个元素中的 text 是否 包含 了预期的字符串
text_to_be_present_in_element_value判断某个元素中的 value 属性是否包含 了预期的字符串
frame_to_be_available_and_switch_to_it判断该 frame 是否可以 switch进去,如果可以的话,返回 True 并且 switch 进去,否则返回 False
invisibility_of_element_located判断某个元素中是否不存在于dom树或不可见
element_to_be_clickable判断某个元素中是否可见并且可点击
staleness_of等某个元素从 dom 树中移除,注意,这个方法也是返回 True或 False
element_to_be_selected判断某个元素是否被选中了,一般用在下拉列表
element_selection_state_to_be判断某个元素的选中状态是否符合预期
element_located_selection_state_to_be跟上面的方法作用一样,只是上面的方法传入定位到的 element,而这个方法传入 locator
alert_is_present判断页面上是否存在 alert

http://chatgpt.dhexx.cn/article/TjmOvq0s.shtml

相关文章

function declared implicitly

标题keil中出现 warning: #223-D: function “xx” declared implicitly 如图1 原因是没有包含xx函数所在的头文件,这虽然只是个警告,而且程序也能成功运行,但是无法点进去看这个函数(如图2)。count_gezi&#xff08…

【转】-【Python】- 【selenium】 -selenium中的三种等待方式(显示等待WebDriverWait()、隐式等待implicitly()、强制等待sleep())

—— 学习Python自动化测试的菜鸡,现在是selenium库webdriver的学习时间 【问题】 在获取页面元素的文本的时候,总是获取不到,或者显示为空; 【分析】 页面加载不完全; 【解决措施】 等待页面加载完成&#xff1…

ajax之文件上传

表单上传文件 传统的文件上传是通过form表单,俗话说不关注实际问题的解决方法都是假把式,那么我就模拟一个用户注册的功能。 观察如下代码: [HttpPost] public ActionResult Upload(string username, string password, string realName, st…

SpringMVC Ajax上传文件实例

做了一个文件上传模块,因为传统的form提交会有页面刷新,不符合我的使用要求,所以我采用Ajax提交方式,这里说明下,我的应用程序前端为Ajax提交,后端SpringMVC接收处理。 传统form提交文件方式: …

使用ajax上传文件

需求 页面上需要异步上传文件 ajax简单介绍 常用的有.get()&#xff0c; .post()&#xff0c; .load()等等&#xff0c;其中.ajax()是通用方法&#xff0c;前者均可以通过此方法实现。具体可查看https://www.runoob.com/jquery/jquery-ref-ajax.html 上传前端代码 <!DO…

文件上传ajax

因为文章内容和文章标题&#xff0c;文章图片不方便在同一个form中&#xff0c;所以这里通过ajax传输数据 文件上传 html&#xff0c;这里使用的bootstrap <div class"modal fade" id"myModal" tabindex"-1" role"dialog" aria-la…

ajax以及文件上传的几种方式

AJAX准备知识&#xff1a;JSON 什么是 JSON &#xff1f; JSON 指的是 JavaScript 对象表示法&#xff08;JavaScript Object Notation&#xff09;JSON 是轻量级的文本数据交换格式JSON 独立于语言 *JSON 具有自我描述性&#xff0c;更易理解 * JSON 使用 JavaScript 语法来描…

ajax怎么上传文件?注意事项

ajax&#xff0c;即异步处理&#xff0c;相信程序员朋友们都会感觉到亲切吧&#xff0c;因为ajax在软件开发过程中实在是太常用了&#xff0c;还是有不少刚刚入门想学习软件开发的朋友可能不是很熟悉如何使用ajax&#xff0c;今天就一起来看看吧&#xff0c;怎样使用ajax上传文…

上传文件—ajax

目录 一、上传图片文件 1.写基本html 完成页面主框架 2.script部分 2-0 主框架 上传文件按钮被点击触发事件 2-1验证使得否选择文件 2-2 介绍 FormData 2-3 监听onreadystatechange事件 小结 二、实现上传文件进度条 1. 在bootstrap找进度条组件 2.script 完成进度条算法…

使用AJAX实现上传文件

前端代码 <form id"uploadForm" method"post" enctype"multipart/form-data"><label >上传电子书</label><input type"file" name"file" ><button id"upload" type"butto…

计算多边形面积

对于规则多边形&#xff0c;矩形、梯形、平行四边形、三角形&#xff08;根据三边长度&#xff0c;利用公式计算&#xff09;&#xff0c;可以通过公式计算其面积&#xff0c;而对于一般意义的多边形&#xff08;单一多边形、不包含“洞”&#xff09;&#xff0c;怎么计算面积…

C# 多边形面积计算公式

最近在做地图相关面积计算显示工作&#xff0c;百度了很多关于多边形面积计算方面公式和代码&#xff0c;只能说贼费劲&#xff0c;最终完成了把结果展示下 原理&#xff1a;鞋带公式 定义&#xff1a;所述鞋带式或鞋带算法&#xff08;也称为高斯的面积公式和测量员的式&#…

【计算多边形面积】

题目 Input 输入数据包含多个测试实例&#xff0c;每个测试实例占一行&#xff0c;每行的开始是一个整数n(3<n<100)&#xff0c;它表示多边形的边数&#xff08;当然也是顶点数&#xff09;&#xff0c;然后是按照逆时针顺序给出的n个顶点的坐标&#xff08;x1, y1, x2,…

hdu 2036(多边形面积公式)

改革春风吹满地 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 33251 Accepted Submission(s): 17118 Problem Descripti 话说部分学生心态极好&#xff0c;每天就知道游戏&#xff0c;这次考试如此简单的题目…

鞋带公式——多边形面积求和

个人博客&#xff1a;The Blog Of WaiterXiaoYY 欢迎来互相交流学习。 啥是鞋带公式&#xff08;shoelace&#xff09; Shoelace公式&#xff0c;也叫高斯面积公式&#xff0c;是一种数学算法&#xff0c;可求确定区域的一个简单多边形的面积。 该多边形是由它们顶点描述笛卡…

皮克定理和任意多边形的面积公式

1. 叉乘&#xff1a; 若 &#xff1a; &#xff0c;&#xff0c;则&#xff1a; 而&#xff1a; 则&#xff1a; 为三角形面积&#xff0c;建议百度叉乘的几何意义 2. 皮克公式&#xff1a; 即&#xff1a;多边形面积 S 多边形内整数点的个数 n 多边形边上整数点的个数…

计算任意多边形的面积(已知各顶点的坐标)

https://blog.csdn.net/Adusts/article/details/80546770 如何计算一个多边形的面积&#xff0c;首先想到的是划分成多个小的三角形&#xff0c;因为三角形我们比较熟悉&#xff0c;而且三角形计算面积的方法也很多 三角形: 1. 半周长 P(abc)/2 2. 面积 SaHa/2absin(C)/2sqrt(…

python中的scapy模块

文章目录 模块简介基本用法Scapy的基本操作Scapy模块中的函数Scapy模块的常用简单实例编写端口扫描器 模块简介 Scapy是一个由Python编写的强大工具&#xff0c;目前很多优秀的网络扫描攻击工具都使用了这个模块。也可以在自己的程序中使用这个模块来实现对网络数据包的发送、…

Scapy使用文档中文版

0x00 前言 scapy是一个强大的交互式(interactive)的包操作程序&#xff0c;用python写的&#xff0c;有一个python的命令行解释器界面&#xff0c;可直接运行&#xff0c;当然也可以作为第三库&#xff0c;导入到我们的python程序中去使用它的类和方法。 关于scapy作者的一个简…