안녕하세요. 선생님.
웹 자동화 프로젝트 진행중인데요. 배운데로 각 단계마다 요소들을 찾아 가면서 한땀씩 진행중입니다.
역시 요소를 찾는게 중요한데, 선생님 쭉 요소를 찾는 방법들 요약해서 다시 한번 알려주시면 좋겠습니다. 좀 많이요. 감사합니다.
Selenium에서 페이지 요소를 찾는 데 사용할 수있는 다른 방법에는 다음과 같은 것들이 있습니다.
1 D를 사용하여 찾기
가장 간단한 방법 중 하나는 요소의 ID를 사용하여 찾는 것입니다. ID는 페이지에서 유일한 식별자입니다.
element = driver.find_element_by_id(“element-id”)
2 Class name을 사용하여 찾기
Class name을 사용하여 요소를 찾을 수 있습니다. 그러나 이 경우에는 여러 요소가 동일한 클래스 이름을 가질 수 있으므로이 방법이 가장 신뢰성이 떨어지는 방법입니다.
element = driver.find_element_by_class_name(“class-name”)
3 Name 속성을 사용하여 찾기
Name 속성을 사용하여 요소를 찾을 수 있습니다. 이 방법은 클래스 이름으로 찾는 것과 유사한 방법입니다.
element = driver.find_element_by_name(“element-name”)
4. Tag 이름을 사용하여 찾기
HTML 태그 이름을 사용하여 요소를 찾을 수 있습니다.
element = driver.find_element_by_tag_name(“tag-name”)
5. Link 텍스트 또는 부분 링크 텍스트를 사용하여 찾기
링크의 텍스트 또는 부분 텍스트를 사용하여 요소를 찾을 수 있습니다.
# link 텍스트로 찾기
element = driver.find_element_by_link_text(“link-text”)
# 부분 link 텍스트로 찾기
element = driver.find_element_by_partial_link_text(“partial-link-text”)
6.CSS 선택자를 사용하여 찾기
CSS 선택자를 사용하여 요소를 찾을 수 있습니다. CSS 선택자를 사용하면 여러 속성에 따라 요소를 찾을 수 있습니다.
# ID로 찾기
element = driver.find_element_by_css_selector(“#element-id”)
# 클래스 이름으로 찾기
element = driver.find_element_by_css_selector(“.class-name”)
# 태그 이름으로 찾기
element = driver.find_element_by_css_selector(“tag-name”)
# 다중 조건으로 찾기
element = driver.find_element_by_css_selector(“tag-name.class-name#element-id”)
7.XPath를 사용하여 찾기
XPath는 HTML 문서의 요소를 식별하기 위한 경로 언어입니다. XPath를 사용하여 요소를 찾을 수 있습니다.
# XPath로 찾기
element = driver.find_element_by_xpath(“xpath-expression”)
위의 방법들 중에서 가장 적합한 방법은 페이지의 HTML 구조와 찾으려는 요소의 유형에 따라 다를 수 있습니다. 각 요소에 대한 고유 식별자를 사용하는 것이 가장 좋습니다.
또한 Selenium을 사용하여 자동화를 할 때 다음과 같은 방법을 추가로 사용할 수 있습니다.
- CSS 선택자 및 XPath의 조합 : CSS 선택자와 XPath를 조합하여 더 복잡한 요소를 찾을 수 있습니다.
- Explicit Waits : Selenium에서는 일시적으로 페이지가 로드되기를 기다릴 수 있도록 명시적 대기(explicit wait)를 지원합니다. 이를 사용하면 예를 들어 modal window가 로드되기를 기다릴 수 있습니다.
- Alert 처리 : JavaScript modal window나 alert의 경우 driver.switch_to.alert()를 사용하여 제어할 수 있습니다.
- Iframe 처리 : 페이지 내부에 iframe이 있는 경우 iframe으로 들어가서 요소를 찾아야 합니다. 이를 위해 driver.switch_to.frame() 메서드를 사용할 수 있습니다.
- JavaScript 실행 : JavaScript를 사용하여 페이지 내의 요소를 조작할 수도 있습니다. 이를 위해 driver.execute_script() 메서드를 사용할 수 있습니다.
- Network traffic 모니터링 : Selenium은 네트워크 트래픽을 모니터링할 수 있는 기능을 제공합니다. 이를 사용하여 서버로 전송된 데이터를 확인하거나 API 통신을 자동화할 수 있습니다.
- 이미지 처리 : Selenium은 이미지 처리를 위한 기능도 제공합니다. 이를 사용하여 CAPTCHA나 이미지 검증을 자동화할 수 있습니다.
- 웹소켓, WebSocket 요청을 보내는 경우에 대한 처리 : Selenium에서는 requests 모듈과 같이 WebSocket 요청을 보낼 수 있습니다. 이를 사용하여 채팅 앱이나 실시간 통신 앱을 자동화할 수 있습니다.
- 서버 쪽 전송된 내용 처리 : Selenium은 브라우저에 로드되는 모든 요소를 자동으로 처리하기 때문에 서버 쪽에서 전송된 내용도 자동으로 처리됩니다. 그러나 경우에 따라 서버 쪽에서 전송된 내용을 수동으로 처리해야 하는 경우가 있습니다. 이 경우, Selenium의 execute_script() 메서드를 사용하여 자바스크립트를 실행하고, 브라우저의 동작을 조작할 수 있습니다.
- Ajax Handling: 페이지가 Ajax 요청에 의해 업데이트될 때, Implicit Waits나 Explicit Waits를 사용하여 Ajax 요청이 완료될 때까지 기다릴 수 있습니다.
- Page Factory: Selenium WebDriver에서 Page Factory 패턴을 사용하면 페이지 객체 모델을 구현할 수 있습니다. 이를 통해 코드의 가독성과 유지 보수성이 향상됩니다.
- 동적 웹 요소 처리:
WebDriverWait
와expected_conditions
를 사용하여 웹 페이지의 동적으로 생성되는 요소를 처리할 수 있습니다.
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.XPATH, “//xpath-expression”)))
특히 Server 쪽 전송된 내용을 처리하기 위한 자동화 기법은 다음과 같이 정리 할 수 있습니다.
- 네트워크 요청 로깅:
browsermob-proxy
와 같은 라이브러리를 사용하여 브라우저에서 발생하는 네트워크 요청 로그를 기록하고, 이를 통해 서버에서 전송된 데이터를 추출할 수 있습니다. - API 호출: REST API 또는 SOAP API를 호출하여 서버에서 필요한 데이터를 직접 가져올 수 있습니다.
- 데이터베이스 쿼리: Selenium이 아닌 데이터베이스 쿼리를 사용하여 서버에서 필요한 데이터를 가져올 수도 있습니다. 이 방법은 애플리케이션에서 직접 데이터베이스에 연결하거나, API를 통해 데이터베이스 쿼리를 수행할 수 있습니다.