python

selenium v4.0 (python)

blackbearwow 2023. 4. 10. 00:20

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/

https://wikidocs.net/177133

-