如何在Selenium的try/except块中禁用隐式等待?
解决Selenium隐式等待在try/except中拖慢流程的问题
这问题我之前做自动化脚本时也碰到过,全局设置的隐式等待确实会在这种需要快速失败的场景拖慢效率,给你几个可行的解决方案:
方案1:临时修改隐式等待时间
既然全局隐式等待是60秒,那我们可以在进入try块前临时把等待时间改短,执行完后再恢复回来,这样既满足当前场景的快速判断,又不影响其他操作的等待逻辑:
if PROXYSTATUS == False: driver.find_element_by_css_selector("img[title='中国大陆']").click() else: # 临时将隐式等待改为1秒(可根据需求调整) driver.implicitly_wait(1) try: driver.find_element_by_css_selector("img[title='中国大陆']").click() except: pass # 恢复全局的60秒隐式等待 driver.implicitly_wait(60)
方案2:使用显式等待(推荐)
显式等待是针对单个元素的等待逻辑,优先级高于隐式等待,而且不会修改全局配置,非常适合这种局部场景。你需要先导入对应的模块,然后设置短时间的超时:
首先导入依赖:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By
然后修改你的代码:
if PROXYSTATUS == False: driver.find_element_by_css_selector("img[title='中国大陆']").click() else: try: # 等待1秒,直到元素出现 target_element = WebDriverWait(driver, 1).until( EC.presence_of_element_located((By.CSS_SELECTOR, "img[title='中国大陆']")) ) target_element.click() except: pass
这个方法的好处是不需要改动全局的隐式等待设置,只在当前查找元素的逻辑里生效短超时,更灵活也更安全。
方案3:利用find_elements避免异常(注意局限性)
find_elements_by_css_selector方法在找不到元素时不会抛出异常,而是返回一个空列表。但要注意:这个方法依然会受全局隐式等待的影响,所以如果不配合临时修改等待时间,还是会等60秒才返回空列表,所以只有当你配合方案1的临时修改时才适合用:
if PROXYSTATUS == False: driver.find_element_by_css_selector("img[title='中国大陆']").click() else: driver.implicitly_wait(1) elements = driver.find_elements_by_css_selector("img[title='中国大陆']") if elements: elements[0].click() driver.implicitly_wait(60)
总结一下,最推荐方案2的显式等待,它既能满足你快速进入except分支的需求,又不会对其他自动化逻辑造成影响。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

