【问题标题】:Selenium find_elements By.XPATH trying to extract href urls errorSelenium find_elements By.XPATH 试图提取 href urls 错误
【发布时间】:2020-09-17 13:20:15
【问题描述】:

使用 Firefox 网络驱动程序,我想从 a href 中提取所有包含单词的 URL。 我正在使用最新的硒二进制文件。 试过这个:

driver = webdriver.Firefox()
driver.get(url)
nodes = driver.find_elements(By.XPATH, "//a[contains(@href,'products')]/@href")
print("nodes: ", nodes)
links = []
for elem in nodes:
    links.append(elem)

但出现类型错误:

selenium.common.exceptions.WebDriverException: Message: TypeError: Expected an element or WindowProxy, got: [object Attr href="https://www.example.com/catalogue/products/a.html"]

也试过driver.find_elements(By.XPATH, "//a[contains(@href,'products')]") 然后对每个使用getAttribute("href"),但也不能使用。

不明白错误在哪里以及如何解决。

html 的摘录:

<html>
  <body>
    <ul class="level2-megamenu">
      <li>
        <div class="level1-title">
          <a href="https://www.example.com/catalogue/products/a.html">
          <strong style="color:#828282;font-size:>Text</strong>                 
          </a>
        </div>
      </li>
    </ul>
  </body>
</html>

【问题讨论】:

  • 用相关的 HTML 更新问题。

标签: python selenium selenium-webdriver selenium-firefoxdriver


【解决方案1】:

要使用Selenium 提取href 属性,您必须为WebDriverWait 诱导visibility_of_all_elements_located(),您可以使用以下任一Locator Strategies

  • 使用CSS_SELECTOR

    print([my_elem.get_attribute("href") for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "a[href*='products']")))])
    
  • 使用XPATH:

    print([my_elem.get_attribute("href") for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//a[contains(@href,'products')]")))])
    
  • 注意:您必须添加以下导入:

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

【讨论】:

  • 不幸的是,该行 (XPATH) 返回了一个没有消息的错误:raise TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message:。不过,该页面似乎已完全加载。
  • 这已经解决了,用这两行:wait = WebDriverWait(driver, 10) nodes = wait.until(lambda driver: driver.find_elements_by_xpath("//a[contains(@href,'products')]"))。方法命名不同。也许您可以解释一下原因,有什么区别。无论如何,谢谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 2017-03-20
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 2017-11-30
  • 2022-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多