簡體   English   中英

Selenium find_elements 僅在 get() 之后的時間過去時才有效

[英]Selenium find_elements only works if time passes since get()

在 Colab 中同時運行這兩行會返回[]

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

但是,運行一個,然后運行另一個會返回預期結果:

[<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 應該是阻塞的,所以不確定這里發生了什么。

在瀏覽器向驅動程序發送'document.readyState' == "complete"后立即調用get()時,Colab 會執行下一行代碼,因為DOM 樹尚未完全加載,因此找不到任何匹配項。 因此,您會看到 Colab 返回[]

要定位可見元素,您需要為visibility_of_all_elements_located()誘導WebDriverWait ,您可以使用以下任一Locator Strategies

  • 使用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

您可以使用以下代碼作為示例,等待站點完全加載並准備好進行操作。

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

這就是 Selenium 的工作原理。
只有在完全加載后,它才能訪問 web 元素。
這就是我們在這里隱式和顯式使用等待的原因。
更推薦顯式等待。
所以而不是

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM