IT Log

[Python] Selenium 본문

Python

[Python] Selenium

newly0513 2021. 6. 6. 16:28
728x90
반응형

1. Install

Package 설치

linux는 터미널에서, Window는 cmd창에서 실행

# Python2.x
pip install selenium

# Python3.x
pip3 install selenium

 


Driver 설치

linux는 다운받을 파일에서 우클릭하여, '링크 주소 복사'를 한 뒤 아래와 같이 Download하고, Window는 해당 파일을 클릭하여 Download

# Firefox
wget https://github.com/mozilla/geckodriver/releases/download/v0.29.0/geckodriver-v0.29.0-linux64.tar.gz

# Chrome
wget https://chromedriver.storage.googleapis.com/88.0.4324.96/chromedriver_linux64.zip

 

linux는 아래 명령어로 압축을 해제하고, Window는 압축프로그램을 이용하여 압축해제

# tar 파일인 경우
tar xzvf 파일명

# zip 파일인 경우
unzip 파일명

 

압축을 해제한 파일은 /usr/bin 하위경로로 이동 또는 복사하면 완료


Selenium Server

[2021-02-23 기준] 최신 버전은 'selenium-server-standalone-3.141.59.jar'

linux의 경우 해당 버전에서 우클릭하여 '링크주소 복사'한 뒤 아래 명령어로 Download

wget https://selenium-release.storage.googleapis.com/3.141/selenium-server-standalone-3.141.59.jar

 

linux의 경우 터미널에서 아래 명령을 실행하고, Window는 cmd창에서 실행하고, 실행된 터미널이나 cmd창은 그대로 유지

# Selenium Server 실행
java -jar selenium-server-standalone-3.141.59.jar

2. Start

예시

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

# 드라이버 설정
driver = webdriver.Firefox()

# 해당 URL로 이동
driver.get("http://www.python.org")

# assert는 가정 설정문으로 조건이 True가 아니면 Error 발생
assert "Python" in driver.title

# 'q'라는 요소를 찾아서 elem에 선언
elem = driver.find_element_by_name("q")

# 혹여나 채워질 수 있는 값을 제거
elem.clear()

# pycon이라는 단어를 검색
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)

# page_source에 No results found가 있으면 Error가 발생
assert "No results found." not in driver.page_source

# 브라우저 종료
driver.close()

 

Test

 아래 코드를 test_search.py로 저장 후 실행하여 간단한 Test 진행

import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

class PythonOrgSearch(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Firefox()

    def test_search_in_python_org(self):
        driver = self.driver
        driver.get("http://www.python.org")
        self.assertIn("Python", driver.title)
        elem = driver.find_element_by_name("q")
        elem.send_keys("pycon")
        elem.send_keys(Keys.RETURN)
        assert "No results found." not in driver.page_source


    def tearDown(self):
        self.driver.close()

if __name__ == "__main__":
    unittest.main()

3. 요소 찾기

from selenium.webdriver.common.by import By

driver.find_element(By.XPATH, '//button[text()="Some text"]')
driver.find_elements(By.XPATH, '//button')

# 속성 리스트
ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"

 

 

# id로 찾기
login_form = driver.find_element_by_id('loginForm')

# name으로 찾기
username = driver.find_element_by_name('username')

# xpath로 찾기
login_form = driver.find_element_by_xpath("/html/body/form[1]")
login_form = driver.find_element_by_xpath("//form[1]")
login_form = driver.find_element_by_xpath("//form[@id='loginForm']")
username = driver.find_element_by_xpath("//form[input/@name='username']")
username = driver.find_element_by_xpath("//form[@id='loginForm']/input[1]")
username = driver.find_element_by_xpath("//input[@name='username']")
clear_button = driver.find_element_by_xpath("//input[@name='continue'][@type='button']")
clear_button = driver.find_element_by_xpath("//form[@id='loginForm']/input[4]")

# 텍스트로 찾기
continue_link = driver.find_element_by_link_text('Continue')
continue_link = driver.find_element_by_partial_link_text('Conti')

# Tag name으로 찾기
heading1 = driver.find_element_by_tag_name('h1')

# Class name으로 찾기
content = driver.find_element_by_class_name('content')

# CSS로 찾기
content = driver.find_element_by_css_selector('p.content')

4. 대기

명시적 대기

 특정 조건이 발생할 때까지 대기하도록 정의

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")

# WebDriverWaite(driver, time) 
# ID가 myDynamicElement인 요소를 찾을 때까지 최대 10초 wait
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()

 

암시적 대기

 WebDriver가 즉시 사용할 수 없는 요소를 찾으려고 할 때 일정 시간동안 DOM을 폴링하도록 지시

from selenium import webdriver

driver = webdriver.Firefox()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")

참조

https://selenium-python.readthedocs.io/
728x90
반응형
Comments