python爬虫基础12-selenium大全6/8-等待

Selenium笔记(6)等待

本文集连接:https://www.jianshu.com/nb/25338984web

 

简介

在selenium操做浏览器的过程当中,每一次请求url,selenium都会等待页面加载完毕之后,才会将操做权限再次交给咱们的程序。ajax

可是,因为ajax和各类JS代码的异步加载问题,因此咱们在使用selenium的时候经常会遇到操做的元素尚未加载出来,就会引起报错。为了解决这个问题,Selenium提供了几种等待的方法,让咱们能够等待元素加载完毕后,再进行操做。浏览器

 

显式等待

例子

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.Chrome()
driver.get("http://somedomain/url_that_delays_loading")
try:
   element = WebDriverWait(driver, 10).until(
       EC.presence_of_element_located((By.ID, "myDynamicElement"))
  )
finally:
   driver.quit()

在这个例子中,咱们在查找一个元素的时候,再也不使用find_element_by_*这样的方式来查找元素,而是使用了WebDriverWaitdom

try代码块中的代码的意思是:在抛出元素不存在异常以前,最多等待10秒。在这10秒中,WebDriverWait会默认每500ms运行一次until之中的内容,而until中的EC.presence_of_element_located则是检查元素是否已经被加载,检查的元素则经过By.ID这样的方式来进行查找。异步

就是说,在10秒内,默认每0.5秒检查一次元素是否存在,存在则将元素赋值给element这个变量。若是超过10秒这个元素仍不存在,则抛出超时异常。ui

Expected Conditions

Expected Conditions这个类提供了不少种常见的检查条件能够供咱们使用。url

  • title_isspa

  • title_containscode

  • presence_of_element_locatedci

  • 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')))

 

隐式等待

隐式等待指的是,在webdriver中进行find_element这一类查找操做时,若是找不到元素,则会默认的轮询等待一段时间。

这个值默认是0,能够经过如下方式进行设置:

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(10) # 单位是秒
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")
相关文章
相关标签/搜索