2016-08-24 307 views

回答

0

是例外,勿庸置疑,這意味着該元素是不可用的DOM。有一對夫婦的選擇這裏:

driver.implicitly_wait(10) 

會告訴司機一個元素後,等待10秒(或任何時間),未發現/不可點擊等,之後再次嘗試。有時元素不會立即加載,所以隱含的等待可以修復這些類型的問題。

這裏的另一個選擇是做一個明確的等待。這將等到出現的元素,直到該元素的存在得到確認,該腳本將不會移動到下一行:

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

element = WebDriverWait(ff, 10).until(EC.presence_of_element_located((By.XPATH, "//*[@id='posted_1']/div[3]"))) 

以我的經驗,一個隱含的等待通常是罰款,但不精確。

0

如果你正在NoSuchElementException爲您提供的異常,可能有以下幾個原因: -

  • 可能是你用不正確定位的定位,因此,你需要更好的定位解決方案共享HTML。

  • 可能是當你要尋找的元素,它不會出現在DOM,所以你應該實現WebDriverWait等到元素可見如下: -

    from selenium import webdriver 
    from selenium.webdriver.common.by import By 
    from selenium.webdriver.support.ui import WebDriverWait 
    from selenium.webdriver.support import expected_conditions as EC 
    
    wait = WebDriverWait(driver, 10) 
    
    element = wait.until(EC.visibility_of_element_located((By.XPATH, "//*[@id='posted_1']/div[3]"))) 
    
  • 可能是這個元素在任何frameiframe之內。如果是,你需要一個frameiframe發現如下元素之前切換: -

    driver.switch_to_frame("frame/iframe I'd or name") 
    
    wait = WebDriverWait(driver, 10) 
    
    element = wait.until(EC.visibility_of_element_located((By.XPATH, "//*[@id='posted_1']/div[3]"))) 
    
    #Once all your stuff done with this frame need to switch back to default 
    driver.switch_to_default_content(); 
    
+0

謝謝Saurabh,但在實施你的建議後,這是我在輸出中看到的。 0.00S [INFO]開始測量[160824_FW_3QJW] 0.36s [INFO]執行腳本的webdriver 20.76s [ERROR] TimeoutException異常: 回溯(最近最後調用):34 線,在<合成腳本> \t元素=等待.until(EC.visibility_of_element_located((By.XPATH,「// * [@ id ='posted_1']/div [3]」))) 第80行,直到 \t raise TimeoutException(message,screen,stacktrace) –

+0

確保首先你的xpath是正確的... –

+0

如果你的xpath是正確的,那麼確保這個元素不在任何框架或iframe中...如果它然後考慮第三個提供的點... :) –

相關問題