python里三种等待元素出现的方法

本文详细介绍了Selenium自动化测试中使用的三种等待策略:强制等待、隐性等待和显性等待。其中重点阐述了显性等待的使用方法及其实现原理,并通过多个实例展示了如何运用WebDriverWait配合expected_conditions来判断元素的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做web或app的自动化测试经过会出现找不到元素而报错的情况,很多时候是因为元素

 

还没有被加载出来,查找的代码就已经被执行了,自然就找不到元素了。那么我可以用等待

 

元素加载完成后再执行查找元素的code。

 

Python里有三种等待的方式:

一、强制等待

Sleep(54)

这个方法在time模块,使用时通过from time import sleep导入

比如:

Sleep(10) #表示强行等待10s再执行下一句代码

Driver.find_element_by_xpath(“xxxxxx”)

这种等待方式时间到了就执行下个语句,但比较死板,不能保证在等待的时间内元素真正被加载了出来。

二、隐性等待

Implicitly_wait(xxx)

这个等待表示在规定的时间内页面的所有元素都加载完了就执行下一步,否则一直等到时间截止,然后再继续下一步。

Driver=webdriver.Chrome()

Driver.implicitly_wait(10)#等待10s

Driver.get(“XXX”)

这个方法的缺点是你需要的元素已经加载出来了,但页面还没有加载完,再需要继续等待页面加载完才能执行下一步操作。

看看第三种方法,比较灵活

三、显性等待

 

WebDriverWait,配合该类的until()和until_not()方法,表示程序每隔x秒去判断一下指

定的元素是否加载完,加载完了就执行下一步,否则继续每隔x秒去判断,指定时间截

止。如果超时就会抛出异常。

 

from selenium import webdriver 

from selenium.webdriver.support.wait importWebDriverWait 

from selenium.webdriver.support importexpected_conditions as EC 

from selenium.webdriver.common.by import By

 

locator=(By.XPATH,”xxxxxxx”)

d = webdriver.Chorme()

d.get(“http://www.sina.com”)

WebDriverWait(d,10,1).unitl(EC.presence_of_element_located(locator))

Print(“XXX”)

这里表示等待10s,每隔1s去检查一次元素是否出现,出现了就执行下一步,直到10s

结束后还没有出现就会抛出异常。

实例讲解:(用了yuuwee的博客内容: https://www.cnblogs.com/yuuwee/p/6635652.html

 

WebDriverWait(driver,10).until(EC.title_is(u"百度一下,你就知道"))
'''判断title,返回布尔值'''

WebDriverWait(driver,10).until(EC.title_contains(u"百度一下"))
'''判断title,返回布尔值'''

WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'kw')))
'''判断某个元素是否被加到了dom树里,并不代表该元素一定可见,如果定位到就
返回WebElement'''

WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.ID,'su')))
'''判断某个元素是否被添加到了dom里并且可见,可见代表元素可显示且宽和高都大
0'''

WebDriverWait(driver,10).until(EC.visibility_of(driver.find_element(by=By.ID,value='kw')))
'''判断元素是否可见,如果可见就返回这个元素'''

WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,
'.mnav')))
'''判断是否至少有1个元素存在于dom树中,如果定位到就返回列表'''

WebDriverWait(driver,10).until(EC.visibility_of_any_elements_located((By.CSS_SELECTOR
,'.mnav')))
'''判断是否至少有一个元素在页面中可见,如果定位到就返回列表'''

WebDriverWait(driver,10).until(EC.text_to_be_present_in_element((By.XPATH,"//*[@id='
u1']/a[8]"),u'设置'))
'''判断指定的元素中是否包含了预期的字符串,返回布尔值'''

WebDriverWait(driver,10).until(EC.text_to_be_present_in_element_value((By.CSS_SELECT
OR,'#su'),u'百度一下'))
'''判断指定元素的属性值中是否包含了预期的字符串,返回布尔值'''

#WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it(locator))
'''判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否
则返回False'''
#注意这里并没有一个frame可以切换进去

WebDriverWait(driver,10).until(EC.invisibility_of_element_located((By.CSS_SELECTOR,'#s
wfEveryCookieWrap')))
'''判断某个元素在是否存在于dom或不可见,如果可见返回False,不可见返回这个元素'''
#注意#swfEveryCookieWrap在此页面中是一个隐藏的元素

WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='u1']/a[
8]"))).click()
'''判断某个元素中是否可见并且是enable的,代表可点击'''
driver.find_element_by_xpath("//*[@id='wrapper']/div[6]/a[1]").click()
#WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='wrap
per']/div[6]/a[1]"))).click()

#WebDriverWait(driver,10).until(EC.staleness_of(driver.find_element(By.ID,'su')))
'''等待某个元素从dom树中移除'''
#这里没有找到合适的例子

WebDriverWait(driver,10).until(EC.element_to_be_selected(driver.find_element(By.XPAT
H,"//*[@id='nr']/option[1]")))
'''判断某个元素是否被选中了,一般用在下拉列表'''

WebDriverWait(driver,10).until(EC.element_selection_state_to_be(driver.find_element(By.
XPATH,"//*[@id='nr']/option[1]"),True))
'''判断某个元素的选中状态是否符合预期'''

WebDriverWait(driver,10).until(EC.element_located_selection_state_to_be((By.XPATH,"//
*[@id='nr']/option[1]"),True))
'''判断某个元素的选中状态是否符合预期'''
driver.find_element_by_xpath(".//*[@id='gxszButton']/a[1]").click()

instance = WebDriverWait(driver,10).until(EC.alert_is_present())
'''判断页面上是否存在alert,如果有就切换到alert并返回alert的内容'''
print instance.text
instance.accept()

driver.close()

<think>好的,用户想了解Python Selenium中的元素等待方法,特别是显性等待隐性等待。我需要根据提供的引用资料来组织回答。 首先,回忆一下隐性等待(Implicit Wait)。根据引用[1],隐性等待会让WebDriver等待一定时间再去查找元素,这个时间是全局设置的,适用于整个会话。需要说明它的用法和特点,比如driver.implicitly_wait(10),并且提到它只影响元素查找,不会影响其他操作。同时,引用[3]提到隐性等待和显性等待同时存在时,最长等待时间取两者中的较大者,这点很重要,需要强调。 然后是显性等待(Explicit Wait)。引用[1]和[2]提到显性等待使用WebDriverWait和expected_conditions,需要导入相应的模块。要给出代码示例,比如WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'someId')))。还要说明显性等待的优势,比如可以自定义等待条件和轮询间隔,更灵活。引用[4]提到可以使用expected_conditions模块的各种条件,或者WebElement的方法如is_displayed(),所以需要列举一些常用的条件,如元素可见、可点击等。 另外,引用[3]中的代码示例展示了until_not的用法,可以提到显性等待不仅可以等待条件成立,还可以等待条件不成立的情况。同时要指出显性等待隐性等待的联合使用时的注意事项,比如最长等待时间取决于两者中的较大者,避免用户混淆。 需要将两者进行对比,说明各自的适用场景。隐性等待适合全局设置,而显性等待适合特定条件下的等待。同时提醒用户隐性等待可能会影响整个测试的执行时间,特别是在元素不存在的情况下,而显性等待可以更精确控制等待时间,提高测试效率。 最后,根据用户提供的示例,生成相关问题。问题可以涉及两种等待的区别、如何选择、显性等待的具体条件以及同时使用的注意事项等。要确保问题覆盖回答中的关键点,帮助用户进一步学习。 检查是否所有数学公式都正确使用了$...$或$$...$$格式,但在这个问题中可能不需要数学公式。不过要注意代码块的正确格式,使用三个反引号包裹,并标明语言类型。确保引用标识正确添加,比如在提到隐性等待和显性等待的定义时,引用[1]和[2],提到联合使用时引用[3],提到条件方法时引用[4]。 总结回答结构:先介绍两种等待方法,分别说明其语法、特点和使用场景,然后对比两者的区别和联合使用时的注意事项,最后给出相关问题。确保语言简洁明了,符合中文表达习惯。</think>### Python Selenium 元素等待方法详解 在自动化测试中,元素加载时间的不确定性会导致脚本执行失败。Selenium 提供了两种等待机制:**隐性等待**和**显性等待**,用于处理动态加载元素的场景。 --- #### 1. 隐性等待 (Implicit Wait) 隐性等待是全局性设置,作用于整个 `WebDriver` 会话周期。通过 `driver.implicitly_wait(time)` 设置最长等待时间,若元素未立即找到,WebDriver 会轮询 DOM 直到超时或找到元素[^1][^3]。 **特点**: - 仅针对元素查找操作(如 `find_element`)生效,不影响其他操作(如页面加载)。 - 超时后抛出 `NoSuchElementException`。 **示例**: ```python driver.implicitly_wait(10) # 设置全局隐性等待时间为10秒 element = driver.find_element(By.ID, "button") ``` --- #### 2. 显性等待 (Explicit Wait) 显性等待针对特定条件,通过 `WebDriverWait` 和 `expected_conditions` 模块实现更灵活的等待逻辑[^2][^4]。 **语法**: ```python from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "button")) ) ``` **特点**: - 支持自定义条件(如元素可见、可点击、属性变化等)。 - 可设置轮询间隔(默认 0.5 秒),优化性能[^3]。 **常用条件**: - `EC.presence_of_element_located`(元素存在) - `EC.visibility_of_element_located`(元素可见) - `EC.element_to_be_clickable`(元素可点击) - `EC.text_to_be_present_in_element`(元素包含特定文本) --- #### 3. 隐性等待 vs 显性等待 | 特性 | 隐性等待 | 显性等待 | |--------------------|--------------------------|--------------------------| | **作用范围** | 全局 | 局部(针对特定条件) | | **灵活性** | 低 | 高(可自定义条件) | | **超时处理** | 抛出异常 | 抛出异常或返回布尔值 | | **性能影响** | 可能增加总执行时间 | 更高效(按需等待) | **联合使用注意事项**: 若同时设置两种等待,实际最长等待时间取两者中的较大值。例如: ```python driver.implicitly_wait(5) # 隐性等待5秒 element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located(...)) # 最终最长等待时间为10秒 ``` ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值