[Python] Web 브라우저(크롬) 다루기

Posted by Albert 855Day 7Hour 8Min 27Sec ago [2023-03-06]

1.크롬브라우저 기본조작

from selenium import webdriver

'browser = webdriver.Chrome('./chromedriver.exe')
browser = webdriver.Chrome()

' 네이버 이동
browser.get('http://naver.com')

' 카페 메뉴 찾기
elem = browser.find_element_by_link_text('카페')

' 속성 가져오기
elem.get_attribute('href')
elem.get_attribute('class')

' 클릭
elem.click()

' 뒤로 가기
browser.back()

' 앞으로 가기
browser.forward()

' 새로고침
browser.refresh()

' 뒤로 가기
browser.back()

' 검색창 찾기 (개발자 도구 이용)
elem = browser.find_element_by_id('query')

' 글자 입력하기
elem.send_keys('나도코딩')

' enter 치기
from selenium.webdriver.common.keys import Keys
elem.send_keys(Keys.ENTER)

' a 태그 찾기
elem = browser.find_element_by_tag_name('a')
elem.get_attribute('href')

' a 태그 모두 찾기
elems = browser.find_elements_by_tag_name('a')
for e in elems:
e.get_attribute('href')

' 다음으로 이동
browser.get('http://daum.net')

' 검색창 찾기
elem = browser.find_element_by_name('q')

' 글자 입력하기
elem.send_keys("나도코딩")

' 글자 지우기
elem.clear()

' 글자 입력하기
elem.send_keys("나도코딩")

' 검색 버튼 찾기
elem = browser.find_element_by_xpath('//*[@id="daumSearch"]/fieldset/div/div/button[2]')

' 클릭하기
elem.click()

' 스크린샷 찍기
browser.save_screenshot('daum.png')

' 페이지 소스 보기
browser.page_source

' 브라우저 종료
browser.close() ' 현재 탭 닫기
browser.quit() ' 브라우저 종료하기

' 참고 URL : https://selenium-python.readthedocs.io/


2. iframe 변경

import time
from selenium import webdriver

browser = webdriver.Chrome()

browser.get('https://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_input_type_radio')

browser.switch_to.frame('iframeResult') ' frame 전환

elem = browser.find_element_by_xpath('//*[@id="male"]') ' 성공

elem.click()

browser.switch_to.default_content() ' 상위로 빠져 나옴

elem = browser.find_element_by_xpath('//*[@id="male"]') ' 실패

elem.click()

time.sleep(5) ' 5초 대기

browser.quit()

'//*[@id="male"]


3. Raido 버튼 조작

import time
from selenium import webdriver

browser = webdriver.Chrome()
browser.maximize_window() ' 창 최대화

browser.get('https://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_input_type_radio')

browser.switch_to.frame('iframeResult') ' frame 전환

elem = browser.find_element_by_xpath('//*[@id="male"]')

' 선택이 안되어 있으면 선택하기
if elem.is_selected() == False: ' 라디오 버튼이 선택되어 있지 않으면
print("선택 안되어 있으므로 선택하기")
elem.click()
else: ' 라디오 버튼이 선택되어 있다면
print("선택 되어 있으므로 아무것도 안함")

time.sleep(5) ' 5초 대기

' 선택이 안되어 있으면 선택하기
if elem.is_selected() == False: ' 라디오 버튼이 선택되어 있지 않으면
print("선택 안되어 있으므로 선택하기")
elem.click()
else: ' 라디오 버튼이 선택되어 있다면
print("선택 되어 있으므로 아무것도 안함")

browser.quit()


4. Checkbox 조작

import time
from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
browser.maximize_window()

browser.get('https://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_input_type_checkbox')

browser.switch_to.frame('iframeResult')

'elem = browser.find_element_by_xpath('//*[@id="vehicle1"]')
'elem = browser.find_element(By.XPATH, '//*[@id="vehicle1"]')
elem = browser.find_element(By.ID, 'vehicle1')

time.sleep(5)

if elem.is_selected() == False:
print("선택 안되어 있으므로 선택")
elem.click()
else:
print("선택 되어 있으므로 아무것도 안함")

time.sleep(5)
browser.quit()


5. Selectbox 조작

import time
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_option')

browser.switch_to.frame('iframeResult')

' cars 에 해당하는 element 를 찾고, 드롭다운 내부에 있는 4번째 옵션을 선택
' elem = browser.find_element_by_xpath('//*[@id="cars"]/option[4]')
' option[1] : 첫번째 항목
' option[2] : 두번째 항목
' ...
' elem.click()

time.sleep(5)

' 완전히 일치하는 텍스트 값을 통해서 선택하는 방법
' 옵션 중에서 텍스트가 Audi 인 항목을 선택
' elem = browser.find_element_by_xpath('//*[@id="cars"]/option[text()="Audi"]')
' elem.click()

' 텍스트 값이 부분 일치하는 항목 선택하는 방법
elem = browser.find_element_by_xpath('//*[@id="cars"]/option[contains(text(), "Au")]')
elem.click()

time.sleep(5)

browser.quit()


6. 페이지 스크롤조작

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

browser = webdriver.Chrome()
browser.maximize_window()

browser.get('https://shopping.naver.com/home/p/index.nhn')

' '무선마우스' 입력
elem = browser.find_element_by_xpath('//*[@id="autocompleteWrapper"]/input[1]')
elem.send_keys('무선마우스')

time.sleep(1)

elem.send_keys(Keys.ENTER) ' 검색 버튼 클릭을 위해 Enter 처리

' 스크롤
' 지정한 위치로 스크롤 내리기
' 모니터 (해상도) 높이인 1080 위치로 스크롤 내리기
' browser.execute_script('window.scrollTo(0, 1080)') ' 1920 * 1080 (모니터 해상도)
' browser.execute_script('window.scrollTo(0, 2080)')

' 화면 가장 아래로 스크롤 내리기
' browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')


' 동적 페이지에 대해서 마지막까지 스크롤 반복 수행
interval = 2 ' 2초에 한번씩 스크롤 내리기

' 현재 문서 높이를 가져와서 저장
prev_height = browser.execute_script('return document.body.scrollHeight')

' 반복 수행
while True:
' 스크롤을 화면 가장 아래로 내림
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')

' 페이지 로딩 대기 (2)
time.sleep(interval)

' 현재 문서 높이 가져와서 저장
curr_height = browser.execute_script('return document.body.scrollHeight')
if curr_height == prev_height: ' 직전 높이와 같으면, 높이 변화가 없으면
break ' 반복문 탈출 (모든 스크롤 동작 완료)

prev_height = curr_height

' 맨 위로 올리기
browser.execute_script('window.scrollTo(0, 0)')

time.sleep(5)
browser.quit()


7. 스크롤 및 이동

import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

browser = webdriver.Chrome()
browser.get('https://www.w3schools.com/html/')
browser.maximize_window()

time.sleep(5)

' 특정 영역 스크롤
elem = browser.find_element_by_xpath('//*[@id="leftmenuinnerinner"]/a[61]')

' 방법 1 : ActionChain
' actions = ActionChains(browser)
' actions.move_to_element(elem).perform()

' 방법 2 : 좌표 정보 이용
' xy = elem.location_once_scrolled_into_view ' 함수가 아니니까 () 쓰지 마세요
' print("type : ", type(xy)) ' dict
' print("value : ", xy)

elem.click()

time.sleep(5)
browser.quit()


8. 파일다운로드(다운로드 후 지정된 폴더로 저장)

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_experimental_option('prefs', {'download.default_directory':r'C:\Users\Nadocoding\Desktop\PythonWorkspace'})

browser = webdriver.Chrome(options=chrome_options)
browser.get('https://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_a_download')

browser.switch_to.frame('iframeResult')

' download 링크 클릭
elem = browser.find_element_by_xpath('/html/body/p[2]/a')
elem.click()

time.sleep(5)
browser.quit()


9. Wait (특정 내용이 Loading 될 때까지 기다릴 시 사용)

import time
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

browser = webdriver.Chrome()
browser.maximize_window()
browser.get('https://flight.naver.com/flights/')

' 가는 날 클릭
browser.find_element_by_link_text('가는날 선택').click()
browser.find_elements_by_link_text('30')[0].click()
' 오는 날
browser.find_elements_by_link_text('5')[1].click()

' 제주도 클릭
browser.find_element_by_xpath('//*[@id="recommendationList"]/ul/li[1]').click()

' 항공권 검색 클릭
browser.find_element_by_link_text('항공권 검색').click()

' time.sleep(10)

try:
elem = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="content"]/div[2]/div/div[4]/ul/li[1]')))
print(elem.text)
except:
print("실패했어요")

' 첫 번째 결과 출력
' elem = browser.find_element_by_xpath('//*[@id="content"]/div[2]/div/div[4]/ul/li[1]')
' print(elem.text) ' element 내에 있는 text 부분을 출력

time.sleep(5)
browser.quit()


10. 웹브라우저 탭 조작

import time
from selenium import webdriver

browser = webdriver.Chrome()
browser.maximize_window()

browser.get('https://www.w3schools.com/tags/att_input_type_radio.asp')
curr_handle = browser.current_window_handle
print(curr_handle) ' 현재 윈도우 핸들 정보

' Try it yourself
browser.find_element_by_xpath('//*[@id="main"]/div[2]/a').click()

handles = browser.window_handles ' 모든 핸들 정보
for handle in handles:
print(handle) ' 각 핸들 정보
browser.switch_to.window(handle) ' 각 핸들로 이동해서
print(browser.title) ' 출력해보면 현재 핸들 (브라우저) 의 제목 표시
print()

' 새로 이동된 브라우저에서 뭔가 자동화 작업을 수행..

' 그 브라우저를 종료
print("현재 핸들 닫기")
browser.close()

' 이전 핸들로 돌아오기
print("처음 핸들로 돌아오기")
browser.switch_to.window(curr_handle)

print(browser.title) ' HTML input type="radio"

' 브라우저 컨트롤이 가능한지 확인
time.sleep(5)
browser.get('http://daum.net')

time.sleep(5)
browser.quit()


소스다운로드


원글: https://www.youtube.com/watch?v=exgO1LFl9x8




LIST

Copyright © 2014 visionboy.me All Right Reserved.