English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
많은 사람들이 그룹에서 이下拉 창을 찾을 수 없다, 그리고 이 팝업 창을 찾을 수 없다... 등 여러 가지 찾을 수 없는 문제를 묻습니다. 하지만 대부분의 경우는 두 가지 문제로 나타납니다:1 frame2 기다림이 추가되지 않았습니다. 하지만 여러분의 코드 실행 속도는 어떤 수준인가요? 브라우저가 로드되고 렌더링되는 속도는 어떤 수준인가요? 빠른 인간과 둥글은 몬스터를 공격하기 위해 만나고, 빠른 인간이 돌아와서 둥글이 여전히 신발을 신고 나가지 않았다는 것을 묻습니다. 둥글은 마음속에 만다라를 풀며, 빠른 인간이 속도가 느릴 것을 욕하며, 예외를 던지고 도망치는 것입니다.
그렇다면 둥글이 느리게 로드되는 속도를 어떻게 관리할 수 있을까요? 하나의 방법만 있습니다. 기다리는 것입니다. 기다림에 대해 이야기할 때, 세 가지 기다림 방법이 있습니다. 저는 차례대로 설명하겠습니다:
1. 강제 기다림
첫 번째 방법은 가장 간단하고 직접적인 방법으로 강제 기다림(sleep(xx))입니다. 빠른 인간이 xx초를 기다리게 하여, 둥글이 속도를 맞추거나 이미 앞서 왔与否에 관계없이 xx초를 기다려야 합니다.
코드를 보세요:
# -*- coding: utf-8 -*- from selenium import webdriver from time import sleep driver = webdriver.Firefox() driver.get('https://huilansame.github.io sleep(3) # 강제 기다림3초 후 다음 단계를 수행합니다 print driver.current_url driver.quit()
이는 강제 기다림으로, 브라우저가 로드되었는지 여부와 관계없이 프로그램이 기다려야 합니다3초3초가 지면, 다음 코드를 계속 수행합니다. 디버깅에 매우 유용하며, 때로는 코드에서 이렇게 기다릴 수도 있지만, 이 방식을 계속 사용하지 않는 것이 좋습니다. 너무 직접적이어서 프로그램 실행 속도에 큰 영향을 미칩니다.
2. 은닉 기다림
두 번째 방법은 은닉 기다림(implicitly_wait(xx)입니다. 은닉 기다림의 의미는: 빠른 인간과 둥글은 매우 빠른 인간이 서로 계약을 맺고, 빠른 인간이 어디든가 가더라도 둥글은 xx초를 기다립니다. 둥글이 이 시간 내에 왔으면, 두 사람은 즉시 출발하여 몬스터를 공격합니다. 둥글이 설정된 시간 내에 오지 않으면, 빠른 인간은 혼자서 출발합니다. 그래서 자연스럽게 둥글이 예외를 던지고 떠나는 것을 기다립니다.
코드를 보세요:
# -*- coding: utf-8 -*- from selenium import webdriver driver = webdriver.Firefox() driver.implicitly_wait(30) # 은닉 기다림, 가장 긴 기다림 시간30초 driver.get('https://huilansame.github.io print driver.current_url driver.quit()
비밀로 기다리는 것은 가장 긴 기다림 시간을 설정한 것입니다. 설정된 시간 내에 웹 페이지가 로드되면 다음 단계를 수행하며, 그렇지 않으면 시간이 만료되면 다음 단계를 수행합니다. 주의할 점은 프로그램이 전체 페이지가 로드되기를 기다리는 것이어서 일반적으로 브라우저 탐색기 탐색 줄에 작은 원이 더 이상 돌지 않을 때까지 다음 단계를 수행하는 것입니다. 하지만 페이지가 원하는 요소가 이미 로드되었을 때도 특정 js와 같은 것들이 너무 느리면 전체 페이지가 완료되기까지 기다려야 합니다. 나는 원하는 요소가 나타나면 바로 다음 단계를 진행하려고 합니다. 방법이 있어요. 이는 selenium이 제공하는 또 다른 기다림 방식인 명시적 기다림 wait에 달려 있습니다.
특히 강조할 점은: 은답 대기는 전체 driver 주기를 대상으로 작동하므로 한 번 설정하면 됩니다. 은답 대기를 sleep로 사용하는 사람을 보았습니다...
3. 명시적 대기
세 번째 방법은 명시적 대기인 WebDriverWait를 사용하는 것입니다. WebDriverWait와 그 클래스의 until()와 until_not() 메서드를 사용하면 조건에 따라 유연하게 대기할 수 있습니다. 주요 의미는 다음과 같습니다: 프로그램은 xx 초마다 조건을 확인하고, 조건이 성립되면 다음 단계를 실행하고, 조건이 성립되지 않으면 계속 대기하고, 설정된 최대 대기 시간을 초과하면 TimeoutException을 투척합니다.
코드 예제를 먼저 보겠습니다:
# -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By driver = webdriver.Firefox() driver.implicitly_wait(10) # 은답 대기와 명시적 대기는 동시에 사용할 수 있지만, 주의할 점은: 대기 시간은 두 가지 중 더 긴 것을 선택해야 합니다 driver.get('https://huilansame.github.io locator = (By.LINK_TEXT, 'CSDN') try: WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator)) print driver.find_element_by_link_text('CSDN').get_attribute('href') finally: driver.close()
이 예제에서는 암시적 대기와 명시적 대기를 설정했으며, 다른 작업에서는 암시적 대기가 결정적 역할을 합니다. WebDriverWait..에서 명시적 대기가 주요 역할을 합니다. 그러나 주의해야 할 것은 두 가지 대기 시간 중 더 긴 것이 최종 대기 시간이 될 것입니다. 이 예제에서는}}20, 암시적 대기 시간이 명시적 대기 시간보다 길면 이 문장의 가장 긴 대기 시간은 암시적 대기 시간입니다.
우리는 WebDriverWait 클래스와 expected_conditions 모듈을 주로 사용합니다. 다음은 이 두 모듈을 자세히 설명합니다:
WebDriverWait
wait 모듈의 WebDriverWait 클래스는 명시적 대기 클래스입니다. 먼저 이 클래스의 매개변수와 메서드를 확인해 보겠습니다:
selenium.webdriver.support.wait.WebDriverWait(클래스) __init__ driver: WebDriver 인스턴스를 전달, 예를 들어 이전 예제에서의 driver timeout: 시간 초과 시간, 기다릴 가장 긴 시간(암시적 대기 시간을 고려합니다) poll_frequency: until 또는 until_not 메서드를 호출하는 간격 시간, 기본적으로는 0입니다.5초 ignored_exceptions: 무시할 예외, until 또는 until_not 호출 중에 이 튜플 내의 예외가 발생하면 코드가 중단되지 않고 계속 대기합니다. 이 튜플 외의 예외가 발생하면 코드가 중단되고 예외가 발생합니다. 기본적으로 NoSuchElementException만 있습니다. until method: 대기 중에 일정 시간 간격으로 이를 전달된 메서드를 호출하며, 반환 값이 False가 아니면까지 대기합니다 message: 시간 초과가 발생하면 TimeoutException이 발생하며, 메시지를 예외에 전달합니다 until_not은 until의 반대입니다. until은 특정 요소가 나타나거나 조건이 성립되면 계속 실행되며, until_not은 특정 요소가 사라지거나 조건이 성립되지 않으면 계속 실행됩니다. 매개변수는 동일하며, 더 이상 설명하지 않습니다. method message
이 내용을 보면 대체로 명확해졌을 것입니다. 호출 메서드는 다음과 같습니다:
WebDriverWait(driver, 시간 초과 시간, 호출 주기, 예외 무시).until(실행 가능한 메서드, 시간 초과 시 반환되는 정보)
특히 until 또는 until_not에서의 실행 가능한 메서드 메서드 매개변수에 주의해야 합니다. 많은 사람들이 WebElement 객체를 전달합니다.
WebDriverWait(driver, 10.until(driver.find_element_by_id('kw')) # 오류
이는 잘못된 사용법입니다. 여기서 전달하는 매개변수는 호출할 수 있는 것으로 전달해야 합니다. 즉, 이 객체는 __call__() 메서드를 가지고 있어야 합니다. 그렇지 않으면 예외가 발생합니다
이는 잘못된 사용법입니다. 여기서 전달하는 매개변수는 호출할 수 있는 것으로 전달해야 합니다. 즉, 이 객체는 __call__() 메서드를 가지고 있어야 합니다. 그렇지 않으면 예외가 발생합니다
TypeError: 'xxx' object is not callable
여기서는 selenium이 제공하는 expected_conditions 모듈의 다양한 조건을 사용할 수 있습니다. 또한 WebElement의 is_displayed()、is_enabled()、is_selected() 메서드나 자신이 포장한 메서드를 사용할 수도 있습니다. 그럼 selenium이 제공하는 조건을 확인해 보겠습니다
expected_conditions
expected_conditions는 selenium의 모듈로, 여러 가지 조건을 포함하고 있습니다 expected_conditions 모듈 (selenium.webdriver.support) title_is title_contains 이 두 조건은 title을 확인합니다. 전달하는 매개변수는 title이 driver.title와 같거나 포함되어 있는지 확인합니다 명확하게 이 두 조건은 요소가 나타나는지 확인합니다. 전달하는 매개변수는 모두 튜플类型的locator입니다 presence_of_element_located presence_of_all_elements_located 이 세 조건은 요소가 보이는지 확인합니다. 앞 두 조건은 튜플类型的locator을 전달하고, 세 번째 조건은 WebElement을 전달합니다 첫 번째와 세 번째 조건은 실제로 같습니다 visibility_of_element_located invisibility_of_element_located visibility_of 이 두 조건은 특정 텍스트가 특정 요소에 있는지 확인합니다. 하나는 요소의 text를 확인하고, 다른 하나는 요소의 value를 확인합니다 text_to_be_present_in_element text_to_be_present_in_element_value 이 조건은 frame가 접근 가능한지 확인하고 접근할 수 있는지 확인합니다. locator 튜플을 전달하거나 id, name, index 또는 WebElement을 직접 전달할 수 있습니다 frame_to_be_available_and_switch_to_it 이 조건은 alert가 나타나는지 확인합니다 alert_is_present 이 조건은 요소가 클릭할 수 있는지 확인하며, locator를 입력합니다 element_to_be_clickable 이 네 가지 조건은 요소가 선택되었는지 확인하며, 첫 번째 조건은 WebElement 객체를 입력하고, 두 번째 조건은 locator 튜플을 입력합니다 세 번째 조건은 WebElement 객체와 상태를 입력하면 일치하면 True를 반환하고, 다를 경우 False를 반환합니다 네 번째 조건은 locator와 상태를 입력하면 일치하면 True를 반환하고, 다를 경우 False를 반환합니다 element_to_be_selected element_located_to_be_selected element_selection_state_to_be element_located_selection_state_to_be 마지막 조건은 요소가 DOM에 여전히 존재하는지 확인하며, WebElement 객체를 입력하면 페이지가 새로 고침되었는지 확인할 수 있습니다 staleness_of
위는 모든 것입니다17condition이라는 조건을 사용하면 until, until_not와 함께 많은 판단을 할 수 있으며, 자유롭게 포장하면 스크립트의 안정성을 크게 향상시킬 수 있습니다.
이제 제가 여러분께 소개한 Python selenium 세 가지 대기 방식의 상세 설명(필수)은 여러분께 도움이 되었기를 바랍니다. 어떤 질문이나 의문이 있으면 댓글을 남겨 주시면, 제가 즉시 답변드리겠습니다. 또한, 여러분의 양해와 지지에 깊이 감사드립니다.
언급된 내용은 인터넷에서 수집된 내용으로, 저작권자가 소유하고 있으며, 인터넷 사용자가 자발적으로 기여하고 업로드한 내용입니다. 이 웹사이트는 소유권을 가지지 않으며, 인공 편집을 하지 않았으며, 관련 법적 책임을 부담하지 않습니다. 저작권 침해가 의심되는 내용이 있으면, notice#w로 이메일을 보내 주시기 바랍니다.3codebox.com에 (이메일 보내기 시, #을 @으로 변경하십시오) 신고를 하시고 관련 증거를 제공하시면, 사실을 확인하면 즉시 저작권 침해 내용을 삭제하겠습니다.