我正在嘗試在 python 中使用 selenium 和 chromedriver 從網站抓取資料。登錄網站后,我必須從一個下拉選單中選擇一些值,但我無法使用代碼單擊下拉選單。我已將代碼撰寫為:
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver,60)
element=wait.until(EC.element_to_be_clickable((By.XPATH,"//input[@id='ContentPlaceHolder1_rcmbCapacityTranch_Input']")))
element.click()
當我運行上面的代碼StaleElementReferenceException: Message: stale element reference: element is not attached to the page document行時,我得到了但是當我包含time.sleep(2)為:
time.sleep(2)
element=wait.until(EC.element_to_be_clickable((By.XPATH,"//input[@id='ContentPlaceHolder1_rcmbCapacityTranch_Input']")))
element.click()
現在,它成功執行并單擊下拉選單并顯示值,但有時 2 秒的時間中斷是不夠的,我必須給 5 秒,有時我必須給 10 秒的時間中斷,這會減慢執行速度,有時這 10 秒時間休息也失敗了。
我還嘗試了以下代碼行:
staleElement = True
while(staleElement):
try:
xpath="//input[@id='ContentPlaceHolder1_rcmbCapacityTranch_Input']"
element=wait.until(EC.element_to_be_clickable((By.XPATH,xpath)))
element.click()
staleElement = False
except StaleElementReferenceException:
staleElement = True
上述代碼行成功執行,但未單擊下拉選單且未顯示值,但是當我在 jupyter notebook 單元格中重新執行與上述相同的代碼行時,下拉選單被選中并顯示值。
所以,任何人都可以幫我解釋我上面提到的事情背后的原因,并給我永久的解決方案來解決這個問題,而無需sleep().
任何幫助,將不勝感激。
uj5u.com熱心網友回復:
由于我沒有進入該站點的憑據,因此我只能猜測。
所以我的猜測是:該站點使用動態 DOM。
這意味著在最初出現之后,Web 元素會繼續重建,因此即使在 Selenium 捕獲某些特定元素可點擊或可見之后,該元素也可能會立即繼續更改,從而使初始元素參考變得陳舊。
您可以嘗試通過兩種方式解決此問題:
- 設定第一個
wait條件,然后設定延遲,然后設定另一個wait條件。像這樣的東西:
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver,60)
wait.until(EC.element_to_be_clickable((By.XPATH,"//input[@id='ContentPlaceHolder1_rcmbCapacityTranch_Input']")))
time.sleep(2)
wait.until(EC.element_to_be_clickable((By.XPATH,"//input[@id='ContentPlaceHolder1_rcmbCapacityTranch_Input']"))).click()
- 捕獲元素后,請嘗試單擊它。如果引發過時元素例外,請等待該元素再次可單擊,然后再次嘗試單擊它,直到單擊成功。使用這樣的回圈,您通常會在 2-3 次迭代期間單擊。
所以請試試這個:
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver,60)
succeed = False
while !succeed:
try:
wait.until(EC.element_to_be_clickable((By.XPATH,"//input[@id='ContentPlaceHolder1_rcmbCapacityTranch_Input']"))).click()
succeed = True
except:
pass
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/385838.html
