파이썬(Python)

[ Selenium ] 파이썬 나라장터 접속하고 팝업창 닫기, Selenium 팝업창 닫기

카루루1007 2025. 3. 17. 00:06
728x90
반응형

 들어가며

 

나라장터에 접속하면 아래 그림과 같이 팝업창이 여러 개가 나타납니다.

이런 팝업창을 제거하는 방법입니다.

 

나라장터뿐만 아니라 유사한 형태로 팝업을 처리하는 웹사이트에는 대부분 가능한 방법으로 보입니다.

※ 팝업창이 나타나는 구조는 사이트마다 다를 수 있습니다.

 

구현할 내용은 나라장터 사이트에 접속 후

팝업창의 오늘 하루 이 창을 열지 않음을 클릭해 팝업을 닫는 방법입니다.

 

Selenium을 통해 요소를 클릭할 때 주의할 점

요소가 가려져 있으면 클릭이 안될 수도 있다는 점입니다.

 

위 그림을 보면 팝업창은 모두 네개 인데

"오늘 하루 이 창을 열지 않음"이 보이는 창은 두 개입니다.

보이지 않는 팝업의 요소는 클릭이 되지 않을 수도 있습니다.

 

그렇기 때문에 맨 위의 요소부터 차례로 클릭을 해야 

에러없이 모든 창을 닫을 수 있습니다.

 

반응형

 요소 찾아보기

 

먼저 Selenium으로 나라장터에 접속하는 코드입니다.

단순히 나라장터에 접속하고 5초 후에 브라우저를 닫는 코드입니다.

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("https://www.g2b.go.kr/")

time.sleep(5)
driver.quit()

 

다음은 나라장터에 처음 접속했을 때 상황을 살펴보겠습니다.

 

F12를 눌러 요소를 검사해 보면

아래 그림의 부분이 팝업창을 나타내는 것으로 보입니다.

 

잠시 살펴보면 ID의 전반부는 동일하지만 마지막에 숫자가 다릅니다.

왠지 이 숫자는 팝업 내용이 변경될 때마다 숫자도 바뀔 것 같습니다.

 

CLASS는 네 개가 모두 동일합니다.

 

aria-labelledby도 숫자가 달라지므로 이것도 고정된 요소로 사용하기는 어려워 보입니다.

 

그다음 

오늘 하루 이 창을 열지 않음요소를 찾아보겠습니다.

해당 부분을 살펴보면 

classw2checkbox_input 인 것을 찾으면 될 것 같습니다.

조금 더 정확하게 하기 위해 

title"오늘 하루 이 창을 열지 않음"

인지도 확인하겠습니다.

<input type="checkbox" class="w2checkbox_input" name="mf_wfm_container_wq_uuid_896_wq_uuid_903_poupR23AB0000013499_wframe_popupCnts_cbxTodayClose_input" index="0" id="mf_wfm_container_wq_uuid_896_wq_uuid_903_poupR23AB0000013499_wframe_popupCnts_cbxTodayClose_input_0" title="오늘 하루 이 창을 열지 않음">

 

728x90

 팝업 개수 확인하기

 

먼저 팝업창의 class는 아래와 같으므로 모두 몇 개인지 확인해 보겠습니다.

w2window w2window_restored w2popup_window w2window_window_move_type positionFixed

 

코드는 다음과 같습니다.

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()
driver.get("https://www.g2b.go.kr/")

wait = WebDriverWait(driver, 10)
popups = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "w2window_restored")))

print(f"팝업 갯수 : {len(popups)}개")

time.sleep(5)
driver.quit()

 

확인해 보니 팝업의 개수는 모두 4개이고

나라장터에 접속했을 때 나타나는 팝업의 개수도 모두 4개로 동일합니다.

 

여기서 popups는 리스트 형태로 값이 저장됩니다.

나라장터 사이트를 확인해 보면 맨 첫 번째 요소의 팝업이 제일 아래에 위치하고 있다는 점입니다.

첫번째 요소부터 닫기 시작하면 클릭이 되지 않아 에러가 발생할 수 있으므로

맨 마지막 요소부터 닫기 시작해야 합니다.

 

그렇기 때문에 popups의 값을 역순으로 뒤집어 줍니다.

그래야 맨 앞의 팝업창부터 닫기 시작합니다.

 

popups.reverse() #리스트 뒤집기
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()
driver.get("https://www.g2b.go.kr/")

wait = WebDriverWait(driver, 10)
popups = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "w2window_restored")))

print(f"팝업 갯수 : {len(popups)}개")

popups.reverse()

time.sleep(5)
driver.quit()

 

 하위 요소 찾기

 

마지막으로 하위 요소에서 

classw2window_restored

이면서

title"오늘 하루 이 창을 열지 않음"

인 것을 찾아서 클릭을 하게 하겠습니다.

for popup in popups:
    time.sleep(1)
    checkbox = popup.find_element(By.XPATH, ".//input[@class='w2checkbox_input' and @title='오늘 하루 이 창을 열지 않음']")    checkbox.click()
    print("오늘 하루 이 창을 열지 않음 클릭")

 

전체 코드입니다.

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()
driver.get("https://www.g2b.go.kr/")

wait = WebDriverWait(driver, 10)
popups = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "w2window_restored")))

print(f"팝업 갯수 : {len(popups)}개")

popups.reverse()

for popup in popups:
    time.sleep(1)
    checkbox = popup.find_element(By.XPATH, ".//input[@class='w2checkbox_input' and @title='오늘 하루 이 창을 열지 않음']")
    checkbox.click()
    print("오늘 하루 이 창을 열지 않음 클릭")
    

time.sleep(5)
driver.quit()

 

 마치며

 

위 코드를 사용하면

나라장터에 접속했을 때 팝업을 자동으로 제거하게 할 수 있습니다.

비슷한 형태로 구성된 사이트에서도 동작이 가능합니다.

 

중요한 점은 해당 요소를 역순으로 배열해야 한다는 점입니다.

나라장터의 사이트만 확인해 보았으므로 다른 사이트도 역순으로 해야 하는지는 잘 모르겠지만,

이는 요소를 검사해 보면 확인할 수 있는 사항이므로

상황에 따라 선택하면 될 것으로 보입니다. 

여기를 방문하시면 더 많은 파이썬 관련 자료를 확인할 수 있습니다.

파이썬 공부하기

728x90
반응형