Selenium Element.get_attribute 偶尔会失败

Selenium Element.get_attribute occasionally failing

鉴于此代码:

options = webdriver.ChromeOptions()
options.add_argument("headless")
driver = webdriver.Chrome(options=options)

driver.get('https://covid19.apple.com/mobility')

elements = driver.find_elements_by_css_selector("div.download-button-container a")

csvLink = [el.get_attribute("href") for el in elements]
driver.quit()

最后,csvLink 有时有 link 而大多数时候没有。如果我停在调试器的最后一行,它通常无法在 csvlink 中包含任何内容,但如果我手动执行(在调试器中)elements[0].get_attribute('href'),则会返回正确的 link。每一次。

如果我替换

csvLink = [el.get_attribute("href") for el in elements] 

直接调用 -

csvLink = elements[0].get_attribute("href")

它也失败了。但是,如果我停在 driver.quit() 行并手动执行,则会返回正确的 link。

在使用 Selenium 时是否存在我不知道的时间或路径依赖性?

我猜这与 javascript 加载 link 的方式和时间有关。在 javascript 能够加载元素 href 属性值之前,Selenium 无需等待就可以获取它。尝试显式等待选择器,例如:

(
    WebDriverWait(browser, 20)
    .until(EC.presence_of_element_located(
        (By.CSS_SELECTOR, "div.download-button-container a[href]")))
    .click()
)

参考:

  • Selenium - wait until element is present, visible and interactable
  • How do I target elements with an attribute that has any value in CSS?

此外,如果您 curl https://covid19.apple.com/mobility 我怀疑该元素存在(可能),但 href 为空?