Python에서 Selenium 웹 드라이버 대기 추가

Rana Hasnain Khan 2024년2월15일
  1. Python Selenium 웹 드라이버 대기
  2. Selenium 웹 드라이버의 암시적 대기
  3. Selenium 웹 드라이버의 명시적 대기
Python에서 Selenium 웹 드라이버 대기 추가

이 기사에서는 Python에서 Selenium 웹 드라이버 대기를 추가하는 예를 소개합니다.

Python Selenium 웹 드라이버 대기

대부분의 웹 애플리케이션은 AJAX 기술을 사용합니다. 이로 인해 셀레늄이 웹 페이지에 나타날 때까지 텍스트를 찾을 수 없기 때문에 웹 페이지에 있는 다른 요소는 완전히 업로드되는 데 다른 시간 간격이 걸립니다.

특정 텍스트가 업로드되기 전에 일부 응용 프로그램의 웹 페이지에 나타나지 않을 수 있습니다. 이로 인해 응용 프로그램을 테스트하는 동안 오류가 발생합니다.

이 문제는 대기를 포함하여 해결할 수 있습니다. 이러한 대기는 웹 페이지에서 요소 또는 기타 작업을 검색하는 동안 유연성을 제공합니다.

Selenium 웹 드라이버는 두 가지 유형의 대기를 제공합니다. 첫 번째는 암시적 대기이고 두 번째는 명시적 대기입니다.

이 두 가지 유형의 대기에 대한 자세한 내용은 이 문서에서 설명합니다.

Selenium 웹 드라이버의 암시적 대기

느린 인터넷 또는 웹 사이트의 느린 응답으로 인해 모든 결과를 얻기 위해 몇 초 동안 기다려야 하는 상황이 있을 수 있습니다. 이 경우 암시적 대기가 가장 잘 작동합니다.

암시적 대기는 웹 드라이버가 요소를 가져올 때 모든 요소를 사용할 수 있도록 요소를 찾는 동안 특정 시간 동안 DOM을 폴링하도록 웹 드라이버에 지시합니다. 프로세스의 기본 설정은 0입니다.

암시적 대기를 설정하면 웹 드라이버 개체의 수명 동안이 됩니다.

닫거나 다시 시작하고 대기 값을 변경하지 않고 동일한 웹 드라이버를 실행하는 한 동일한 양입니다.

웹사이트로 이동하여 10초 동안 기다린 후 아래와 같이 About Us 페이지 링크를 클릭하는 예를 살펴보겠습니다.

예제 코드:

# python
from selenium import webdriver

ChromeDriver = webdriver.Chrome()

ChromeDriver.implicitly_wait(10)

ChromeDriver.get("https://www.inventicosolutions.com/")

getElemByLink = ChromeDriver.find_element_by_link_text("About Us")

getElemByLink.click()

출력:

Python의 Selenium 웹 드라이버 대기 예

위의 예에서 볼 수 있듯이 페이지를 로드한 후 정확히 10초 동안 대기한 후 About Us 페이지로 이동합니다.

Selenium 웹 드라이버의 명시적 대기

명시적 대기는 특정 조건이 발생할 때까지 기다렸다가 코드에서 더 진행하도록 정의된 코드 유형입니다. 명시적 대기의 극단적인 경우는 time.sleep()입니다.

이렇게 하면 대기 조건이 정확한 시간으로 설정됩니다.

일부 적절한 방법은 명시적인 코드를 작성하는 데 도움이 됩니다. 명시적 대기는 웹 드라이버 대기 클래스를 사용하여 달성되며 expected_conditions와 결합됩니다.

아래와 같이 암시적 대기 대신 명시적 대기를 사용하는 예를 살펴보겠습니다.

예제 코드:

# python
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ExpectedCond

chromeDriver = webdriver.Chrome()

chromeDriver.get("https://inventicosolutions.com")

getElembyLinkText = WebDriverWait(chromeDriver, 10).until(
    ExpectedCond.presence_of_element_located((By.LINK_TEXT, "About Us"))
)

getElembyLinkText.click()

출력:

Python의 Selenium 웹 드라이버 명시적 대기 예

위에서 작성한 코드의 타임아웃 값은 10초입니다. 웹 드라이버는 Timeout Exception을 발생시키기 전에 10초 동안 대기합니다.

응용 프로그램의 웹 페이지 주소(URL) 및 텍스트 요소는 요구 사항에 따라 지정된 코드로 작성할 수 있습니다.

웹 드라이버 대기(명시적 대기에 사용되는 도구 중 하나)에는 텍스트가 성공적으로 발견될 때까지 500밀리초마다 예상 조건을 확인하는 기본 제공 품질이 있습니다.

Python에서 대기에 대한 예상 조건

이러한 조건은 웹 브라우저를 자동화할 때 가장 자주 사용되며 웹 드라이버에 미리 정의되어 있습니다. 이러한 조건에는 다음이 포함됩니다.

  • title_is
  • title_contains
  • presence_of_element_located
  • visibility_of_element_located
  • visibility_of
  • presence_of_all_elements_located
  • text_to_be_present_in_element
  • text_to_be_present_in_element_value
  • frame_to_be_available_and_switch_to_it
  • invisibility_of_element_located
  • element_to_be_clickable
  • staleness_of
  • element_to_be_selected
  • element_located_to_be_selected
  • element_selection_state_to_be
  • element_located_selection_state_to_be
  • alert_is_present

다음 라이브러리를 가져와 코드에 이러한 예상 조건을 포함할 수 있습니다.

# python
from selenium.webdriver.support import expected_conditions as ExpectedCond

Python의 사용자 지정 대기 조건

위의 방법 중 어느 것도 사용자의 요구 사항을 충족하지 않는 경우 사용자 지정 대기 조건을 만들 수 있습니다. 사용자 지정 조건은 call() 메서드가 있는 클래스를 사용하여 생성됩니다.

아래와 같이 사용자 지정 조건을 만들고 프로그램을 몇 초 동안 기다리게 하는 예제를 살펴보겠습니다.

예제 코드:

# python
class ElementWithClass(object):
    def __init__(self, location, className):
        self.location = location

        self.className = className

    def __call__(self, ChromeDriver):
        findElem = ChromeDriver.find_element(*self.location)

        if self.className in findElem.get_attribute("class"):
            return findElem
        else:
            return False

        wait = WebDriverWait(ChromeDriver, 10)
        findElem = wait.until(element_has_css_class((By.ID, "myId"), "myClass"))

이 코드는 요소가 발견되면 사용자에게 true를 제공하고 그렇지 않으면 false를 반환합니다.

그래서 우리는 몇 가지 예와 함께 Python에서 대기를 추가하는 다양한 방법에 대해 논의했습니다. 이 주제를 즐기고 여기에서 무언가를 배웠기를 바랍니다.

Rana Hasnain Khan avatar Rana Hasnain Khan avatar

Rana is a computer science graduate passionate about helping people to build and diagnose scalable web application problems and problems developers face across the full-stack.

LinkedIn

관련 문장 - Python Selenium