728x90

Selenium 9

[Selenium] Selenium의 Session을 requests 라이브러리에서 사용하기

회사 업무를 위해 Selenium을 열심히 사용하다가 문득 이런 생각이 들었다. "셀레니움으로 로그인만 하고 해당 인증 정보로 requests 라이브러리를 사용해 HTTP 요청을 할 순 없을까?" 사용자 정보 수정을 하기 위해 메뉴를 타고 들어가는 과정을 셀레니움으로 자동화하는 것보다 로그인만 셀레니움으로 시도하여 해당 인증 정보로 바로 사용자 정보 수정 HTTP 요청을 해버리면 메뉴를 이동하다가 발생하는 오류를 방지하는데 도움이 될 것 같았다. selenium의 세션 정보를 requests에서 사용하는 방법은 생각보다 간단하였다. import requests from selenium import webdriver # # driver 생성 후 페이지 로그인 # cookies = driver.get_coo..

Python 2023.01.05

[Selenium] 현재 설치된 Google Chrome에 맞는 chromedriver 자동으로 가져오기 (feat. webdriver-manager)

Selenium을 사용한 프로젝트를 오랜만에 하다 보면 다음과 같은 에러를 마주치는 일이 생긴다. 컴퓨터에 설치된 Google Chrome의 버전과 chromdriver의 버전이 서로 맞지 않을 때 생기는 에러인데, 서로 버전만 맞춰주면 되지만 프로젝트를 실행할 때마다 chromedriver의 버전을 신경 쓰는 일은 생각보다 귀찮다. 이런 귀찮음을 해결해주기 위해 webdriver-manager라는 모듈이 존재한다. 사용 방법은 굉장히 간단하다. 우선 모듈을 사용하기 위해 pip을 사용하여 webdriver-manager를 설치해 준다. pip install webdriver-manager 그런 뒤 기존에 from selenium import webdriver from selenium.webdriver...

Python 2023.01.02

[Selenium] DeprecationWarning: executable_path has been deprecated, please pass in a Service object 해결하기

셀레니움을 회사에서는 예전에 만들어놓은 패키지들로 설치를 했었기에 몰랐었는데, 이번에 본가 데스크톱에 파이썬과 셀레니움을 설치하고 사용해보니 지원 중단 경고가 뜨고 있었다. executable_path가 지원 중단되었으니, 서비스 객체를 넘기라고 되어있는데 이게 무슨 말인가 싶어 찾아보았다. 찾아보니 2021년 10월 22일에 수정된 Selnium 4.0 Beta 1 변경 로그에 드라이버 인스턴스화 시 Options와 Service 인수를 제외한 인수들을 사용하지 않기로 되어 있다고 한다. 그러니까 기존에는 브라우저에 맞는 드라이버를 다운로드한 뒤, 셀레니움 드라이버 인스턴스화 시 해당 브라우저 드라이버의 경로를 executable_path로 전달해주어야 했는데, 4.0 버전 이후부터는 Service 인..

Python 2023.01.01

[Selenium] Selenium 화면에서 요소가 사라질 때까지 대기하기

다음에 포스팅할 항목을 테스트하기 위해 서울시 전자도서관에 Selenium을 사용하여 로그인하려고 하는데 다음과 같은 에러가 발생하였다. 원인은 서울시 전자도서관에 처음 접속하게 되면 추천 도서 목록을 가져오는 데 걸리는 시간이 길어 해당 목록을 가져올 때까지 로딩바를 표시하게 된다. 로딩바가 표시되는 동안에 요소들을 클릭할 수 없는데, 이때 클릭 이벤트가 발생하여 의도했던 요소가 아닌 다른 요소가 해당 클릭 이벤트를 수신하게 되어 에러가 발생하였다. 에러 로그를 읽어보면 Other element would receive the click: ...라고 되어있다. 즉, 우리는 저 이 사라질 때까지 대기하였다가 로그인 버튼을 클릭하면 되는 것이다. 물론 presence_of_element_located가 아..

Python 2022.12.20

[Selenium] Selenium에서 크롬 확장 프로그램 사용하기 (feat. Google Chrome 설치된 확장 프로그램에서 crx 파일 추출하기)

블로그에 포스팅을 정말 오랜만에 올리는 것 같다. 지금 확인해보니 11월 내내 포스팅을 하나도 올리지 않았었다. 오랜만에 포스팅을 올리는 이유는 여느 때와 같이 회사에서 Python을 이용하여 Selenium을 사용하고 있었는데 (하지만 나는 Java 개발자다) Chrome에 설치된 확장 프로그램이 selenium으로 연 chrome driver에서는 보이지 않는 것이었다. 테스트를 위해 광고 차단 확장 프로그램인 AdGuard를 설치한 Google Chrome을 준비하였다. 광고 차단 확장이 설치된 크롬으로 뉴스 페이지를 들어갔을 때는 광고가 보이지 않는 것을 확인할 수 있는데, 같은 환경에서 Selenium으로 같은 페이지로 들어갔을 때 여기저기 광고가 떠있는 모습을 볼 수 있다. 또한 우측 상단을 ..

Python 2022.12.01

[Selenium] Selenium 창 크기(윈도우 사이즈) 조절하기

라고 하였지만 회사에서 쏠쏠하게 사용하고 있다. 한 번에 2,000개 정도의 스크린샷을 찍어놓도록 하고 있어 Selenium 옵션에 --headless를 주어 Headless 모드로 스크린샷을 저장하고 있는데 driver에 maximize_window()를 해주어도 800x600 사이즈의 크기로 스크린샷이 찍히고 있었다. 작은 사이즈로 스크린샷이 저장되고 있어 일부 사이트에서 잘리는 부분이 나와 창 크기를 조절하기로 하였다. 1. driver option을 이용하여 창 크기(윈도우 사이즈) 조절하기 options = webdriver.ChromeOptions() ... 기타 옵션 options.add_argument('--headless') options.add_argument('window-size={..

Python 2022.04.01

[Python] Selenium을 이용한 스크린샷 저장하기

필요한 것은 아니었지만 각 사이트의 메인화면을 스크린샷으로 찍어두는 프로그램이 있었으면 하는 상황이 있었었다. 물론 결국 필요해지진 않았지만 Selenium을 이용한 스크린샷을 찍는 방법을 정리한 다면 나중에 쓸 일이 있을 것 같아 정리를 하기로 하였다. selenium으로 스크린샷을 저장하는 방법은 매우 간단하다. # driver 기본 설정 후 driver를 반환 driver = open_driver() driver.get(url) driver.save_screenshot(path) driver의 save_screenshot()을 사용하면 끝이 난다. from selenium import webdriver def open_driver(): options = webdriver.ChromeOptions()..

Python 2021.12.01

[Selenium] Selenium Expected Condition 정리

이전 Selenium의 명시적 대기를 정리하면서 expected condition을 그냥 번역기로 정리해서 대충 살펴보았다. 하지만 번역기로 번역하였기에 이해가 가지 않는 부분들이 많았고 직접 하나씩 확인해보며 어떤 상태인지 알아보기로 하였다. 머리가 나쁘면 몸이 고생한다. 1. title_is(title) 우선 title_is는 파라미터로 str 타입의 text를 받는다. title_is는 head에 선언된 title의 속성을 비교하는데 쉽게 말해 탭에 표시되는 제목을 확인하는 것이다. driver = open_driver() driver.get("https://naver.com") try: wait = WebDriverWait(driver, 5).until( EC.title_is('NAVER') ) ..

Python 2021.10.30

[Selenium] Selenium Waits(대기) 정리

셀레니움을 사용하다 보면 페이지 로딩 시간 또는 동적 페이지로 인해 요소가 불러와질 때까지 기다려야 하는 상황이 발생한다. 만약 요소가 없을 때 요소를 찾으려는 함수가 호출되면 ElementNotVisibleException이 발생하기 때문에 꼭 요소가 나타날 때까지 기다렸다가 진행해 주어야 한다. 사실 파이썬이나 셀레니움을 사용하는 경우가 별로 없어서 그전까지 대기가 필요하면 그냥 Python의 sleep()을 사용하였다. from time import sleep sleep(1)# 1초 대기 sleep(0.5)# 0.5초 대기 Python의 sleep 같은 경우에는 인수로 ms 단위가 아닌 초(sec) 단위의 숫자를 받기 때문에 사용하기에 매우 직관적이다. 그렇기 때문에 간단한 대기나 짧은 시간의 대기..

Python 2021.10.25
728x90