隐性等待和显性等待
一、隐性等待
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)
无论遭遇如何,人都要一颗善良而宽容的心,灵魂的重量决定生命的质量,智慧的终极表现不是多么多么的有钱,而是面对弱小和愚蠢之后的慈悲之心。