다음은 파이썬에서 완전히 일반적인 솔루션을 시도한 것입니다.
먼저, 일반적인 "대기"기능 (원하는 경우 WebDriverWait을 사용하면 추악합니다) :
def wait_for(condition_function):
start_time = time.time()
while time.time() < start_time + 3:
if condition_function():
return True
else:
time.sleep(0.1)
raise Exception('Timeout waiting for {}'.format(condition_function.__name__))
다음으로 솔루션은 셀레늄이 최상위 <html>
요소를 포함하여 페이지의 모든 요소에 대해 (내부) id 번호를 기록한다는 사실에 의존합니다 . 페이지를 새로 고치거나로드하면 새 ID를 가진 새로운 html 요소가 표시됩니다.
예를 들어, "my link"라는 텍스트가있는 링크를 클릭한다고 가정하면 다음과 같습니다.
old_page = browser.find_element_by_tag_name('html')
browser.find_element_by_link_text('my link').click()
def page_has_loaded():
new_page = browser.find_element_by_tag_name('html')
return new_page.id != old_page.id
wait_for(page_has_loaded)
더 파이썬적이고 재사용 가능한 일반 도우미를 위해 컨텍스트 관리자를 만들 수 있습니다.
from contextlib import contextmanager
@contextmanager
def wait_for_page_load(browser):
old_page = browser.find_element_by_tag_name('html')
yield
def page_has_loaded():
new_page = browser.find_element_by_tag_name('html')
return new_page.id != old_page.id
wait_for(page_has_loaded)
그리고 거의 모든 셀레늄 상호 작용에 사용할 수 있습니다.
with wait_for_page_load(browser):
browser.find_element_by_link_text('my link').click()
방탄이라고 생각합니다! 어떻게 생각해?
블로그 게시물에 대한 자세한 정보는 여기