파이썬 셀레니움 새창 제어 - paisseon sellenium saechang jeeo

ChromeDriver는 Selenium WebDriver가 Chrome과 상호 작용하는 데 사용하는 또 다른 실행 파일입니다. Chrome 웹 브라우저에서 작업을 자동화하려면 ChromeDriver도 설치해야 합니다.

Chrome 브라우저 버전에 따라 호환되는 드라이버를 선택해야 합니다. 다음은 Chrome 드라이버를 설치하고 구성하는 단계입니다.

  1. 이 링크를 클릭하세요. Chrome 브라우저의 버전과 운영 체제 유형에 따라 Chrome 드라이버를 다운로드합니다.
  2. Chrome 브라우저의 버전을 확인하려면 Chrome 오른쪽 상단 모서리에 있는 세 개의 점을 클릭하고 도움말을 클릭한 다음 Google Chrome 정보를 선택합니다. 정보 섹션에서 Chrome 버전을 확인할 수 있습니다.
  3. zip 파일의 압축을 풀고 Chrome 드라이버를 실행합니다.

다음 코드에서 WebDriver 인스턴스를 만들고 Chrome 드라이버의 경로를 지정했습니다. 그런 다음 드라이버 인스턴스와 함께 get() 메서드를 사용하여 대상 웹 사이트의 URL을 설정했습니다.

셀레니움을 이용해서 웹브라우저 자동화를 만들때에 예상치 못합 팝업창이 떠서 내가 생각한 자동화 로직이 깨질때가 있습니다. 이럴 때는 팝업창을 감지해서 팝업창을 닫아줘야 합니다. 요즘은 팝업창이 자주 발생하지는 않지만

 

새로운 팝업창 감지는 WebDriverWaitexpected_conditions를 통해서 알 수 있습니다. 해당 기능을 통해서 페이지의 로딩, 경고창 등 역시 감지 할 수 있습니다.

 

먼저 새로운 팝업을 알아내려면 이전까지의 브라우저 handles을 알아야 합니다. 팝업이란 것 역시 새로운 창 handle이기 때문입니다.

 

browser = webdriver.Chrome(ChromeDriverManager().install())
tabs = browser.window_handles

이렇게 하면 현재 열려있는 브라우저의 탭을 가져올 수 있습니다. tabs는 리스트이며, 현재 탭이 2개라면 2개의 핸들이 들어있게 됩니다.

파이썬 셀레니움 새창 제어 - paisseon sellenium saechang jeeo
파이썬 셀레니움 새창 제어 - paisseon sellenium saechang jeeo

이렇게 탭이 2개 일 경우 코드를 실행하면 리스트로 된 탭 값을 얻을 수 있습니다.

#이전 까지의 핸들리스트를 넣어준다. 따로 저장을 해두던지 지정한 코드 전에 현재 핸들로 체크한다.
window_handles = browser.window_handles

# ...자동화 코드 실행...

# 팝업이 있는지 체크
new_popup = WebDriverWait(browser, 2).until(EC.new_window_is_opened(window_handles))

새로운 팝업, 탭이 오픈이 된 것은 expected_conditions을 통해서 알 수 있다고 했습니다. 조건은 new_window_is_opened입니다. 여기에는 이전 핸들리스트를 넣어주면됩니다. 저는 카페 가입을 하고나서 가입 인사 팝업이 발생하여서 해당 코드를 추가했습니다. 최초에 설정한 핸들 리스트를 저장해두고 코드 실행 후 팝업 체크때 사용했습니다.

current_handle = browser.current_window_handle;
browser.switch_to.window('새로운 팝업 핸들')
browser.close()
browser.switch_to.window(current_handle)

current_window_handle로 현재 브라우저 핸들을 저장해 두고 팝업의 핸들을 찾아서 전환한 다음

#이전 까지의 핸들리스트를 넣어준다. 따로 저장을 해두던지 지정한 코드 전에 현재 핸들로 체크한다.
window_handles = browser.window_handles

# ...자동화 코드 실행...

# 팝업이 있는지 체크
new_popup = WebDriverWait(browser, 2).until(EC.new_window_is_opened(window_handles))
0를 실행하여서 종료시킵니다. 그리고 나서 저장해둔 현재 핸들로 전환 후 원하는 코드를 실행 하면 됩니다.

파이썬 셀레니움(selenium) webdriver로 웹브라우저 자동화 프로그램을 만들다보면 새탭을 열고 작업을 할때가 있습니다.
이 강의에서는 execute_script를 사용해서 자바스크립트를 입력하여 새탭을 열고, 전환해서 작업하고, 닫는 방법을 배울 수 있습니다.

유튜브 김플 스튜디오에 방문하시면 더 많은 파이썬 강의를 보실수 있습니다.


# 소스코드 - 자세한 사용법은 유튜브 영상을 참조하세요.
# 영상 제작 날짜 기준의 코드입니다. 이후 사이트 구조가 달라지거나 기타 이유로 작동하지 않을 수 있습니다.

from selenium import webdriver
import time

driver = webdriver.Chrome()

driver.get('https://google.com')
time.sleep(1)

driver.execute_script('window.open("https://naver.com");')
time.sleep(1)

driver.switch_to_window(driver.window_handles[0])
time.sleep(1)

driver.close()

print(driver.window_handles)



JCR 홈페이지에서 로그인을 한 뒤에 검색을 하면 새로운 탭이 켜지고 새로운 탭에 검색결과가 나타났다. 그래서 셀레니움을 통해활성 탭을 변경하고 검색 내용을 수집할 수 있는 방법을 검색하여 찾아 보았다. 이전 포스팅에 이어서 수행 결과를 정리하였다.

1. 검색 자동화
파이썬 셀레니움 새창 제어 - paisseon sellenium saechang jeeo


먼저 위의 이미지와 같은 검색 창에서 검색 할 수 있도록 프로그램을 작성한다.

  1. 검색창에 검색 어 입력
  2. 검색어 입력시 하단에 나오는 버튼 클릭

이전 코드에 이어서(로그인 버튼 누르기 다음) 아래에 추가한 코드는 다음과 같다.

# 키워드 검색
input = 'Peer-to-Peer Networking and Applications'

# 검색창에 키워드 입력후 검색
search = driver.find_element_by_name('search-inputEl')
search.send_keys(input)

# 검색창 하단에 표시되는 버튼 클릭
driver.find_element_by_xpath('//*[@id="boundlist-1029-listEl"]/ul/li').click()
time.sleep(5) # 로딩 기다리기



2. 활성 탭 전환하기

위의 코드를 이용하여 검색창에 검색어를 입력하여 검색은 가능하다. 검색 결과가 새창에 나타나므로 새로 활성화 된 창으로 화면을 변경하여야 한다. 아래의 코드를 추가함 으로써 탭 전환이 가능하다.

먼저 아래의 명령어는 탭 목록들을 보여준다. 새로운 탭을 열고 로딩을 기다린뒤 윈도우 목록을 확인해보면 리스트에 두개의 항목이 들어있는 것을 볼 수 있다.

print(driver.window_handles)
  • 결과 : [‘CDwindow-5869F32E71D5DF1303F64200A76D021F’, ‘CDwindow-19FEAEAE68751A47C2CD0D9008B6BF4E’]

새롭게 열린 탭으로 변경하는 코드는 아래의 코드를 추가하면 된다.

# 최근 열린 탭으로 전환
driver.switch_to.window(driver.window_handles[-1])

# 로딩 기다리기
time.sleep(5)



만약에 새로 옮긴 탭을 닫고 다시 원래 창으로 돌아가고 싶다면 아래의 코드를 입력하면 된다.

# 현재 탭 닫기
driver.close()

# 맨 처음 탭으로 변경(0번 탭)
driver.switch_to.window(driver.window_handles[0])

# 로딩 기다리기
time.sleep(5)



수정한 전체 코드는 아래와 같다.

from selenium import webdriver

options = webdriver.ChromeOptions()

# headless 옵션 설정
options.add_argument('headless')
options.add_argument("no-sandbox")

# 브라우저 윈도우 사이즈
options.add_argument('window-size=1920x1080')

# 사람처럼 보이게 하는 옵션들
options.add_argument("disable-gpu")   # 가속 사용 x
options.add_argument("lang=ko_KR")    # 가짜 플러그인 탑재
options.add_argument('user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36')  # user-agent 이름 설정

# 드라이버 위치 경로 입력
driver = webdriver.Chrome('./chromedriver.exe', chrome_options=options)

# url을 이용하여 브라우저로 접속
driver.get('https://error.incites.thomsonreuters.com/error/Error?DestApp=IC2JCR&Error=IPError&Params=DestApp%3DIC2JCR&RouterURL=https%3A%2F%2Flogin.incites.thomsonreuters.com%2F&Domain=.thomsonreuters.com&Src=IP&Alias=IC2')

driver.implicitly_wait(3)

# 아이디/비밀번호를 입력해준다.
driver.find_element_by_name('username').send_keys('아이디 입력')
driver.find_element_by_name('password').send_keys('비밀번호 입력')

# stay signed in 체크박스 채우기(클릭)
driver.find_element_by_name('rememberme').click()

# 로그인 버튼을 누르기
driver.find_element_by_xpath('/html/body/div/div[1]/div[3]/div[1]/div/div/div/form/button').click()
# 키워드 검색
input = 'Peer-to-Peer Networking and Applications'

# 검색창에 키워드 입력후 검색 버튼 클릭
search = driver.find_element_by_name('search-inputEl')
search.send_keys(input)

driver.find_element_by_xpath('//*[@id="boundlist-1029-listEl"]/ul/li').click()
time.sleep(5)

print(driver.window_handles)

# 새로 열린 탭으로 활성 탭 변경
driver.switch_to.window(driver.window_handles[-1])
time.sleep(5)

# 로그인 된 화면 캡처
driver.get_screenshot_as_file('capture.png')

driver.quit()




reference
  • https://kiddwannabe.blog.me/221288079822