IT Log
[Python] Selenium 본문
728x90
반응형
1. Install
Package 설치
linux는 터미널에서, Window는 cmd창에서 실행
# Python2.x
pip install selenium
# Python3.x
pip3 install selenium
Driver 설치
- Firefox : github.com/mozilla/geckodriver/releases
- Chrome : sites.google.com/a/chromium.org/chromedriver/downloads
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
- Selenium 홈페이지 : www.selenium.dev/downloads/
[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
반응형
'Python' 카테고리의 다른 글
[Python] Selenium (Keys) (1) | 2021.06.06 |
---|---|
[Python] Selenium (Action Chains) (0) | 2021.06.06 |
[Python] Slice, concat and Modify String (문자열 자르기, 연결, 수정) (0) | 2021.06.06 |
[Python] Remark (주석) (0) | 2021.06.06 |
[Python] Type Cast (타입 변환) (0) | 2021.06.06 |
Comments