zl程序教程

您现在的位置是:首页 >  其他

当前栏目

隐性等待和显性等待

2023-03-14 09:45:23 时间

一、隐性等待

implicitly_wait(30)的用法应该比time.sleep() 更智能,前者可以在一个时间范围内智能的等待,后者只能选择一个固定的时间的等待。
文档解释:
selenium.webdriver.remote.webdriver.implicitly_wait(time_to_wait)
隐式地等待一个元素被发现或一个命令完成;这个方法每次会话只需要调用一次
time_to_wait: 等待时间
用法:
browser.implicitly_wait(30)

1 # coding = utf-8
2 from selenium import webdriver
3 import time #调入time 函数
4 browser = webdriver.Firefox()
5 browser.get("http://www.baidu.com")
6 browser.implicitly_wait(30) #智能等待30秒,适用下方所有命令
7 browser.find_element_by_id("kw").send_keys("selenium")
8 browser.find_element_by_id("su").click() #30秒内找到su的id,立即点击,否则报异常
9 browser.quit()

 二、显性等待

WebDriverWait显性等待的场景:操作引起了页面的变化,而接下来要操作变化的元素的时候,就需要使用显性等待。

以百度首页登录界面为例子,比如点击登录后,在登录界面点击短信登录进行切换:

 

 当我们不点击登录时,发现在dom树中,根本没有短信登录的元素,所以,我们要想点击这个元素,那就需要等待这个元素加载到dom树中,可以找到才行:

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

 三、强制等待

time.sleep(3)