[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