Programming

[python] Selenium 웹스크래핑- 웹페이지 객체 찾는 방법 정리 - find_element 와ExpectedConditions

IT오이시이 2023. 5. 2. 14:36
728x90

[python] Selenium 웹스크래핑- 웹페이지 객체 찾는 방법 정리
            - find_element 와ExpectedConditions -

 

Selenium은 웹 애플리케이션 테스트 자동화 도구입니다. 
Selenium은 테스트를 자동화하는 데 매우 유용하며, 웹 애플리케이션 개발자, QA 엔지니어, 소프트웨어 테스트 엔지니어 등에게 많이 사용됩니다. Selenium을 사용하면 반복적이고 시간이 많이 소요되는 테스트를 자동화하여 작업 시간과 노력을 절약할 수 있습니다.
웹 애플리케이션을 테스트하고 검증하는 데  Selenium WebDriver라는 API를 사용하여 브라우저를 제어하고, 테스트를 자동화할 수 있습니다.

 

[python] Selenium 웹스크래핑 - 웹페이지 자동화 테스트
- 웹페이지 객체 찾는 방법 정리 - https://couplewith.tistory.com/427
- 웹페이지 링크 찾고 이동하기 -  https://couplewith.tistory.com/428 
- 웹페이지 크롤링- 제목과 내용 수집하기 -  https://couplewith.tistory.com/424

 

 

[주요 목차]

1. Selenium의 find_element()로 웹페이지의 객체를 찾는 방법
2. ExpectedConditions클래스을 이용한 동적 웹페이지 객체 찾는 방법
3.  ExpectedConditions클래스 다양한 방법

 

 

1. Selenium의 find_element()로 웹페이지의 객체를 찾는 방법

웹페이지의 Html element 객체를 찾는 방법은 두가지 방법이 있습니다. find_elements_by_*()  와  find_element(BY.* ) 형 함수를 사용 합니다.  최신 버전에서는 "driver.find_element(By.*, "search_name") 을 권장합니다.

driver.find_elements_by_id("element_id")  # deprecated 
driver.find_element(By.ID, 'element_id')

 

from selenium.webdriver.common.by import By

driver.find_element(By.ID, "id")
driver.find_elements(By.ID, 'loginForm')

driver.find_element(By.CLASS_NAME, "class name")
driver.find_element(By.CLASS_NAME, 'content')

driver.find_element(By.CSS_SELECTOR, "css selector")
driver.find_element(By.CSS_SELECTOR, 'p.content')

driver.find_element(By.NAME, "name")
driver.find_element(By.NAME, 'btn_ok')

driver.find_element(By.XPATH, "xpath")
driver.find_element(By.XPATH, '//button[text()="Some text"]')
driver.find_element(By.XPATH, '//button')

driver.find_element(By.LINK_TEXT, "link text")
driver.find_element(By.PARTIAL_LINK_TEXT, "partial link text")
driver.find_element(By.LINK_TEXT, 'Continue')
driver.find_element(By.PARTIAL_LINK_TEXT, 'Conti')

driver.find_element(By.TAG_NAME, "tag name")
driver.find_element(By.TAG_NAME, 'h1')

 

■  find_element()를 이용한 예시  는 다음과 같습니다.

(1) 웹링크 텍스트의  전체 문자열이 일치하는 경우 찾기 – By.linkText()

# 링크 텍스트로 요소 찾기
link_element = driver.find_element_by_link_text("여기를 클릭하세요")


(2) 웹링크 텍스트의 문자열이 부분적으로 일치하는 경우 찾기 – By.partialLinkText()

link_element = driver.find_element_by_partial_link_text("여기").click()

 

2.   ExpectedConditions클래스을 이용한 동적 웹페이지 객체 찾는 방법

웹페이가 비동기 방식으로 페이지가 늦게 로딩되거나,  특정 조건에 따라 페이지가 내용이 달라 지는 경우에 웹 페이지 객체를 찾는 방법입니다.

이런 경우에는 웹페이지의 내용이 조건에 따라 객체가 있을 수도 있고 없을수도 있는 상황이므로  앞에서 언급된 find_element로는 찾기가 어렵습니다. 예를 들어 페이지의 링크를 찾는데 방문하지 않은 링크를 찾거나, 게시글의 좋아요 버튼을 누르지 않은 경우를 찾는 경우 ExpectedConditions 와 같은 특정 조건을 이용하여 구현하는 방법을 소개 합니다.

Selenium은 다음과 같이 동적 웹페이지 요소의 식별자(identifier)가 있을지 없을지 모르는 경우를 위해서 ExpectedConditions 방법을 제공합니다.

다음의 예시는 find_element와 ExpectedConditions 를 이용한 방법을 비교한 것입니다.
우선 ExpectedConditions 을 이용하는 경우 
WebDriverWait 객체를 생성하고, until 메서드를 사용하여 조건이 충족될 때까지 대기합니다. 이 때 사용하는 조건은 ExpectedConditions 클래스(EC.*)의 메서드를 사용하여 정의하고, By 클래스를 사용하여 요소를 찾습니다. 이를 통해 Selenium을 사용하여 다양한 조건을 검사하고, 자동화된 웹 애플리케이션 테스트를 수행할 수 있습니다.

find_element 와  ExpectedConditions클래스 비교

1.  CSS selector로 찾기 
   find_element(By.CSS_SELECTOR, "css selector ")

   WebDriverWait(driver, 5).until( EC.visibility_of_element_located((By.CSS_SELECTOR, 'div.uoc-icon')))

2. Class  Name 으로 찾기
  find_element(By.CLASS_NAME, "class name")
  WebDriverWait(driver, 5).until( EC.visibility_of_element_located((By.CLASS_NAME, 'my-div')) )

3. Link Text 로 찾기
   find_element(By.PARTIAL_LINK_TEXT, "partial_link_text_value")

   WebDriverWait(driver, 5).until( EC.visibility_of_element_located((By.LINK_TEXT, 'click here')) )
   WebDriverWait(driver, 5).until( EC.visibility_of_element_located((By.PARTIAL_LINK_TEXT, 'click here')) )

 -  WebDriverWait (driver, 5) : 페이지내의 컨텐츠가 브라우저에 로딩될때 까지 5초 정도 대기 한다. 

 - EC.visibility_of_element_located : Selenium의 Expected Conditions(예상 조건) 중 하나로, 특정 요소가 화면에 보이는(visible) 상태가 되기를 기다리는 조건을 설정합니다.

 

3.   ExpectedConditions클래스 다양한 방법

ExpectedConditions 클래스는 Selenium WebDriver에서 지원하는 다양한 조건을 포함하고 있습니다. 예를 들어, visibility_of_element_located 메서드는 요소가 화면에 표시될 때까지 대기하고, text_to_be_present_in_element 메서드는 특정 텍스트가 요소에 나타날 때까지 대기합니다. 이외에  title_is, title_contains, element_to_be_clickable, invisibility_of_element_located 등 다양한 조건을 제공합니다.

 

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://www.example.com")

# 10초간 대기하면서 title이 "Example Domain"이 되는지 확인합니다.
wait = WebDriverWait(driver, 10)
title_is_example = EC.title_is("Example Domain")
wait.until(title_is_example)

# "More information..." 링크가 나타날 때까지 대기합니다.
link_locator = (By.LINK_TEXT, "More information...")
link_is_present = EC.presence_of_element_located(link_locator)
wait.until(link_is_present)

# "More information..." 링크를 클릭합니다.
link = driver.find_element(*link_locator)
link.click()

 

WebDriverWait 객체를 생성하고, until 메서드를 사용하여 조건이 충족될 때까지 대기합니다. 이 때 사용하는 조건은 ExpectedConditions 클래스의 메서드를 사용하여 정의하고, By 클래스를 사용하여 요소를 찾습니다. 이를 통해 Selenium을 사용하여 다양한 조건을 검사하고, 자동화된 웹 애플리케이션 테스트를 수행할 수 있습니다.

728x90
반응형