告诉硒在预期状况后停止阻塞

时间:2014-12-15 16:32:10

标签: python selenium selenium-webdriver

我对一个元素感兴趣,我们称之为

<div class="ofInterest" some-attr="dataIReallyWant"></div>

当我在firefox中关闭js时,此元素不存在。用它做的javascript。我不知道它是如何生成的,但我的猜测是有一个ajax调用返回一个执行这个javascript的js文件。

我正在使用硒,但速度非常慢。我想告诉Selenium:

  1. 等待加载此元素,即EC.visibility_of_element_located((By.CSS, '.ofInterest'))

  2. 一旦检测到所述元素,停止阻止代码并且不再下载,所以不要浪费我的带宽

2 个答案:

答案 0 :(得分:4)

只需等待元素存在于DOM中,然后退出/关闭浏览器或执行一些JavaScript以阻止页面加载:

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("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 10).until( #10 second timeout.
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()
    # OR
    #driver.execute_script("window.stop();")

可以找到更多信息here.

答案 1 :(得分:1)

Explicit waits完全符合您的描述:

  

显式等待是您定义的等待某个条件的代码   在进一步执行代码之前发生。最坏的情况   是time.sleep(),它将条件设置为精确的时间段   等待。

在最糟糕的情况下,你会等待你传递给WebDriverWait的X秒,在这种情况下是10秒:

element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )

但是,如果先前找到该元素,它将为您提供元素并停止阻止执行。默认情况下,它每500ms检查一次预期的情况。

仅供参考,引擎盖下,它只是a while True: loop

def until(self, method, message=''):
    """Calls the method provided with the driver as an argument until the \
    return value is not False."""
    screen = None
    stacktrace = None

    end_time = time.time() + self._timeout
    while True:
        try:
            value = method(self._driver)
            if value:
                return value
        except self._ignored_exceptions as exc:
            screen = getattr(exc, 'screen', None)
            stacktrace = getattr(exc, 'stacktrace', None)
        time.sleep(self._poll)
        if time.time() > end_time:
            break
    raise TimeoutException(message, screen, stacktrace)