2014-03-30 93 views
8

我試圖自動化逐幀加載的網頁上的進程。我試圖設置一個try-except循環,只有在元素被確認存在後纔會執行循環。這是我的代碼已經設置了:Python的硒Webdriver - 嘗試除了循環

from selenium.common.exceptions import NoSuchElementException 

while True: 
    try: 
     link = driver.find_element_by_xpath(linkAddress) 
    except NoSuchElementException: 
     time.sleep(2) 

上面的代碼無法正常工作,而下面的天真方法確實:

time.sleep(2) 
link = driver.find_element_by_xpath(linkAddress) 

有什麼在上面嘗試 - 除了循環不見了?我嘗試了各種組合,包括在try之前使用time.sleep(),而不是在except之後。

感謝

+0

如果找不到元素,您當前的代碼只會睡覺。 – 2014-03-30 07:55:46

+0

是的,這個想法是在再次嘗試之前等待2秒鐘,除非執行過程中出現錯誤。 – user3294195

+0

我想我對「元素確認後執行」的措辭感到困惑。我以前的評論是一個錯誤。 – 2014-03-30 07:58:57

回答

19

您的特定問題的答案是:

from selenium.common.exceptions import NoSuchElementException 

link = None 
while not link: 
    try: 
     link = driver.find_element_by_xpath(linkAddress) 
    except NoSuchElementException: 
     time.sleep(2) 

然而,有一種更好的方式來等待出現在頁面上的元素:waits

+0

這完美...非常感謝!似乎錯誤與迭代背後的邏輯有關。 – user3294195

1

另一種方式可能是。

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

try: 
    element = WebDriverWait(driver, 2).until(
      EC.presence_of_element_located((By.XPATH, linkAddress)) 
    ) 
except TimeoutException as ex: 
      print ex.message 

在WebDriverWait調用中,把驅動變量和秒等待。

+0

這對我不起作用。錯誤消息:'NameError:全局名稱'TimeoutException'未定義'。我認爲在這個例子中,你至少需要'導入selenium',然後用'替換第5行,除了selenium.common.exceptions.TimeoutException,例如:'。 – altabq

+0

是的,你需要。來自selenium.common.exceptions import TimeoutException – Charls

+0

聽起來像是一個值得您編輯的答案 – altabq