ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • selenium v4.0 (python)
    python 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

    -

Designed by Tistory.