How to Use Selenium

셀레니움 설치

셀레니움크롬드라이버를 관리해주는 매니저를 설치한다. webdriver-manager 사용을 위해서는 컴퓨터가 인터넷 환경에 연결되어 있어야 한다.

1
2
pip install selenium
pip install webdriver-manager

NFEC 장비 자동등록 스크립트

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
import time
import pandas as pd


class Nfec(object):
    def __init__(self) -> None:
        self.url = "https://www.zeus.go.kr/main"
        self.equipments = [
            "/html/body/div[5]/ul/li[1]",
            "/html/body/div[5]/ul/li[2]",
            "/html/body/div[5]/ul/li[3]",
            "/html/body/div[5]/ul/li[4]",
            "/html/body/div[5]/ul/li[5]",
            "/html/body/div[5]/ul/li[6]",
            "/html/body/div[5]/ul/li[7]",
            "/html/body/div[5]/ul/li[8]",
            "/html/body/div[5]/ul/li[9]",
        ]
        self.sheet_index = 8  # 0 ~ 8

    def start(self):
        (
            self.used_equipmentnum,
            self.used_user,
            self.used_dates,
            self.used_samplenums,
        ) = self.read_excel("nfec.xlsx", self.sheet_index)

        self.driver_init()
        self.login("아이디", "패스워드")
        self.shift_to_input_menu()
        for i in range(len(self.used_dates)):
            self.input_data(i)
            self.submit()

        # 모든 작업이 끝나면 드라이버 해제
        time.sleep(3)
        self.driver.close()

    def read_excel(self, filename, sheet_index):
        data = pd.read_excel(filename, sheet_index)
        used_equipmentnum = int(data["meta-data"][0])
        used_user = data["meta-data"][1]
        used_dates = pd.to_datetime(data["사용일"].unique()).strftime("%Y-%m-%d").tolist()
        used_samplenums = data["시료수"].values.tolist()
        return used_equipmentnum, used_user, used_dates, used_samplenums

    def driver_init(self):
        # 필요하지 않은 오류를 표시하지 않도록 함
        options = webdriver.ChromeOptions()
        options.add_experimental_option("excludeSwitches", ["enable-logging"])

        # Webdriver Manager를 이용한 드라이버 초기화 1
        # service = Service(ChromeDriverManager().install())
        # self.driver = webdriver.Chrome(service=service, options=options)

        # Webdriver Manager를 쓰지 않고 크롬드라이버를 직접 초기화 2
        self.driver = webdriver.Chrome(
            "C:\\Users\\user\\Desktop\\KAERI\\nfec\\.venv\\Scripts\\chromedriver.exe",
            options=options,
        )

        # 크롬이 전체화면으로 실행되게 하고 url을 읽어들이도록 함
        self.driver.maximize_window()
        self.driver.get(self.url)
        # 작업이 완료될 때까지 최대 5초 기다림. 그 전에 끝나면 취소
        self.driver.implicitly_wait(5)

    def login(self, id, password):
        # 항목을 찾아 로그인 조작을 수행
        self.driver.find_element(By.LINK_TEXT, "로그인").click()
        self.driver.find_element(By.ID, "userid").send_keys(id)
        self.driver.find_element(By.ID, "password").send_keys(password)
        self.driver.find_element(By.ID, "loginSubmitBtn").click()
        self.driver.implicitly_wait(5)

    def shift_to_input_menu(self):
        # 마우스를 움직여 플로팅 메뉴를 띄우고 이동
        elem_hover = self.driver.find_element(By.LINK_TEXT, "등록관리")
        self.actions = ActionChains(self.driver)
        self.actions.move_to_element(elem_hover).perform()
        elem_click = self.driver.find_element(By.LINK_TEXT, "장비운영·활용")
        self.actions.click(elem_click).perform()
        self.driver.implicitly_wait(5)

    def input_data(self, i):
        # 입력할 장비 선택
        self.driver.find_element(
            By.XPATH,
            "/html/body/div[1]/article/div/section/article/div[2]/div[1]/div[1]/a/span[1]",
        ).click()
        self.driver.find_element(
            By.XPATH, self.equipments[self.used_equipmentnum]
        ).click()
        self.driver.implicitly_wait(5)

        # 정보 입력
        self.driver.find_element(By.ID, "journalUserNm").send_keys(self.used_user)

        # 셀레니움 모듈로 조작할 수 없는 데이트피커이므로 스크립트를 사용해 날짜를 직접 입력
        # 시작일 강제주입후 클릭하여 실제 입력동작을 함으로써 종료일이 시작일 이후로만 선택되도록 반영
        self.driver.execute_script(
            "$('#"
            + "journalSdt"
            + "').datepicker('setDate',new Date('"
            + self.used_dates[i]
            + "'));"
        )
        self.driver.find_element(By.ID, "journalSdt").click()
        self.driver.find_element(By.ID, "journalSdt").send_keys(Keys.RETURN)
        self.driver.find_element(By.ID, "journalShour").send_keys("09")
        self.driver.find_element(By.ID, "journalSminute").send_keys("00")

        self.driver.execute_script(
            "$('#"
            + "journalEdt"
            + "').datepicker('setDate',new Date('"
            + self.used_dates[i]
            + "'));"
        )
        self.driver.find_element(By.ID, "journalEhour").send_keys("18")
        self.driver.find_element(By.ID, "journalEminute").send_keys("00")

        Select(self.driver.find_element(By.ID, "useOrganClassCd")).select_by_index(0)
        self.driver.find_element(By.ID, "useOrganNm").send_keys("한국원자력연구원")
        self.driver.find_element(By.ID, "useDeptNm").send_keys("방사성폐기물핵종분석실")
        self.driver.find_element(By.ID, "sampleCnt").send_keys(self.used_samplenums[i])
        self.driver.find_element(By.ID, "inputManHour").send_keys("8")
        Select(self.driver.find_element(By.ID, "useTypeCd")).select_by_index(0)
        Select(self.driver.find_element(By.ID, "useOrganTypeCd")).select_by_index(5)

    def submit(self):
        self.driver.find_element(
            By.XPATH,
            "/html/body/div[1]/article/div/section/article/div[2]/div[2]/div[2]/form/fieldset/div/button/i",
        ).click()

        # 입력여부 알람 해소
        WebDriverWait(self.driver, 5).until(EC.alert_is_present())
        alert = self.driver.switch_to.alert
        alert.accept()

        # 입력완료 알람 해소
        WebDriverWait(self.driver, 5).until(EC.alert_is_present())
        alert = self.driver.switch_to.alert
        alert.accept()

        self.driver.implicitly_wait(5)


if __name__ == "__main__":
    nfec = Nfec()
    nfec.start()
Built with Hugo
Theme Stack designed by Jimmy