python 공부/매크로 만들기

[파이썬 매크로 만들기] #07. Selenium으로 홈페이지 관련 매크로 만들기

피치피치어피치♥ 2021. 8. 9. 22:38

<초보코딩님 유투브로 공부하며 정리하였습니다>

 

0. 크롬 드라이버 설치 

    • 구글에서 "크롬 드라이버 설치" 검색 후, 
    • 내 크롬과 같은 버전으로 다운로드 하기
      • 내 크롬 버전은 크롬 오른쪽 위 점 세개 버튼을 누른 후 
      • 설정 -> 크롬 정보를 누르면 확인할 수 있다  

    • 현재 내 크롬 버전은 92.xxx 버전임 

    •  

 

    •  

 window 버전 다운로드 후,

압축 풀면 

chromedriver.exe 실행 파일이 있음 

 

이 exe 파일을 편한 위치 (ex: D:\temp)에 옮기기

 

 

1. selenium 설치

pip install selenium

 

2. 셀레늄에서 webdriver 모듈 import 후 
제어하기 위한 크롬창을 만들기 위해

크롬 드라이버 가져오기 

from selenium import webdriver
driver = webdriver.Chrome("D:/temp/chromedriver.exe")

 

이렇게 하면 크롬 창이 하나 뜨고

Chrome이 자동화된 테스트 소프트웨어에 의해 제어되고 있습니다. 라는 메시지가 보인다 ! 

 

3. 초보코딩님은 마스크알리미 사이트로 예제를 수행하셨는데, 

마스크 알리미 홈페이지 이제 없어졌.......

 

그래서 나는 네이버 지도로 예제를 수행했다!

 

접속할 url 입력 해주기

url = 'https://m.map.naver.com/'
driver.get(url)

 

4. 셀레늄은 pyautogui 보다 

각각을 요소로 잡을 수 있어서 매우 편리하다! 

F12를 누르면 이 홈페이지가 어떤 요소로 이루어져 있는지가 다 나옴!

 

출처 : 초보코딩님 유투브 <https://www.youtube.com/watch?v=_gkhgS33QIc&t=0s>

 

5. F12를 통해 원하는 태그를 가리킬 수 있음

 

  1) 네이버 지도에 들어간 후에,

  2) 입력란을 클릭해서

  3) 강남역을 치고 

  4) 돋보기 버튼 클릭하는 게 목표!

 

  • 장소, 주소 검색의 요소 가져오기 
    <div class="Nsearch _searchKeywordView _searchGuide" style="">
    		<div class="Nsearch_inner">
    			<div class="Nsearch_box">
    				<div class="Nsearch_box_inner">
    					<span class="Nbox_text _textPanel">
    						<input type="text" value="" placeholder="장소, 주소 검색" title="검색어 입력" class="Nbox_input_text _keyword" autocomplete="off">
    					</span>
    					<span class="Nbox_tool">
    						<button type="button" class="Nbox_button Nbox_delete _clear" style="display:none;"><span class="Nicon_delete">검색어 삭제</span></button>
    						<button type="submit" class="Nbox_button Nbox_search _search"><span class="Nicon_submit">검색</span></button>
    					</span>
    				</div>
    			</div>
    		</div>
    	</div>​
  • //태그[@속성="속성값"] 로 태그를 가져오고 
  • 이 문자열을 이용해서, 요소를 잡기 위해서는 driver.find_element_by_xpath를 사용
    • 오류 안나면 element를 잘 잡은 거!
    • 오류 없이 끝나면, 이 요소를 잘 잡았다는 의미임
xpath = '//span[@class="Nbox_text _textPanel"]'
text_panel = driver.find_element_by_xpath(xpath)
text_panel.click()

 

  • 강남역 입력하기 
    xpath2 = "//input[@class='Nbox_input_text _search_input']"
    input_window = driver.find_element_by_xpath(xpath2)
    input_window.send_keys("강남역")​

 

  • 검색 버튼 클릭
    • 검색 버튼의 element 찾기 
      <span class="Nbox_tool">
      	<button type="button" class="Nbox_button Nbox_delete _clear" data-nclicks="scw.kwdx" style="display: inline-block;">
          <span class="Nicon_delete">검색어 삭제</span></button>
      	<button type="submit" class="Nbox_button Nbox_search _search">
          <span class="Nicon_submit">검색</span></button>
      </span>
    • 검색어 삭제 버튼의 element는 잘 잡히는데, 
      검색 버튼의 element는 안 잡힘 
    • find_elements_by_xpath로 검색해보니,
      span 태그의 class 속성을 가진 element가 두개임 
    • 인덱스로 접근하는 방법이, print는 가능한데 driver.find_element_by_xpath로는 click이 안되길래 
    • 결국 검색 버튼의 element를 찾을 수가 없어서,
      강남역 하고 enter 치는 걸로 대체함 
      xpath2 = "//input[@class='Nbox_input_text _search_input']"
      input_window = driver.find_element_by_xpath(xpath2)
      input_window.send_keys("강남역\n")​



Full code

from selenium import webdriver

driver = webdriver.Chrome('D:\chromeDriver\chromedriver.exe')

url = 'https://m.map.naver.com/'
driver.get(url)

xpath = '//span[@class="Nbox_text _textPanel"]'
text_panel = driver.find_element_by_xpath(xpath)
text_panel.click()

xpath2 = "//input[@class='Nbox_input_text _search_input']"
input_window = driver.find_element_by_xpath(xpath2)
#input_window.send_keys("강남역\n")
input_window.send_keys("강남역")

xpath3 = "/html/body/div[4]/div[1]/div[1]/form/div/div[2]/div/span[2]/button[2]"
click_btn = driver.find_element_by_xpath(xpath3)
click_btn.click()

trouble shooting

1. 제대로 했는데, 클릭이 안될 경우 

A. 배율이 100%로 제대로 되어있는지 확인하기

 

2. 제대로 썼는데, 요소를 못잡는 경우

A1. 일단은 오타가 혹시 없는지 확인하기

A2. 요소의 이름이 독립적인지 확인하기 

find_elements_by_xpath를 썼을 때에 여러개가 나올 수 있음

xpath = '//button[@class="closeBtn"]'
driver.find_elements_by_xpath

그래서 속성, 속성값이 여러개 있을 경우,

만약 태그에 id라는 속성이 있으면 가능한 id를 잡아서 하는 걸 추천!

 

id 속성 값에 어떤 값을 넣게되면 

다른 태그에서 똑같은 속성 값을 사용할 수 없게 되기 때문에,

id로 정한 이름은 독립적임. (input 요소를 잡기 편해짐)

 

A3. 오른쪽 단추 누르고 -> copy -> full Xpath를 누르면 
/html/body/div[4]/div[1]/div[1]/form/div/div[2]/div/span[2]/button[2] 이런 xpath가 나오고, 

find_elements_by_xpath로 했을 때에 독립적인 하나의 element인 것처럼 나옴

 

하나만 나오는 게 확인되면 

new_xpath = "/html/body/div[4]/div[1]/div[1]/form/div/div[2]/div/span[2]/button[2]"
click_btn = driver.find_element_by_xpath(new_xpath)
click_btn.click()

클릭까지 확인할 수 있다 !!

 

3. 실행이 잘 안될 경우 

A. 각 라인 사이사이에 time delay 주기