codecamp

selenium2 显式 waits

显式的​waits​等待一个确定的条件触发然后才进行更深一步的执行。最糟糕的做法是​time.sleep()​,这里指定的条件是等待一个固定的时间段。使用​WebDriverWait​结合​ExpectedCondition​是一种便利的方法,它可以让你编写的代码根据实际情况确定等待的时间:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get("https://www.w3cschool.cn")
try:
    element = WebDriverWait(driver,10).until(
        EC.presence_of_element_located((By.NAME,"w"))
    )
finally:
    driver.quit()

这段代码会等待10秒,如果10秒内找到元素则立即返回,否则会抛出​TimeoutException​异常,​WebDriverWait​默认每500毫秒调用一下​ExpectedCondition​直到它返回成功为止。​ExpectedCondition​类型是布尔型,成功的返回值就是​true​,其他类型的​ExpectedCondition​成功的返回值就是 ​not null​。

详细的​ExpectedCondition​可以参看  浏览器驱动

预期条件

自动化网页操作时,有许多频繁使用到的通用条件。下面列出的是每一个条件的实现。Selenium + Python 提供了许多方便的方法,因此你不需要自己编写​expected_condition​的类,或者创建你自己的通用包。

  • title_is
  • title_contains
  • presence_of_element_located
  • visibility_of_element_located
  • visibility_of
  • presence_of_all_elements_located
  • text_to_be_present_in_element
  • text_to_be_present_in_element_value
  • frame_to_be_available_and_switch_to_it
  • invisibility_of_element_located
  • element_to_be_clickable ​- 元素展示并且可用
  • staleness_of
  • element_to_be_selected
  • element_located_to_be_selected
  • element_selection_state_to_be
  • element_located_selection_state_to_be
  • alert_is_present
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver,10)
element = wait.until(EC.element_to_be_clickable((By.ID,'someid')))

expected_conditions​模块包含了一系列预定义的条件来和​WebDriverWait​使用。


selenium2 Waits
selenium2 隐式 waits
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }