我对一个元素感兴趣,我们称之为
<div class="ofInterest" some-attr="dataIReallyWant"></div>
当我在firefox中关闭js时,此元素不存在。用它做的javascript。我不知道它是如何生成的,但我的猜测是有一个ajax调用返回一个执行这个javascript的js文件。
我正在使用硒,但速度非常慢。我想告诉Selenium:
等待加载此元素,即EC.visibility_of_element_located((By.CSS, '.ofInterest'))
一旦检测到所述元素,停止阻止代码并且不再下载,所以不要浪费我的带宽
答案 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)