"Selenium"의 두 판 사이의 차이

Pywiki
둘러보기로 가기 검색하러 가기
 
(사용자 2명의 중간 판 3개는 보이지 않습니다)
10번째 줄: 10번째 줄:
  
 
* 사용자가 실제로 입력하듯 작동한다. 때문에 상대적으로 느리다.
 
* 사용자가 실제로 입력하듯 작동한다. 때문에 상대적으로 느리다.
 +
* 특정한 명령을 수행할 때 브라우저의 작동을 기다려야 한다. 명령이 너무 빠르기 때문에 기다리는 시간까지 예측해 기입해주어야 한다.
  
 
=== 설치 ===
 
=== 설치 ===
48번째 줄: 49번째 줄:
 
from webdriver_manager.chrome import ChromeDriverManager
 
from webdriver_manager.chrome import ChromeDriverManager
  
browser = webdriver.Chrome(ChromeDriverManager().install())  # 이걸 브라우저로 사용한다.
+
드라이버객체(보통 driver) = webdriver.Chrome(ChromeDriverManager().install())  # 이걸 브라우저로 사용한다.
 
</syntaxhighlight>
 
</syntaxhighlight>
 
|-
 
|-
70번째 줄: 71번째 줄:
 
|기다리기
 
|기다리기
 
|브라우저가 초기화될 때까지 기다린다.(보통 3초? 굳이 안써도 잘 작동하긴 한다.)
 
|브라우저가 초기화될 때까지 기다린다.(보통 3초? 굳이 안써도 잘 작동하긴 한다.)
|browser.implicitly_wait(초)
+
중간중간 쉬어야 할 땐 time모듈을 사용한다.
 +
|드라이버객체.implicitly_wait(초)
 
|-
 
|-
 
|웹페이지 읽기
 
|웹페이지 읽기
|
+
|해당 URL의 창을 연다.
|browser.get(url)
+
|드라이버객체.get(url)
 +
|-
 +
|창 최대화
 +
|창 크기를 최대화 한다.
 +
|드라이버객체.maximize_window()
 
|-
 
|-
 
|종료하기
 
|종료하기
 
|
 
|
|browser.quit()
+
|드라이버객체.quit()
 
|}
 
|}
  
97번째 줄: 103번째 줄:
 
|-
 
|-
 
|css셀렉터로 찾기
 
|css셀렉터로 찾기
|
+
|CSS셀렉터를 이용하여 요소를 찾을 수 있다.
|form = browser.find_element_by_css_selector("input.btn_global[type=submit]")
+
 
 +
'#id명', '.클래스명' 형태로.
 +
|target = browser.find_element_by_css_selector("input.btn_global[type=submit]")
 
|-
 
|-
 
|xpath로 찾기
 
|xpath로 찾기
 
|xpath를 사용하는 게 정말 쉽다.
 
|xpath를 사용하는 게 정말 쉽다.
 
개발자도구에서 해당 요소를 우클릭 한 후 copy>copy XPath 를 선택하면 복사 완료!
 
개발자도구에서 해당 요소를 우클릭 한 후 copy>copy XPath 를 선택하면 복사 완료!
|form = browser.find_element_by_xpath('xpath주소')
+
|target = browser.find_element_by_xpath('xpath주소')
 
|}
 
|}
  
129번째 줄: 137번째 줄:
 
|특수키 입력
 
|특수키 입력
 
|방향키, ALT, COMMAND, F1 등 특수키를 사용하고 싶을 때.
 
|방향키, ALT, COMMAND, F1 등 특수키를 사용하고 싶을 때.
 +
{| class="wikitable"
 +
!특수키
 +
!설명
 +
|-
 +
|엔터
 +
|Keys.ENTER
 +
|}
 
|<syntaxhighlight lang="python">
 
|<syntaxhighlight lang="python">
 
from selenium.Webdriver.common.keys import Keys
 
from selenium.Webdriver.common.keys import Keys
</syntaxhighlight>위 모듈을 불러온 후 ARROW_DOWN, ALT, COMMAND, F1등을 입력한다.
+
</syntaxhighlight>위 모듈을 불러온 후 Keys.ARROW_DOWN, Keys.ALT, Keys.COMMAND, F1등을 입력한다.
 
|-
 
|-
 
|전송
 
|전송
180번째 줄: 195번째 줄:
 
|browser.save_screenshot("경로.png")
 
|browser.save_screenshot("경로.png")
 
|}
 
|}
 +
 +
== 액션체인 ==
 +
특정 활동의 체인을 만든 후 한번에 실행한다.
 +
 +
키보드로 입력하는 것들을 모두 입력할 수 있다.<syntaxhighlight lang="python">
 +
from selenium.webdriver.common.action_chains import ActionChains
 +
 +
action = ActionChains(드라이버객체)  # 드라이버를 액션체인으로 제어한다.
 +
 +
action.send_keys('보낼 키').key_down(Keys.TAB).perform()  # Keys.TAB과 같은 사용은 셀레니움 모듈 안의 키 관련 모듈을 임포트해야 한다.
 +
# 데이터를 보낼 땐 send_keys로, 단순 조작을 하기 위해선 key_down을 사용한다. key_down으로도 입력은 가능하다.
 +
# 마지막에 perform()을 넣어주어 체인을 실행한다.
 +
action.reset_actions()  # 이게 없으면 다음번에 action을 다시 실행할 때 위에 작성한 action도 다시 실행된다.
 +
 +
# 보통 엑션 내용이 길어지면 \ 따위를 넣어 줄나눔을 하든가, 괄호 안에 넣어 한줄처럼 인식되게 한다.
 +
</syntaxhighlight><syntaxhighlight lang="python">
 +
action.pause(초)  # 액션 안에 쉬는 동작을 넣을 수도 있다.
 +
</syntaxhighlight>[동시에 누르기는 어떻게 할까?]<syntaxhighlight lang="python">
 +
target = driver.find_element_by_css_selector('.클래스명')
 +
 +
action.move_to_element(target).click()  # 해당 요소로 이동한다. 그리고 클릭도 가능하다.
 +
</syntaxhighlight>
  
 
= 다양한 사용법 =
 
= 다양한 사용법 =
227번째 줄: 264번째 줄:
 
|}
 
|}
 
(로그인할 때 글자를 쓰게 하거나.. 이것저것 입력할 것을 요구하면... 못한다.)
 
(로그인할 때 글자를 쓰게 하거나.. 이것저것 입력할 것을 요구하면... 못한다.)
 +
 +
= 각종 편의 =
 +
셀레니움은 파이썬 위에서 돌아가는 것이기에, 파이썬이 종료되면 브라우저도 함께 종료되는데, 코드가 종료된 이후에도 브라우저를 사용하고 싶을 때가 있다. 그럴 땐 다음과 같이 옵션을 주면 된다.<syntaxhighlight lang="python">
 +
options = webdriver.ChromeOptions()
 +
options.add_experimental_option('detach', True)
 +
browser = webdriver.Chrome(브라우저경로, options=options)
 +
</syntaxhighlight>
 +
 +
= 에러 =
 +
 +
=== selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable ===
 +
존재하지만, 상호작용 할 수 없을 때. 보통 <code>.click()</code>을 수행했을 때 발생하는데, <code>.send_keys(Keys.ENTER)</code>로 우회할 수 있다. 이것도 안되면 클릭할 수 없는 요소를 클릭한 경우.
 
[[분류:웹 라이브러리]]
 
[[분류:웹 라이브러리]]

2022년 7월 22일 (금) 17:41 기준 최신판

1 개요[편집 | 원본 편집]

셀레니움. 동적 크롤링을 위한 라이브러리. 웹 애플리케이션 테스트 라이브러리다.

1.1 특, 장점[편집 | 원본 편집]

  • 기본적인 웹 스크래핑 도구는 주어진 것을 받아들일 뿐 로그인 해야만 볼 수 있는 정보를 받아올 순 없다. 이런 한계를 극복하기 위해 자주 사용되는 도구.(실제로 웹서핑을 하듯 사용자의 입력을 넣을 수 있다.)

1.2 한계[편집 | 원본 편집]

  • 사용자가 실제로 입력하듯 작동한다. 때문에 상대적으로 느리다.
  • 특정한 명령을 수행할 때 브라우저의 작동을 기다려야 한다. 명령이 너무 빠르기 때문에 기다리는 시간까지 예측해 기입해주어야 한다.

1.3 설치[편집 | 원본 편집]

과정 설명 비고
설치 pip install selenium
웹드라이버 설치
  • 크롬 브라우저에서 chrome://version 을 입력해 버전 확인.
  • https://sites.google.com/a/chromium.org/chromedriver/downloads 에서 해당 버전에 맞는 드라이버 .zip 파일을 받는다.
  • 적절한 곳에 옮겨두고 경로를 기억해둔다.
    from selenium import webdriver
    
    drv = webdriver.Chrome('chromedriver.exe', options=opt)  # 웹드라이버 경로를 지정해준다.
    
매번 웹드라이버를 다운받기 귀찮을 땐, 혹은 이미 브라우저를 사용하고 있을 땐 webdriver-manager를 사용하면 편하다.

1.4 웹 드라이버[편집 | 원본 편집]

기본적으로 설치되어 있어야 작동한다.

드라이버 설명 사용법
Chrome 적절한 웹드라이버를 받기 힘들다면, pip install webdriver-manager를 이용해 사용한다.
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

드라이버객체(보통 driver) = webdriver.Chrome(ChromeDriverManager().install())  # 이걸 브라우저로 사용한다.
PhantumJS JavaScriptCore 사용. 명령줄에서 웹브라우저를 조작한다.
기타(나중에 사용하게 되는 사람들이 사용하면서 정리해줘요~)

Firefox, Ie, Opera, PhantomJS, Remote 등의 웹드라이버사용이 가능하다.

2 사용법[편집 | 원본 편집]

웹드라이버를 browser라는 객체에 할당했을 때의 방법이다.

의도 설명 방법
기다리기 브라우저가 초기화될 때까지 기다린다.(보통 3초? 굳이 안써도 잘 작동하긴 한다.)

중간중간 쉬어야 할 땐 time모듈을 사용한다.

드라이버객체.implicitly_wait(초)
웹페이지 읽기 해당 URL의 창을 연다. 드라이버객체.get(url)
창 최대화 창 크기를 최대화 한다. 드라이버객체.maximize_window()
종료하기 드라이버객체.quit()

2.1 객체 찾기(요소 찾기)[편집 | 원본 편집]

객체를 찾아 해당 내용에 접근할 수 있다.(다양한 방법이 있다. 사용하게 될 때마다 검색해서 사용하고 정리해두자.)

  • 기본적으로 가장 처음의 하나만 찾을 땐 find_element_by_...를 사용하고, 여러 개 추출할 땐 find_elements_by_...를 사용한다.
  • 요소를 찾지 못한다면 NoSuchElementException 에러를 반환한다.
의도 설명 방법
DOM 요소로 찾기(id) id속성으로 요소를 하나 추출한다. target = browser.find_element_by_id('DOM요소')
css셀렉터로 찾기 CSS셀렉터를 이용하여 요소를 찾을 수 있다.

'#id명', '.클래스명' 형태로.

target = browser.find_element_by_css_selector("input.btn_global[type=submit]")
xpath로 찾기 xpath를 사용하는 게 정말 쉽다.

개발자도구에서 해당 요소를 우클릭 한 후 copy>copy XPath 를 선택하면 복사 완료!

target = browser.find_element_by_xpath('xpath주소')

2.2 객체 조작(요소 조작)[편집 | 원본 편집]

키를 선택하거나 입력하는 등의 조작을 하기 위한 기능이다.

아래에서 사용된 target은 위에서 찾은 요소의 객체를 의미한다.

의도 설명 방법
지우기 양식에 처음부터 추가되어 있는 내용을 지운다. target.clear()
클릭 target.click()
키 입력 input 양식 따위에 내용을 입력한다. target.send_keys(입력값)
특수키 입력 방향키, ALT, COMMAND, F1 등 특수키를 사용하고 싶을 때.
특수키 설명
엔터 Keys.ENTER
from selenium.Webdriver.common.keys import Keys
위 모듈을 불러온 후 Keys.ARROW_DOWN, Keys.ALT, Keys.COMMAND, F1등을 입력한다.
전송 form 요소의 버튼같은 객체를 찾은 후 전송. target.submit()

이외 쿠키값을 조작하거나 브라우저의 위치, 크기를 조작하는 등 브라우저로 할 수 있는 대부분의 것들을 할 수 있다.

2.2.1 자바스크립트 사용[편집 | 원본 편집]

셀레니움에서 다양한 기능을 제공하지만, 더 세부적으로 조작하고싶은 경우, 자바스크립트를 사용할 수도 있다.

의도 설명 방법
자바스크립트 사용 JS를 실행한 결과는 객체에 담긴다. 객체 = browser.execute_script("자바스크립트")

2.3 하위속성 접근[편집 | 원본 편집]

의도 설명 방법
id속성에 접근 id속성을 보여준다. target.id
태그이름 요소의 태그 target.tag_name
텍스트에 접근 요소의 내부 글자를 보여준다. target.text

2.4 자주 안쓸 것 같은 기능[편집 | 원본 편집]

의도 설명 방법
스크린샷 브라우저의 화면을 캡처한다.(스크롤바까지 찍힌다.) browser.save_screenshot("경로.png")

3 액션체인[편집 | 원본 편집]

특정 활동의 체인을 만든 후 한번에 실행한다.

키보드로 입력하는 것들을 모두 입력할 수 있다.

from selenium.webdriver.common.action_chains import ActionChains

action = ActionChains(드라이버객체)  # 드라이버를 액션체인으로 제어한다.

action.send_keys('보낼 키').key_down(Keys.TAB).perform()  # Keys.TAB과 같은 사용은 셀레니움 모듈 안의 키 관련 모듈을 임포트해야 한다.
# 데이터를 보낼 땐 send_keys로, 단순 조작을 하기 위해선 key_down을 사용한다. key_down으로도 입력은 가능하다.
# 마지막에 perform()을 넣어주어 체인을 실행한다.
action.reset_actions()  # 이게 없으면 다음번에 action을 다시 실행할 때 위에 작성한 action도 다시 실행된다.

# 보통 엑션 내용이 길어지면 \ 따위를 넣어 줄나눔을 하든가, 괄호 안에 넣어 한줄처럼 인식되게 한다.
action.pause()  # 액션 안에 쉬는 동작을 넣을 수도 있다.

[동시에 누르기는 어떻게 할까?]

target = driver.find_element_by_css_selector('.클래스명')

action.move_to_element(target).click()  # 해당 요소로 이동한다. 그리고 클릭도 가능하다.

4 다양한 사용법[편집 | 원본 편집]

4.1 로그인[편집 | 원본 편집]

네이버에 로그인할 때의 예시.

과정 설명 방법
사전 내용 기입 이것저것 준비하는 단계
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

User = 'id'
User_target = '타겟'  # id를 입력할 DOM요소 등을 지정.
Pass = 'password'
Pass_target = '타겟'  # password를 입력할 DOM요소 등을 지정.
form_target = '타겟'  # id와 password를 입력하고 제출버튼의 위치를 찾을 단서를 지정.
url_login = "http://주소"  # 로그인 페이지 주소.
로그인페이지 접근 selenium 사용을 위한 설정 및 접근
browser = webdriver.Chrome(ChromeDriverManager().install())  # 이걸 브라우저로 사용한다.
browser.implicitly_wait(3)
browser.get(url_login)
각종 내용 입력 후 제출
target = browser.find_element_by_id(User_target)
target.clear()
target.send_keys(User)  # ID에 해당하는 내용 입력
target = browser.find_element_by_id(Pass_target)
target.clear()
target.send_keys(Pass)  # 비밀번호에 해당하는 내용 입력
## 버튼 누르기
form = browser.find_element_by_css_selector(form_target)
form.submit()

(로그인할 때 글자를 쓰게 하거나.. 이것저것 입력할 것을 요구하면... 못한다.)

5 각종 편의[편집 | 원본 편집]

셀레니움은 파이썬 위에서 돌아가는 것이기에, 파이썬이 종료되면 브라우저도 함께 종료되는데, 코드가 종료된 이후에도 브라우저를 사용하고 싶을 때가 있다. 그럴 땐 다음과 같이 옵션을 주면 된다.

options = webdriver.ChromeOptions()
options.add_experimental_option('detach', True)
browser = webdriver.Chrome(브라우저경로, options=options)

6 에러[편집 | 원본 편집]

6.1 selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable[편집 | 원본 편집]

존재하지만, 상호작용 할 수 없을 때. 보통 .click()을 수행했을 때 발생하는데, .send_keys(Keys.ENTER)로 우회할 수 있다. 이것도 안되면 클릭할 수 없는 요소를 클릭한 경우.