Selenium find_elements 仅在 get() 之后的时间过去时才有效

Selenium find_elements only works if time passes since get()

运行 这两行在 Colab 中一起 returns []:

wd.get("https://wetransfer.com/")
wd.find_elements(By.CSS_SELECTOR, 'input[type=file]')

不过,运行一个,后面跟着另一个returns预期的结果:

[<selenium.webdriver.remote.webelement.WebElement (session="3cdfb3afbb591862e909cd406b6ac523", element="19fd31e8-710a-4b6e-8284-9a7409f12718")>,
<selenium.webdriver.remote.webelement.WebElement (session="3cdfb3afbb591862e909cd406b6ac523", element="837097d1-5735-4b24-9cb2-9d3ded3a0311")>]

Get 应该是阻塞的,所以不确定这里发生了什么。

您可以使用以下代码作为示例,等待您的网站加载完成并准备好进行操作。

myElem = WebDriverWait(driver, delay).until(EC.element_to_be_clickable((By.CLASS_NAME , 'bs_btn_buchen')))

这就是 Selenium 的基本工作原理。
只有完全加载后才能访问网页元素。
这就是我们在这里使用隐式和显式等待的原因。
更推荐显式等待。
所以而不是

wd.get("https://wetransfer.com/")
wd.find_elements(By.CSS_SELECTOR, 'input[type=file]')

你应该使用这样的东西:

wd.get("https://wetransfer.com/")
wait = WebDriverWait(wd, 20)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "input[type=file]")))
wd.find_elements(By.CSS_SELECTOR, 'input[type=file]')

要使用它,您必须导入这些导入:

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

在浏览器发送后立即调用 get() 'document.readyState' == "complete" to the driver, Colab executes the next line of code which doesn't find any match as the DOM Tree 完全没有加载。因此,您会看到 Colab 返回 []

要定位 visible 元素,您需要引入 WebDriverWait for the visibility_of_all_elements_located() and you can use either of the following :

  • 使用CSS_SELECTOR:

    elements = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "input[type=file]")))
    
  • 使用 XPATH:

    elements = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//input[@type=file]")))
    
  • 注意:您必须添加以下导入:

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