[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을 사용하여 다양한 조건을 검사하고, 자동화된 웹 애플리케이션 테스트를 수행할 수 있습니다.
'Programming' 카테고리의 다른 글
[RUST언어] RUST 언어의 시작 (2) - 변수의 범위와 수명 관리 (3) | 2023.05.16 |
---|---|
[RUST언어] RUST 언어의 시작 (2) - 변수의 특성과 선언하기 (3) | 2023.05.16 |
[python] Selenium - 웹페이지 링크로 페이지 이동 - find_element와 ExpectedConditions 응용 (2) | 2023.05.04 |
[RUST언어] RUST 언어의 시작 (1) - RUST언어로 C/C++을 대체 할 수 있을까 ? (0) | 2023.04.29 |
[python] Selenium 웹스크래핑 - 제목과 내용 수집하기 (2) | 2023.04.28 |
[Python] SQLAlchemy: ORM을 이용한 테이블 조회 활용 (5) - 응용 예시 (0) | 2023.04.11 |
[Python] SQLAlchemy : ORM 쿼리 결과 부분 조회 처리 (4) (1) | 2023.04.06 |