English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
저희가 이전에 소개한 Selenium WebDriver 테스트 메서드는 웹 페이지를 기반으로 합니다. 이전 예제들은 간단한 웹 페이지를 통해 작업을 했지만, 웹 페이지 로드 과정을 잘 느끼지 못할 수 있습니다. 실제 응용 과정에서는 웹 페이지 로드는 일정 시간이 소요됩니다. 여러분의 스크립트는 이미 실행 중이지만, 찾으려는 요소가 아직 로드되지 않았기 때문에, 요소를 찾을 수 없는 오류가 발생합니다. 명백하게, 로드 시간을 고려하지 않은 스크립트는 성공적인 스크립트가 아닙니다. 오늘은 대기 시간을 설정하는 방법에 대해 알아보겠습니다.
대기하는 세 가지 방법
time.sleep(n)
n초 동안 강제 대기합니다. Python 자체의 함수로, time 패키지에 포함되어 있습니다. 사용하기 전에 time 패키지를 임포트해야 합니다. 우리의 예제에서는 이러한 대기 메서드를 자주 사용했습니다. 스크립트 실행 결과를 더 잘 이해할 수 있도록 편리하게 사용했습니다. 이 대기 메서드는 매우 간단하며, 페이지가 어떻게 로드되든, 반드시 n초를 기다려야 하므로 매우 지능적이지 않습니다.
implicitly_wait(n)
최대 대기 시간 n초, n초 내에 페이지가 로드되면 미리 대기를 종료합니다. WebDriver가 제공하는 대기 메서드로, 은밀한 대기라고도 합니다. 페이지 자체가 매우 큰 비디오 파일과 같은 파일을 포함하고 있으면, 필요한 요소가 가장 먼저 로드되었음에도 불구하고, 모든 파일이 로드되고脚本이 계속 실행될 수 있도록까지 기다려야 하므로, 여전히 일부 문제가 있습니다.
WebDriverWait(n)
최대 대기 시간 n초, n초 내에 필요한 요소가 존재하는지를 지속적으로 확인하여 존재하면 미리 대기를 종료합니다. WebDriver가 제공하는 대기 메서드로, 명시적 대기라고도 합니다. 이는 은밀한 대기보다 더 지능적이며, 전체 페이지 로드를 무시하고 필요한 요소가 존재하면 대기를 종료합니다.
예제
강제 대기는 이전 예제에서도 사용했지만, WebDriver가 제공하는 두 가지 대기 메서드를 보도록 하겠습니다
은밀한 대기
실제로 은밀한 대기는 이전 소개에서도 사용했지만, 특별히 사용 방법을 언급하지 않았습니다. 이번에는 와이즈의 홈페이지를 열어보겠습니다. 이는 내용이 많은 포털 사이트입니다. 인터넷 속도에 따라, 추정하기로는大概10초쯤이면 로드가 끝납니다. 우리는 대기 시간을 설정합니다.60초, 그런 다음 페이지를 열고 [공개 강의] 버튼을 클릭하는 데 걸리는 시간을 계산해 보세요.
# coding = utf-8 from selenium import webdriver import time driver = webdriver.Chrome() driver.implicitly_wait(60) # 은밀한 대기 시간60초 time_start = time.time() # 페이지 열기 시간 기록 driver.get('https://www.163.com/) driver.find_element_by_id('js_love_url').click() time_end = time.time() # 버튼 클릭 후 시간 기록 print('access time is : ', time_end - time_start) # 시간 차를 인쇄, 실제 소비 시간 time.sleep(2) # 강제 대기2초, 우리가 실제로 [공개 강의] 페이지를 열어보았기 때문에 driver.quit()
스크립트 실행이 끝나면 보면, 우리가 은밀한 시간을 설정했지만60초, 하지만5초쯤 (아래의 실행 결과를 보세요) 페이지가 완전히 로드되었습니다. [공개 강의] 버튼을 클릭할 수 있습니다. 아래는 저의 한 번의 실행 결과로, 전체 로드 시간을 보여줍니다.
>>>접근 시간은 : 5.717327117919922
명시적 대기
명시적 대기는 selenium.webdriver.support.wait.WebDriverWait 클래스를 임포트해야 합니다. API는 다음과 같습니다:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
명시적 대기는 요소가 존재하는지 확인할 수 있으므로, 일반적으로 다음 두 메서드와 함께 사용됩니다.
until(method, message='') until_not(method, message='')
주의하십시오, method()는 호출 가능한 메서드여야하며, __call__() 메서드가 있어야 합니다. 위의 예제를 다시 작성해 보겠습니다.
# coding = utf-8 from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait import time driver = webdriver.Chrome() class button(): def __call__(self, driver): if driver.find_element_by_id('js_love_url'): return True else: return False driver.implicitly_wait(60) time_start = time.time() driver.get('https://www.163.com/) # driver.find_element_by_id('js_love_url').click() WebDriverWait(driver,2,0.5).until(button()) time_end = time.time() print('access time is : ', time_end - time_start) time.sleep(2) driver.quit()
이 예제를 보고可能会有疑问,我显性等待明明设置了是2초, 왜 오류가 발생하지 않는지요? 왜냐하면 우리는 동시에 은닉 대기 시간도 설정했기 때문입니다. 두 가지 시간 중 가장 긴 시간이 실제 대기 시간으로 간주됩니다. 따라서 이 예제에서 대기 시간은 여전히60초.
결론
1、Selenium은 세 가지 대기 방법을 채택할 수 있으며, 가장 지능적인 것은 명시적 대기 WebDriverWait()입니다
2、명시적 대기와 은닉 대기가 동시에 존재할 때, 두 가지 대기 시간 중 가장 긴 시간이 유효한 대기 시간으로 간주됩니다
3、명시적 대기에서 until(method())의 method()는 호출할 수 있는 메서드이며, 자체 정의할 수도 있고, 익명 함수 등의 방법을 사용할 수 있습니다. 이에 대해 나중에 자세히 설명하겠습니다
4、빠른 대기 설정은 한 번 설정되면 전체 스크립트를 통하여 연결되며, 강제 대기는 각 필요한 대기 위치에 설정해야 합니다
이것이 이 문서의 전체 내용입니다. 여러분의 학습에 도움이 되길 바랍니다. 또한,呐喊 강의에 많은 지지를 부탁드립니다.
성명: 이 문서의 내용은 인터넷에서 가져왔으며, 저작권자는 본인입니다. 내용은 인터넷 사용자가 자발적으로 기여하고 자체로 업로드한 것이며, 이 사이트는 소유권을 가지지 않으며, 인공적인 편집을 하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 침해가 의심되는 내용이 있으면, 이메일을 보내 주세요: notice#oldtoolbag.com(이메일을 보내면, #을 @으로 변경해 주세요. 신고를 하고, 관련 증거를 제공하면, 해당 내용이 저작권 침해로 확인되면, 이 사이트는 즉시 해당 내용을 제거합니다.)