selenium v4.0 (python)
undetected-chromedriver ↓
undetected-chromedriver는 유저가 headless browser를 사용하는것이 아닌 진짜 chrome을 실행시키는 것처럼 속이는 것이다.
설치
pip install undetected-chromedriver selenium
코드 - webdriver 대신 uc를 import한다.
import undetected_chromedriver as uc
import time
options = uc.ChromeOptions()
options.headless = False
driver = uc.Chrome(options=options)
driver.get('https://abrahamjuliot.github.io/creepjs/')
time.sleep(60)
driver.quit()
위 사이트에 접속했을 때, 0% headless가 뜨면 성공한 것이다.

설치
pip install selenium
pip install webdriver_manager
import
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from webdriver_manager.chrome import ChromeDriverManager
1. 세션 시작하기
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=Service(executable_path=ChromeDriverManager().install()), options=options)
2. 브라우저에 액션 취하기
url 이동
driver.get("https://www.selenium.dev/selenium/web/index.html")
뒤로 가기
driver.back()
앞으로 가기
driver.forward()
새로고침
driver.refresh()
3. 브라우저 정보 요청하기
title 얻기
title = driver.title
현재 url 얻기
url = driver.current_url
4. 기다리는 전략 세우기
암시적 기다림:
글로벌 세팅으로, 기본값은 0이다. element를 찾을 수 없다면 바로 error를 반환하지만, 값이 설정되어있다면 에러를 반환하기 전에 명시된 시간만큼 기다린다. 단위: s
driver.implicitly_wait(2)
분명한 기다림:
구체적인 상태가 true가 될 때까지 기다린다. timeout만큼 상태가 충족되지 않을 경우 timeout error가 발생한다.
revealed = driver.find_element(By.ID, "revealed")
driver.find_element(By.ID, "reveal").click()
wait = WebDriverWait(driver, timeout=2)
wait.until(lambda d : revealed.is_displayed())
excepted_conditions로 분명한 기다림:
WebDriverWait(driver, 10).until(EC.title_is('NAVER'))
메소드들:
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
5. element 찾기
class name으로 찾기
driver.find_element(By.CLASS_NAME, "information")
css selector로 찾기
driver.find_element(By.CSS_SELECTOR, "#fname")
id로 찾기
driver.find_element(By.ID, "lname")
name으로 찾기
driver.find_element(By.NAME, "newsletter")
링크의 텍스트로 찾기
driver.find_element(By.LINK_TEXT, "Selenium Official Page")
링크의 텍스트의 부분으로 찾기
driver.find_element(By.PARTIAL_LINK_TEXT, "Official Page")
xpath로 찾기
driver.find_element(By.XPATH, "//input[@value='f']")
전체 DOM에서 찾기
vegetable = driver.find_element(By.CLASS_NAME, "tomatoes")
DOM의 부분집합에서 찾기
fruits = driver.find_element(By.ID, "fruits")
fruit = fruits.find_element(By.CLASS_NAME,"tomatoes")
찾기 최적화: 부분집합에서 찾기는 명령을 여러번 이행해야 한다. 그치만 css selector나 xpath를 사용해 한번에 원하는 요소를 찾을 수 있다.
fruit = driver.find_element(By.CSS_SELECTOR,"#fruits .tomatoes")
모든 요소 찾기
하나의 요소가 아닌 여러 요소를 찾고싶을 때 사용한다.
plants = driver.find_elements(By.TAG_NAME, "li")
focus된 요소 찾기
focusEle = driver.switch_to.active_element
6. element에서 행동 취하기
클릭하기
driver.find_element(By.NAME, "color_input").click()
키보드 입력 보내기
driver.find_element(By.NAME, "email_input").send_keys("admin@localhost.dev"+Keys.ENTER)
Keys: https://www.w3.org/TR/webdriver/#keyboard-actions
요소의 콘텐트를 클리어
driver.find_element(By.NAME, "email_input").clear()
7. element 정보 요청
화면에 display되었으면 true 아니면 false
is_email_visible = driver.find_element(By.NAME, "email_input").is_displayed()
enable이면 true 아니면 false
value = driver.find_element(By.NAME, 'button_input').is_enabled()
선택되었으면 true 아니면 false
체크박스, 라디오버튼, input 요소 등등에 사용된다.
value = driver.find_element(By.NAME, "checkbox_input").is_selected()
tagName 반환
attr = driver.find_element(By.NAME, "email_input").tag_name
사이즈와 포지션 얻기
res = driver.find_element(By.NAME, "range_input").rect
css값 얻기
cssValue = driver.find_element(By.ID, "namedColor").value_of_css_property('background-color')
텍스트 반환
text = driver.find_element(By.ID, "justanotherlink").text
attribute 데이터 얻기
# Identify the email text box
email_txt = driver.find_element(By.NAME, "email_input")
# Fetch the value property associated with the textbox
value_info = email_txt.get_attribute("value")
# 외부 HTML 얻기
value_info = email_txt.get_attribute("outerHTML")
# 내부 HTML 얻기
value_info = email_txt.get_attribute("innerHTML")
8. 세션 끝내기
driver.quit()
예제
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from webdriver_manager.chrome import ChromeDriverManager
def main():
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=Service(executable_path=ChromeDriverManager().install(), options=options))
try:
driver.get("https://www.naver.com/")
WebDriverWait(driver, 10).until(EC.title_is('NAVER'))
driver.find_element(By.CSS_SELECTOR, '#query').send_keys('black' + Keys.ENTER)
time.sleep(3)
finally:
driver.quit()
main()
해당 코드를 실행하면 네이버에서 black을 검색한 후 종료한다.
참조: https://www.selenium.dev/documentation/webdriver/
-