셀레니움 크롤러 기본 사용법

셀레니움 전반에 관하여 간략하게 정리한다. 이 문서는 셀레니움 버전 3 기준이다. 최근 4버전이 출시되었으나 사용방법이 약간 다르니 이 부분을 확인하길 바란다. 사용 방법이나 예시는 따로 링크를 남기고 꾸준히 업데이트 하도록 하겠다. 아래 기능들만 익히면 웹상의 원하는 거의 대부분의 업무의 자동화가 가능할 것이다. 이하는 최신버전을 기준으로 코드를 정리하였다.



 

셀레니움 소개

셀레니움은 파이어폭스, 인터넷 익스플로어, 크롬등과 같은 브라우저를 컨트롤 할 수 있게 해줍니다. 현재 파이썬 3.5 이상부터 지원되며 3.6 이상 버전 부터 pip 로 표준 라이브러리로 사용할 수 있습니다.

설치 – install

pip install selenium

드라이버 – driver

Chrome https://sites.google.com/a/chromium.org/chromedriver/downloads
Edge https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
Firefox https://github.com/mozilla/geckodriver/releases
Safari https://webkit.org/blog/6900/webdriver-support-in-safari-10/

브라우저 열기 (chrome)

from selenium import webdriver

driver = webdriver.Chrome('chromedriver.exe')

권장 브라우저 열기 코드

브라우져 열기 옵션 넣기

크롬 브라우저를 열 때 넣을 수 있는 옵션을 셀레니움에서도 사용이 가능하다.

윈도우 사이즈

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument('window-size=1920,1080')

driver = webdriver.Chrome('chromedriver.exe', options=options)

헤들리스

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument('headless')

driver = webdriver.Chrome('chromedriver.exe', options=options)

창 최대화

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument('start-maximized)

driver = webdriver.Chrome('chromedriver.exe', options=options)

# 또는

driver.maximize_window()

브라우저 닫기

driver.close() #현재 탭 닫기
driver.quit()  #브라우저 닫기

뒤로가기 / 앞으로가기

driver.back() #뒤로가기
driver.forward() #앞으로가기

탭 이동

driver.window_handles[0] #브라우저 탭 객체를 리스트로 반환. [0] 은 인덱싱. 첫번재 탭을 의미

driver.switch_to.window(driver.window_handles[0]) #첫번째 탭으로 이동
driver.switch_to.window(driver.window_handles[1]) #두번째 탭으로 이동
driver.switch_to.window(driver.window_handles[2]) #세번째 탭으로 이동

탭 닫기

driver.switch_to.window(driver.window_handles[0]) #닫을 탭으로 이동 후

driver.close()

엘레먼트에 관하여

우리는 웹브라우저에서 로그인도 하고 버튼도 클릭하고 검색창에 텍스트를 입력하기도 한다. 이렇게 브라우저 상에서 보이는 버튼, 검색창, 사진, 테이블, 동영상 등등 이 모든 것들을 엘레먼트(element, 요소) 라고 부른다. 셀레니움은 우리가 브라우저에서 특정 요소를 클릭하고 텍스트를 입력하고 사진등을 받아오고 텍스트를 가져오는 등등 어떠한 위치에 있는 무언가를 부를 때 엘레먼트라는 개념으로 접근한다. 다양한 방법으로 엘레먼트로 접근할 수 있는데 대부분 xpath 를 사용한다.

엘레먼트 접근하는 방법

driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[1]/div/div[3]/form/fieldset/button/span[2]') #xpath 로 접근
driver.find_element_by_class_name('ico_search_submit')  #class 속성으로 접근
driver.find_element_by_id('ke_kbd_btn') #id 속성으로 접근
driver.find_element_by_link_text('회원가입')    #링크가 달려 있는 텍스트로 접근
driver.find_element_by_css_selector('#account > div > a')   #css 셀렉터로 접근
driver.find_element_by_name('join') #name 속성으로 접근
driver.find_element_by_partial_link_text('가입')  #링크가 달려 있는 엘레먼트에 텍스트 일부만 적어서 해당 엘레먼트에 접근
driver.find_element_by_tag_name('input')    #태그 이름으로 접근

driver.find_element_by_tag_name('input').find_element_by_tag_name('a')  #input 태그 하위태그인 a 태그에 접근
driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[1]/div/div[3]/form/fieldset/button/span[2]').find_element_by_name('join') #xpath 로 접근한 엘레먼트의 안에 join 이라는 속성을 가진 tag 엘레먼트에 접근

엘레먼트 클릭

driver.find_element_by_id('ke_kbd_btn').click()

텍스트 입력

driver.find_element_by_id('ke_awd2_btn').send_keys('텍스트 입력')

텍스트 삭제

driver.find_element_by_id('ke_awd2_btn').clear()

단축키 입력

from selenium.webdriver.common.keys import Keys

# 컨트롤+V
driver.find_element_by_id('ke_kbd_btn').send_keys(Keys.CONTROL + 'v')

# 다른 방법
from selenium.webdriver import ActionChains

ActionChains(driver).key_down(Keys.CONTROL).send_keys('V').key_up(Keys.CONTROL).perform() 
#위에서 driver 대신 엘리먼트를 입력해도 좋음. 

Frame 이동

#이동할 프레임 엘리먼트 지정
element = driver.find_element_by_tag_name('iframe')

#프레임 이동
driver.switch_to.frame(element)

#프레임에서 빠져나오기
driver.switch_to.default_content()

경고창 (alert)

경고창이 떴을 때 수락 또는 거절을 눌러주거나 경고창의 텍스트를 가져올 수 있다.

경고창 이동

#경고창으로 이동
driver.switch_to.alert

경고창 수락 / 거절

from selenium.webdriver.common.alert import Alert

Alert(driver).accept()    #경고창 수락 누름
Alert(driver).dismiss()   #경고창 거절 누름
print(Alert(driver).text  # 경고창 텍스트 얻음

쿠키 값 얻기

#쿠키값 얻기
driver.get_cookies()

#쿠키 추가
driver.add_cookie()

#쿠키 전부 삭제
driver.delete_all_cookies()

#특정 쿠기 삭제
driver.delete_cookie(cookiename)

자바스크립트 코드 실행

자바스크립트를 실행할 수 있다. 자주 그리고 많이 사용하는 자바스크립트 몇개를 알아본다.

스크롤 이동

#브라우저 스크롤 최하단으로 이동
driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')

# CSS 셀렉터로 클릭
driver.execute_script("document.querySelector('body >  div.modal-options__buttons > button.btn.btn-primary').click();")

#또는
elemToclick = driver.~~~
driver.execute_script('arguments[0].click();', elemToclick)

# driver.find_element_by_css_selector(~~).click() 과 동일하나 이 코드가 작동하지 않을시 자바스크립트 코드를 시도해볼만하다.

# 스크롤 특정 엘리먼트로 이동
element = driver.find_element_by_css_selector('div > a')
driver.execute_script('arguments[0].scrollIntoView(true);', element)

새 탭 열기

# Opens a new tab and switches to new tab
driver.switch_to.new_window('tab')

    # Opens a new window and switches to new window
driver.switch_to.new_window('window')

스크린샷

#캡쳐할 엘레먼트 지정
element = driver.driver.find_element_by_class_name('ico.search_submit')
#캡쳐
element.save_screenshot('image.png')

뒤로가기 앞으로가기

# 뒤로가기
driver.back()

#앞으로 가기
driver.forward()

예외처리 – Exceptions

from selenium.common.exceptions import NoAlertPresentException, NoSuchElementException, TimeoutException, ElementNotInteractableException,NoSuchWindowException, NoSuchFrameException

# NoAlertPresentException 경고창 관련 명령어를 실행했으나 현재 경고창이 뜨지 않음
# NoSuchElementException 엘레먼트 접근하였으나 없음
# TimeoutException 특정한 액션을 실행하였으나 시간이 오래 지나도록 소식이 없음
# ElementNotInteractableException 엘리먼트에 클릭등을 하였으나 클릭할 성질의 엘리먼트가 아님
# NoSuchWindowException 해당 윈도우 없음
# NoSuchFrameException 해당 프레임 없음

shadow DOM 처리

#shadow dom 엘레먼트 열어주는법
element = driver.execute_script("return document.querySelector('#syndi_powerpage > div').shadowRoot").get_attribute('innerHTML') # css Selector 이용 # element 의 HTML 내용 return
# shadow dom 처리를 통한 크롬 인터넷 기록 삭제

    driver.get('https://www.google.co.kr/')
    driver.get('chrome://settings/clearBrowserData')
    sleep(0.5)
    # 기간 전체기간 설정
    driver.find_element(By.CSS_SELECTOR,'settings-ui').shadow_root.\
        find_element(By.CSS_SELECTOR,'#main').shadow_root.\
        find_element(By.CSS_SELECTOR,'settings-basic-page.cr-centered-card-container').shadow_root.\
        find_element(By.CSS_SELECTOR,'settings-section[page-title="개인 정보 보호 및 보안"] > settings-privacy-page').shadow_root.\
        find_element(By.CSS_SELECTOR,'settings-clear-browsing-data-dialog').shadow_root.\
        find_element(By.CSS_SELECTOR,'#clearBrowsingDataDialog #clearFrom').shadow_root.\
        find_element(By.CSS_SELECTOR,'#dropdownMenu > option[value="4"]').click()

    # 인터넷 사용 기록 삭제 클릭 # 크롬 버전 110 기준 # 셀레니움4
    driver.find_element(By.CSS_SELECTOR,'settings-ui').shadow_root.\
        find_element(By.CSS_SELECTOR,'#main').shadow_root.\
        find_element(By.CSS_SELECTOR,'settings-basic-page.cr-centered-card-container').shadow_root.\
        find_element(By.CSS_SELECTOR,'settings-section[page-title="개인 정보 보호 및 보안"] > settings-privacy-page').shadow_root.\
        find_element(By.CSS_SELECTOR,'settings-clear-browsing-data-dialog').shadow_root.\
        find_element(By.CSS_SELECTOR,'#clearBrowsingDataDialog #clearBrowsingDataConfirm').click()

XHR 데이터 확인

from selenium.webdriver import DesiredCapabilities
import json

capabilities = DesiredCapabilities.CHROME
capabilities["goog:loggingPrefs"] = {"performance": "ALL"}  # newer: goog:loggingPrefs

try:
    s = Service(f'./{chrome_ver}/chromedriver.exe')
    driver = webdriver.Chrome(service=s, options=option, desired_capabilities=capabilities)
except:
    chromedriver_autoinstaller.install(True)
    s = Service(f'./{chrome_ver}/chromedriver.exe')
    driver = webdriver.Chrome(service=s, options=option, desired_capabilities=capabilities)
driver.implicitly_wait(7)

driver.get('blablablabla~~~')

logs_raw = driver.get_log("performance")
logs = [json.loads(lr["message"])["message"] for lr in logs_raw]

def log_filter(log_):
    return (
        # is an actual response
        log_["method"] == "Network.responseReceived"
        # and json
        and "json" in log_["params"]["response"]["mimeType"]
    )

for log in filter(log_filter, logs):
    request_id = log["params"]["requestId"]
    resp_url = log["params"]["response"]["url"]
    print(f"Caught {resp_url}")
    print(driver.execute_cdp_cmd("Network.getResponseBody", {"requestId": request_id}))

 

# 2021. 1. 1. uploaded
# 2021. 02. 21. updated
# 2021. 08. 09. updated
# 2021. 08. 15. updated
# 2021. 08. 23. updated
# 2022. 03. 16. updated

45 thoughts on “셀레니움 크롤러 기본 사용법”

  1. 안녕하세요! 셀레니움중 막히는 부분이 발생하여 내용을 찾아보다 방문하게 되었습니다.

    var prClick = _driver.FindElementByXPath(“//*[@id=\”DataTables_Table_1\”]/tbody/tr/td[2]/button”); //검색된 PR넘버 클릭
    prClick.Click();

    해당 클릭이 작동하면 새창이 열려 해당하는 드롭다운의 내용중 한개를 선택하개 해주었는데

    var activityType = new SelectElement(_driver.FindElement(By.Name(“Activity Type”))); //액티브타입 선택
    activityType.SelectByText(“Cancel”);

    새로 열린 창에 대해서는 해당 Element을 찾을 수 없다고 나오는데 새로운창을 지정해서 작동시켜야 해야하는 건가요?

    자동화를 시키다가 막혀서 진행이 안되어 도움좀 부탁드립니다.ㅜ

    응답
    • ifame 찾아보니 4가지가 나오는데 위치가 다 다른 프레임 처럼 보여 4가지 전부 테스트해봐도 작동을 안하는데 도움좀 받을 수 없을까요?

      응답
    • 안녕하세요 반갑습니다. 댓글을 달아주셔서 감사합니다. 파이썬이 아니라 C#으로 코딩하고 계신것으로 보이는군요. 말씀하신 “새로 열린 창”이라는 것이 크롬탭이나 윈도우가 새로 열렸다는 의미하시는 것으로 보입니다. 새 창이 열린 경우에는 frame 이동이 아니라 window 이동을 해주셔야 합니다. window 이동에 관한 내용은 <a href=”https://pythondocs.net/selenium/%ec%85%80%eb%a0%88%eb%8b%88%ec%9b%80-%ed%81%ac%eb%a1%a4%eb%9f%ac-%ea%b8%b0%eb%b3%b8-%ec%82%ac%ec%9a%a9%eb%b2%95/#%ED%83%AD_%EC%9D%B4%EB%8F%99″ title=”탭이동”>탭이동</a> 참조하시길 바랍니다. 곧 가까운 시일내에 이에 대해서 자세한 포스팅을 올리겠습니다. 궁금하신점이 있으시면 언제든지 댓글로 문의주세요~

      응답
  2. 안녕하세요~
    셀레니움 이용 중에 해결되지 않는 것이 있어 질문 좀 올립니다…
    간단한 코드임에도 파이썬을 다룬지 얼마 안되어서 질문이 엉뚱할 수 있습니다

    버튼 활성화가 되었을 때는 클릭,
    버튼 활성화가 되지 않았을 때는 무한 새로고침을 하는 코드를 짜고 있습니다.

    버튼 활성화가 되지 않았을 때 해당 엘리먼트는 존재하지 않아서
    아래처럼 작성 해 보았는데요
    작동에는 문제가 없지만 새로고침 시간 텀이 3초 정도로 길게 작동합니다.

    1초 이내로 새로고침 동작을 하고 싶은데 다른 방법이 없을까요?

    while True:
    try:
    xpath = “//div[@class=’cart’]”
    python = driver.find_element_by_xpath(xpath)
    if python.text == ‘장바구니’:
    driver.implicitly_wait(5)
    python.click()
    break
    except:
    print(“새로고침”)
    driver.refresh()

    응답
    • 이유는 간단합니다. driver.find_element_by_xpath(xpath) 에서 해당 엘리먼트를 찾는데 3초가 걸리고 못찾으면 에러를 내서 except 로 넘어가게 되는 것입니다. implicitly 웨이트 값을 줄여보세요. 참고로 implicitly 웨이트값은 저 자리에 넣는 것이 아니라 드라이버를 while 문 바깥에 (while 문 위에) 놓는게 좋아보입니다.
      참고로 나이키나 아디다스 제품을 셀레니움으로 구매하시려고 하는것이라면… 셀레니움이 그닥 특효는 아닐겁니다. 느리거든요. ㅋ

      응답
  3. 응답해주셔서 감사합니다~!
    댓글과 다른 게시물들 통해서 정말 큰 도움 얻었습니다.
    해당 블로그에서 파이썬보다 셀레니움을 먼저 알게 되어
    처음에는 여러 명령어들이 무슨 뜻인지, 어떻게 작동하는지도 무지한 상태로 무작정 작성하기 시작한 것인데…
    이제는 문장들을 이해하고 작성할 수 있게 되니 참 셀레니움이 신기하고 재밌습니다.
    처음에는 쇼핑몰에서 활용할 매크로를 위해서 배우기 시작한 것은 맞지만요. ㅋ

    이런 식의 도움 되라고 지식 나눔해주신 건 아닐테지만…
    앞으로도 이런 매크로 동작이 아니더라도 종종 배워가겠습니다~

    응답
    • 감사합니다 도움이 되셨다니 저도 기분이 좋네요 ^^ 웹상에서 매크로는 셀레니움이 가장 편리하고 좋습니다. 일반 매크로로 x,y 값 찾아서 클릭하는거랑은 비교가 안되지요 ㅋ 또 어려운점 있으시면 언제든 질문주세요. 자주 놀러오시고 쿠팡에서 아무물건이나 구매하실 일 있을 때 왼쪽에 광고 클릭해서 들어가셔서 아무 물건이든 구입하시면 제게 도움이 됩니다.(수수료 발생) 물론 구매자 구매가격은 동일합니다. 많이 도와주세요! 감사합니다 !

      응답
  4. 안녕하세요. selenium에 대해 문의 드립니다.
    예를들어 크롬으로 네이버를 수동으로 로그인 하였습니다.
    이 창을 selenium으로 연결하여 그대로 사용할수 있을까요?
    공부중인데 구글링 해봐도 전부 driver.get으로 url을 호출하여 새창을 열고 로그인하고 이런식으로만 되어있어 도무지 찾을수가 없습니다.

    응답
      • 저도 user22님과 같은 고민을 하다가 귀하의 site를 방문하였습니다.
        본 사이트 글들 중에서 같은 내용의 해결책을 찾다가 못 찾아 응답글을 드립니다.
        파이참 콘솔에 어떤기능을 사용하면 될까요?

        감사합니다.

        응답
        • 답을찾으셨나요? 저는 기존에 생성했던 크롬프로필을 제어할수있는 창을띄우는방법을 찾아다니고있습니다. 비슷한 문제로 어려움을느끼고계셨던것같아 질문드려봅니다.

          응답
  5. 안녕하세요 제가 파이썬 셀레니움으로 자동화 프로그램을 만들었는데 워낙 양이 많다보니깐 꽤 오랜시간으로 돌려야하는 상황이 있습니다. 스크립트 기능은 자동으로 다운버튼을 클릭하여 파일을 다운받는 스크립트인데 대략 1개 다운받는데 1초정도 걸리는데 이렇게 해서 대략 600개 이상 파일 다운이 넘어갈 쯤에 갑자기 속도가 느려지는 현상이 발생합니다.( 대충 1개받는데 3초정도 걸리게됩니다 -> 이상태로 쭉 유지가됩니다)

    그래서 코드를 아예 대충 600개 받았을 때 다시 껏다 실행하는 식으로 바꿔서 해봤는데도 여전히 느리더라고요.

    아예 그래서 스크립트를 중지하고 다시 스크립트를 시작해야 속도가 다시 빨라지곤 하는데

    혹시 셀레니움의 문제인지 웹관련 문제인지 속도를 계속 빠르게 유지할 수 잇는 방법이 없을까요?

    (매번 600개정도 다운받고 다시 껏다키는게 굉장히 번거롭더라고요 ㅠㅠ 다시 설정도 해줘야하고요,,)

    응답
  6. 안녕하세요 셀레니움을 처음 접하게 되면서 블로그를 보면서 자동화 프로그램을 만들어보고 있는데요 사이트를 들어가는 것 까지는 되는데 로그인 하려구 css selector를 써서
    search = driver.find_element_by_css_selector(‘body > footer > div > div.footer-nav.uk-width-small-1-1.uk-width-medium-1-1.footer-maxwidth > div > div > p:nth-child(4) > a’)

    search.send_keys(Keys.ENTER)
    아래와 같이 한 후 실행을 했는데 클릭이 되지않고
    Traceback (most recent call last):
    ~~~~~~~~~~~~~~
    AttributeError: ‘NoneType’ object has no attribute ‘send_keys’ 이러한 오류가 뜹니다
    다른 엘레먼트 접근은 잘 되는데 이 부분에서만 오류가 뜨네요 ㅠㅠㅠ

    응답
  7. 안녕하세요. 이렇게 정리 잘된 내용은 처음봐서 댓글남깁니다! 너무 큰 도움이 되었어요 🙂
    혹시 크롤링 관련해서 계속 공부를 해보고싶은데, 공부할만한 책이나 강의같은거? 추천해주실만한거 있으신지 문의드립니다!

    응답
  8. 완전 초보 입니다.
    selenium 으로 쿠팡 상품평 클릭이 되지 않았는데
    올려 놓으신 코드를 사용했더니
    클릭이 가능했어요
    모든것이 해결된 줄 알았는데
    시작이네요
    더이상 크롤링이 되지 않아요
    페이지가 변해도 url이 변하지 않고요

    무엇을 공부해야 이 산을 넘을 수 있나요
    도움주시기 바랍니다.
    너무 쉬운부분을 질문 드린것은 아닌지요

    응답
  9. 안녕하세요. selenium 공부하고 있는데요.
    chromedriver.exe 종료해야되는데 어떻게 작성해야된는지 문의드립니다.
    구굴링을 많이 했는데. quit()를 사용하라고 하지만 추가하게 되면 웹페이지가 열리면 바로 종료되고 있습니다.
    chrome이 열려 있으면 종료되지 않고 창을 닫게 되면 chromedriver.exe 종료하도록 하고 싶습니다.
    어떻게 방법이 없을까요? 파일은 exe 파일을 만들어서 이용하고 있습니다.

    응답
  10. 파이썬 초보로서 공부하다보니 아래에서 막히게 되었습니다.

    xyz3 = ‘dailyTable’+str(now)[0 : 4]+str(now)[5 : 7]+str(b)

    endhope = False
    while not endhope:
    tim = datetime.datetime.now()
    if tim.second>=59 and tim.microsecond>800000:
    driver.find_element(By.ID,str(xyz3)).click() <—- 클릭될부분
    endhope=True
    print(tim)
    else:
    time.sleep(0.1)
    print(tim)

    위 while 문은 시간의 개념으로 루프를 탈출하는데 문제는 없는데 저는 시간의 개념이 아니라 클릭이 되면(이벤트가 발생되면) 루프를 탈출하는 방식으로 바꾸려 합니다.
    어떻게 해야할지 부탁드립니다. 감사합니다

    응답
  11. 파이썬 초보자입니다

    tistory에 로그인 ~ 제목 – 글쓰기를 하는데
    파일(한글 2페이지)을 복사해서 글쓰기에 붙이기 하려는데 여러군데를 찾아봐도 몰라서 문의합니다
    어떻게 하면 되는지 간절하게 요청드립니다? 고수님의 단순한 멘트도 저에게는 많은 도움이 충분히 됩니다

    테스트 진행상황
    selenium driver.send_keys()로는 안되고 어떻게 해야할지 맨붕입니다
    감사합니다

    응답
  12. 안녕하세요, 크롤링 중에 막혀서 문의 드립니다. 하기 코드로 진행 시, 검색 이후 스크롤하기 까지는 가능한데, 이미지 저장에서 에러가 계속 뜨네요, 개선 방법이 있을까요??

    from re import I
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    import time
    import urllib.request
    import os

    search_words = [“워너원황민현”, “엑소시우민”, “강동원”, “이종석”, “이준기”]
    driver = webdriver.Chrome() #chromedriver.exe -> 가져 옴
    driver.get(“https://www.google.co.kr/imghp?hl=ko&tab=wi&authuser=0&ogbl”)
    # assert “Python” in driver.title
    current_path = os.getcwd() # 저장 경로
    for search_word in search_words:
    elem = driver.find_element_by_name(“q”) # 검색탕의 검색엔진을 찾는 코드
    elem.clear()
    elem.send_keys(search_word) # 해당 검색엔진에 글자를 입력
    elem.send_keys(Keys.RETURN)
    SCROLL_PAUSE_TIME = 1

    # Get scroll height
    last_height = driver.execute_script(
    “return document.body.scrollHeight”) #브라우져 높이를 확인 가능(자바스크립트)

    while True:
    # Scroll down to bottom
    driver.execute_script(“window.scrollTo(0, document.body.scrollHeight);”
    ) # 브라우져 끝까지 스크롤을 내리겠다.

    # Wait to load page
    time.sleep(SCROLL_PAUSE_TIME) # 페이지 로딩 될 동안 웨잇

    # Calculate new scroll height and compare with last scroll height
    new_height = driver.execute_script(“return document.body.scrollHeight”)
    if new_height == last_height: # 스크롤이 끝까지 내려가서 더이상 내릴 것이 없을 때
    try:
    driver.find_element_by_css_selector(
    “.mye4qd”).click() # 검색어 더 찾아보기 클릭
    except:
    break
    last_height = new_height

    images = driver.find_elements_by_css_selector(“.rg_i.Q4LuWd”)

    folder_name = search_word
    #해당 이미지 이름과 동일한 폴더 생성
    if not os.path.isdir(folder_name): # 없으면 새로 생성하는 조건문
    os.mkdir(folder_name)

    count = 1
    for image in images:
    if count > 100:
    break
    try:
    image.click()
    time.sleep(3)
    imgUrl = driver.find_element_by_xpath(
    “/html/body/div[2]/c-wiz/div[3]/div[2]/div[3]/div/div/div[3]/div[2]/c-wiz/div/div[1]/div[1]/div[2]/div/a/img”).get_attribute(“src”)
    urllib.request.urlretrieve(
    imgUrl,
    folder_name + “/” + search_word + “.” + str(count) + “.jpg”)
    count = count + 1
    except:
    pass
    driver.back()

    driver.close()

    응답
  13. 교직원공제회 자동 로그인 하려고 하는데요.
    비밀번호 입력이 되지 않는데 왜인지 이유를 못찾고 있습니다.ㅠㅠ
    혹시 팁이 있을까요?

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

    driver = webdriver.Chrome(r”C:\Users\CHULBANG\python_project\cgv_coupon_get\chromedriver.exe”)
    driver.implicitly_wait(3)

    driver.get(“https://www.ktcu.or.kr/ET/ET-P010M01.do?FORWARD_URL=/MH/MH-P010M01.do”)

    elem = driver.find_element(By.XPATH, “/html/body/div[3]/form[3]/div/div/div[2]/div[1]/div/input[1]”).send_keys(“id”)
    elem = driver.find_element(By.XPATH, “/html/body/div[3]/form[3]/div/div/div[2]/div[1]/div/input[2]”).send_keys(“password”)

    elem = driver.find_element(By.XPATH, “/html/body/div[3]/form[3]/div/div/div[2]/div[1]/div/a”).click()

    응답
  14. 안녕하세요 파이썬으로 selenium 활용 중에 있습니다.
    현재 여러가지로 실험과 실습을 통해 공부중에 있는데
    경고발생 창에서 확인하고 넘어가 지지 않습니다.
    다른 곳에서는 잘 작동이 되었는데 유독 한 사이트에서만 alert 창이 인식이 안되는데 이러한 사유가 발생하게 되는 이유가 있을까요??
    해당 문제가 발생하는 페이지는 동영상 학습 페이지로 학습하기 버튼을 누르면 새로운 창이 열리면서 그와 함께 alert 창이 발생하고 있습니다.
    try:
    WebDriverWait(driver, 3).until(EC.alert_is_present())
    alert = driver.switch_to.alert
    alert.accept()
    print(“경고창을 확인합니다.”)
    break
    except:
    print(“경고창이 인식되지 않습니다.”)

    이렇게 해도 경고창이 인식이 되지 않고, 간단하게
    Alert(driver).accept() 로 해도 전혀 인식이 되지 않습니다.
    driver.switch_to.alert.accept() 도 해보고 갖가지 방법을 검색해서 해봐도 해결이 되지 않네요 ㅜㅜ 왜이런건지 해결방법은 어떻게 될지 고견을 부탁드립니다.

    응답
  15. 우선 셀레니엄에 대해 정말 해박하신 지식에 탄복합니다~
    이번에 셀레니엄을 쓰면서 발견한 문제가 .get을 계속 반복하다보면 조금 전에 했던 .get의 결과값은 더 이상 필요가 없는데도 메모리를 반환하지 않고 계속 추가적으로 점유해가고, 그래서 주기적으로 .quit을 불러줘야 했다는 점이랑, new와 quit을 반복적으로 했음에도 미세하게 또 메모리가 온전히 반환이 안되서 결국엔 여유 메모리가 점점 줄어드는 문제를 발견했는데요, 화면을 refresh해서 새로운 내용이 셀레니엄에 반환될 때 기존에 .get했던 내용은 싹 버리고 최종 받은 것만 갖고 있도록, 즉 메모리를 자꾸 계속 더 쓰기만 하지 말고 .get하면 딱 새로 .get한 것만 갖고 있도록 하는 방법이 없을까요?
    그리고, .quit을 해도 완전히 메모리가 다 반환되지 않는 증상은 어떻게 없앨 수 있을까요? 지금까지 발견한 유일한 해법은 스레드가 아닌 멀티 프로세스로 분리해서 돌리다가 아예 프로세스까지 kill 시켜버리는 방식으로 메모리를 회복시키는 방법인데, 아무래도 이건 너무 근본적으로 심한 우회 방법인 듯 해서 뭔가 셀레니엄에 근본적인 옵션이나 다른 방법의 해법이 없을까 해서 고견을 여쭙고자 질문 남깁니다.

    응답

Leave a Comment