蟒蛇硒 - 需要花费大量的时间,当它没有找到元素

问题描述:

我的代码扫描大量的互联网网页与chromedriver并搜索同一元素在每个页面“find_elements_by_xpath”蟒蛇硒 - 需要花费大量的时间,当它没有找到元素

Lines = driver.find_elements_by_xpath(
        '//*[@id="top"]/div[contains(@style, "display: block;")]/' 
        'div[contains(@style, "display: block;")]//tbody//a[contains(@title, "Line")]') 

当它发现,一个或多个,它工作得很快,很好。但是,当XPath不存在时,它将运行6-7秒,然后继续。

我可以限制搜索1秒吗?如果它在一秒钟内找不到,就继续?有没有办法做到这一点?

+0

请添加代码等待6-7秒。为什么不把等待时间从6秒降低到1秒有什么原因? – JeffC

尝试如下使用ExplicitWait

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

try: 
    Lines = wait(driver, 1).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="top"]/div[contains(@style, "display: block;")]/' 
       'div[contains(@style, "display: block;")]//tbody//a[contains(@title, "Line")]'))) 
except TimeoutException: 
    pass 

这应该让你等待1秒中的至少一个元素,直到并获得所需WebElements清单或者什么也不做,否则

+1

使用'presence_ *'可能很危险,因为它只是表示元素在DOM中,但不一定是可访问/可点击的。另外,当你使用'all_elements'时,它会等待所有*,而不仅仅是第一个。我陷入了麻烦,等待所有人,并发现遇到定位符的一个或多个元素被禁用,不可见等,并且等待会超时。 – JeffC

+0

@JeffC,来自文档:“期望检查网页上至少存在一个元素 。 定位符用于查找元素 返回Web元素一旦找到它们的列表”。另外请注意,OP没有提到他想要可见/可点击的元素。考虑到OP使用'find_elements _ ..()'也不会返回可见/可点击的元素,所以没有什么可担心的:) – Andersson

+1

这可能是文档的状态,但它是误导性的,因为我以相同的方式解释它。创建一个包含5个元素的页面,这5个元素都与一个定位器相匹配,并使其中一个不可见并运行等待。它会超时,因为它找到了第五个,但它永远不会变得可见。这不是“至少有一个”......它是“所有位置”。当然,但大多数人不寻找A标签,然后从不点击它们...... :)。 – JeffC