2014-03-30 1 views
8

프레임 단위로로드하는 웹 페이지에서 프로세스를 자동화하려고합니다. 요소가 확인 된 후에 만 ​​실행되는 try-except 루프를 설정하려고합니다. 이는 코드는 내가 설정 한된다Python Selenium 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) 

위의 시도-제외 루프에서 누락 있나요? 나는 except 이후보다는 try 전에 time.sleep()을 사용하는 것을 포함하여 다양한 조합을 시도했다.

감사

+0

요소가 발견되지 않으면 현재 코드가 잠자기 상태가됩니다. –

+0

예, 구현에 문제가없는 한 다시 시도하기 전에 2 초 정도 기다리는 것이 좋습니다. – user3294195

+0

"요소가 확인 된 후에 실행"이라는 문구로 혼란스러워했습니다. 내 이전 의견은 오류였습니다. –

답변

19

특정 질문에 대한 대답은이 : waits

+0

이것은 완벽하게 작동합니다 ... 대단히 감사합니다! 오류가 반복문 뒤에있는 논리와 관련이있는 것처럼 보입니다. – user3294195

1

또 다른 방법이 될 수 :

from selenium.common.exceptions import NoSuchElementException 

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

그러나 요소가 페이지에 표시 될 때까지 기다릴 수있는 더 좋은 방법이있다.

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 : global name 'TimeoutException'이 정의되지 않았습니다. ' 이 예제에서는 최소한 셀레늄을 가져 와서 5 행을'selenium.common.exceptions.TimeoutException as ex :'를 제외하고 바꾸어야한다고 생각합니다. – altabq

+0

예, 필요합니다. selenium.common.exceptions에서 가져 오기 import TimeoutException – Charls

+0

답변이 가치있는 편집 같음 – altabq

관련 문제