2012-03-22 6 views
3

나는이 포함이 '일하지 마라 (때로는 때로는 그렇지 않다.).파이썬 셀레늄 (요소 조회 프레임 대기)

나머지 코드를 실행하기 전에 실제로 Selenium이 페이지로드를 기다리지 않고 있기 때문에 이것이 확실하지 않습니다. 웹 페이지로드를 강제하는 방법이 있습니까?

가끔

browser.find_element_by_name("txtPassword").send_keys(password + Keys.RETURN) 
#sends login information, goes to next page and clicks on Relevant Link Text 
browser.find_element_by_partial_link_text("Relevant Link Text").click() 

같은 일을 할 것입니다 그리고 있기 때문에 대부분의 시간을 잘 작동 것이다, 그러나 때때로 나는 그것이 "관련 링크 텍스트"를 찾을 수없는 오류가 발생합니다 때문에 그것 또는 다른 어떤 것을 볼 수 없다.

또한 요소가 존재하는지 여부를 확인하는 더 좋은 방법이 있습니까? 즉, 처리 할 수있는 가장 좋은 방법은 무엇입니까?

browser.find_element_by_id("something") 

해당 요소가 존재할 수도 있고 없을 수도 있습니다.

+0

. 일반적으로 모든 find_element 명령에 try/except를 사용합니까? –

+0

* oh so very sad * :( –

+0

재 게시는 허용되지 않습니다. [faq # bounty]에서이 섹션을 읽으십시오. – Will

답변

9

당신은 WebDriverWait을 사용할 수 있습니다 내가 뭔가를 찾을 수 없을 때 요소 것은 오류가 발생합니다 것을 추가해야

from contextlib import closing 
from selenium.webdriver import Chrome as Browser 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.common.exceptions import NoSuchFrameException 


def frame_available_cb(frame_reference): 
    """Return a callback that checks whether the frame is available.""" 
    def callback(browser): 
     try: 
      browser.switch_to_frame(frame_reference) 
     except NoSuchFrameException: 
      return False 
     else: 
      return True 
    return callback 

with closing(Browser()) as browser: 
    browser.get(url) 
    # wait for frame 
    WebDriverWait(browser, timeout=10).until(frame_available_cb("frame name")) 
+1

+1. 명시 적/암시 적 대기는 이에 대한 가장 신뢰할 수있는 해결책입니다. –