代码改变世界

Selenium-Webdriver API命令和操作-Get & Wait

2018-02-12 17:46  Weiweim  阅读(2477)  评论(0编辑  收藏  举报

抓取页面

WebDriver可能要做的第一件事就是导航到一个页面。正常的做法是调用“get”:

drviver.get("http://www.google.com")

取决于几个因素,包括操作系统/浏览器组合,WebDriver可能会或可能不会等待页面加载。在某些情况下,WebDriver可能会在页面完成之前或者甚至开始加载之前返回控件。为确保健壮性,需要使用显式和隐式等待来等待页面中存在的元素 

显式等待

明确的等待是定义的代码,等待一定的条件发生,然后继续进行代码。最糟糕的情况是Thread.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 

ff = webdriver.Firefox()
ff.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(ff, 10).until(EC.presence_of_element_located((By.ID, "myDynamicElement")))
finally:
    ff.quit()

在等待10秒之前抛出一个TimeoutException,或者如果它发现元素将在0-10秒内返回。WebDriverWait默认每500毫秒调用ExpectedCondition,直到成功返回。ExpectedCondition函数类型的成功返回值是布尔值true或非空对象。这个例子在功能上也等同于下一个Implicit Waits例子:

from selenium import webdriver

ff = webdriver.Firefox()
ff.implicitly_wait(10) # seconds
ff.get("http://somedomain/url_that_delays_loading")
myDynamicElement = ff.find_element_by_id("myDynamicElement")

自动化浏览器时,经常遇到一些常见的情况。下面列出的是使用这些条件的几个例子。Python绑定包括convenience方法,因此不必亲自编写ExpectedCondition类或为其创建自己的实用程序包。

from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID,'someid')))

ExpectedConditions包包含一组与WebDriverWait一起使用的预定义条件。

隐等待

一个隐含的等待就是告诉WebDriver在查找一个或多个元素(如果不是立即可用的)时轮询DOM一段时间。默认设置为0.一旦设置,隐式等待就设置为WebDriver对象实例的生命周期。

from selenium import webdriver

ff = webdriver.Firefox()
ff.implicitly_wait(10) # seconds
ff.get("http://somedomain/url_that_delays_loading")
myDynamicElement = ff.find_element_by_id("myDynamicElement")