【问题标题】:python selenium - takes a lot of time when it does not find elementspython selenium - 找不到元素时需要很多时间
【发布时间】:2018-01-17 17:09:35
【问题描述】:

我的代码使用 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 秒,如果一秒内没有找到,就继续前进吗?有没有办法做到这一点?

【问题讨论】:

  • 请在等待 6-7 秒的地方添加代码。为什么不将等待时间从 6 秒缩短到 1 秒?

标签: python selenium selenium-webdriver timeout selenium-chromedriver


【解决方案1】:

尝试使用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 的列表,否则什么也不做

【讨论】:

  • 使用presence_* 可能很危险,因为它只是意味着元素在 DOM 中,但不一定可访问/可点击。此外,当您使用all_elements 时,它会等待所有,而不仅仅是第一个。我让自己陷入麻烦等待所有并发现符合定位器的一个或多个元素被禁用,不可见等,等待将超时。
  • @JeffC,来自文档:“检查网页上是否存在至少一个元素的期望。定位器用于查找元素,一旦它们被定位,就会返回 WebElements 列表”。另请注意,OP 没有提到他想要可见/可点击的元素。考虑到 OP 使用 find_elements_..() 也不会返回可见/可点击元素,没有什么可担心的:)
  • 这可能是文档所述,但它具有误导性,因为我以相同的方式解释它。创建一个包含 5 个元素的页面,这些元素都与一个定位器匹配,并使其中一个不可见并运行等待。它将超时,因为它找到了第 5 个,但它永远不会变得可见。它不是真正的“至少一个”……它是“所有被定位的”。当然,但大多数人不会寻找 A 标签,然后从不点击它们...... :)。
  • @JeffC,如果 OP 检查每个页面的特定锚点,我猜他可能只是收集 URL(href 属性值),因此不需要可见或可点击元素......恕我直言 :) 至于presence_of_all_elements_located:通常它用于获取相似元素的列表,例如来自selectul 的选项- 它应该可以正常工作,但是没有意义使用它来获取例如包含特定文本的所有元素 (//*[contains(., "text")])- 在大多数情况下它不会返回所需的输出...
  • 对,存在总是有效的,因为它只是在 DOM 中。当您等待可点击/可见时,您会遇到麻烦,因为我期待(和文档阅读)只有一些人必须符合条件......但所有人都这样做。
猜你喜欢
  • 2019-08-22
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 2020-03-19
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多