직장인

[회사원] 업무 코딩기록 - (Selenium) 웹페이지 로그인, 실행(메일N인송부)

cyy1211 2024. 12. 26. 09:38
728x90
반응형
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager  # Chrome driver 자동 업데이트
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
from selenium.common.exceptions import TimeoutException
import time
import pandas as pd

# 브라우저 꺼짐 방지
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"])

# Chrome driver Manager를 통해 크롬 드라이버 자동 설치
service = Service(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=chrome_options)

driver.implicitly_wait(10)  # 웹페이지 로딩 될 때까지 10초 대기
driver.maximize_window()  # 화면 최대화

# 크롬 드라이버에 url 주소 넣고 실행

# 페이지가 완전히 로딩될 때까지 대기
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="TextUserID"]')))

# id 입력
id_box = driver.find_element('xpath', '//*[@id="TextUserID"]')
id_box.send_keys('사번기입')

# 비밀번호 입력
password_box = driver.find_element('xpath', '//*[@id="TextPassword"]')
password_box.send_keys('비번기입')
password_box.send_keys(Keys.RETURN)

# EDMS 로그인 완료

# (1회차 시작)마이오피스 버튼이 위치한 iframe(topFrame)으로 전환
driver.switch_to.frame("topFrame")

# 마이오피스 버튼 xpath('//*[@id="top_menu02(18)"]') 클릭을 위한 대기
try:
    # 대기 시간 증가
    WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, '//*[@id="top_menu02(18)"]')))
   
    # 버튼 요소 가져오기
    Office_btn = driver.find_element(By.XPATH, '//*[@id="top_menu02(18)"]')

    # 버튼이 가시적이고 클릭 가능한지 확인
    if Office_btn.is_displayed() and Office_btn.is_enabled():
        # JavaScript로 클릭 시도
        driver.execute_script("arguments[0].click();", Office_btn)
    else:
        print("버튼이 표시되지 않거나 클릭할 수 없습니다.")
except TimeoutException:
    print("버튼을 찾는 데 시간이 초과되었습니다.")
except Exception as e:
    print(f"예외 발생: {e}")
   
# 최상위 프레임으로 돌아가기
driver.switch_to.default_content()
   
# 메일쓰기 버튼이 위치한 iframe(mainframe)이 로드될 때까지 대기 후 찾기
try:
    # iframe이 로드될 때까지 대기 후 찾기
    iframe = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "mainFrame"))  # ID로 iframe 찾기
    )
    driver.switch_to.frame(iframe)  # iframe으로 전환
    print("iframe 전환 완료")
   
    # iframe 내부의 요소에 접근하는 코드 작성
except Exception as e:
        print(f"오류 발생: {e}")    
       
# iframe(mainframe) 내부의 요소(left)에 접근하는 코드 작성
# 메일쓰기 버튼이 위치한 iframe(left)이 로드될 때까지 대기 후 찾기
try:
    # iframe이 로드될 때까지 대기 후 찾기
    iframe = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.NAME, "left"))  # NAME으로 iframe 찾기
    )
    driver.switch_to.frame(iframe)  # iframe으로 전환
    print("iframe 전환 완료")      

except Exception as e:
        print(f"오류 발생: {e}")    

# 메일쓰기 버튼 XPath('/html/body/div/ul[1]/li[1]/span')의 요소가 존재하는지 확인하고 클릭하기
try:
    elem = driver.find_element(By.XPATH, '/html/body/div/ul[1]/li[1]/span').click()
    print("있다")
except:
    print("없다")
   
# 모든 윈도우 창의 핸들 가져오기
windows = driver.window_handles
print("모든 창 핸들:", windows)

# 메일쓰기 창으로 포커스 이동
driver.switch_to.window(windows[1])
print("포커스 창:", driver.title)

# 최상위 프레임으로 돌아가기
driver.switch_to.default_content()

# 엑셀 파일에서 A2 셀 읽기
excel_data = pd.read_excel("mail.xlsx", header=None)  # 파일명은 mail.xlsx 예시입니다.
print(excel_data)
a2_data = excel_data.iloc[1, 0]  # A2는 첫 번째 열(0), 두 번째 행(1)
print(a2_data)

# 받는사람 서치박스 xpath('/html/body/table/tbody/tr[2]/td/table/tbody/tr[1]/td[1]/input')의 요소가 존재하는 확인하고 엑셀데이터 복붙.
try:
    # 웹 페이지가 완전히 로드될 때까지 대기
    WebDriverWait(driver, 40).until(EC.presence_of_element_located((By.XPATH, '/html/body/table/tbody/tr[2]/td/table/tbody/tr[1]/td[1]/input')))
   
    # 받는사람 서치박스를 찾아서 데이터 입력
    input_element = driver.find_element(By.XPATH, '/html/body/table/tbody/tr[2]/td/table/tbody/tr[1]/td[1]/input')
    input_element.clear()  # 기존 입력 내용 지우기
    input_element.send_keys(str(a2_data))  # A2 셀의 데이터를 입력
    print("있다")
except Exception as e:
    print("없다", e)
   
# 엑셀 파일에서 B2 셀 읽기
excel_data = pd.read_excel("mail.xlsx", header=None)  # 파일명은 mail.xlsx 예시입니다.
b2_data = excel_data.iloc[1, 1]  # B2는 첫 번째 열(1), 두 번째 행(1)
print(b2_data)

# 제목 서치박스 xpath('/html/body/table/tbody/tr[2]/td/table/tbody/tr[7]/td/input')에 엑셀데이터 복붙.
try:
    # 웹 페이지가 완전히 로드될 때까지 대기
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '/html/body/table/tbody/tr[2]/td/table/tbody/tr[7]/td/input')))
   
    # 받는사람 서치박스를 찾아서 데이터 입력
    input_element = driver.find_element(By.XPATH, '/html/body/table/tbody/tr[2]/td/table/tbody/tr[7]/td/input')
    input_element.clear()  # 기존 입력 내용 지우기
    input_element.send_keys(str(b2_data))  # A2 셀의 데이터를 입력
    print("있다")
except Exception as e:
    print("없다", e)
 
# 메일본문 박스가 위치한 iframe(tbContentElement)으로 전환
try:
    # iframe이 로드될 때까지 대기 후 찾기
    iframe = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "tbContentElement"))  # ID로 iframe 찾기
    )
    driver.switch_to.frame(iframe)  # iframe으로 전환
    print("iframe 전환 완료")
   
    # iframe 내부의 요소에 접근하는 코드 작성
except Exception as e:
        print(f"오류 발생: {e}")    

# iframe(tbContentElement) 내부의 요소(dext_frame_DextEditor)에 접근하는 코드 작성
try:
    # iframe이 로드될 때까지 대기 후 찾기
    iframe = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "dext_frame_DextEditor"))  # ID로 iframe 찾기
    )
    driver.switch_to.frame(iframe)  # iframe으로 전환
    print("iframe 전환 완료")
   
    # iframe 내부의 요소에 접근하는 코드 작성
except Exception as e:
        print(f"오류 발생: {e}")    

# iframe(dext_frame_DextEditor) 내부의 요소(dext5_design_DextEditor)에 접근하는 코드 작성
try:
    # iframe이 로드될 때까지 대기 후 찾기
    iframe = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "dext5_design_DextEditor"))  # ID로 iframe 찾기
    )
    driver.switch_to.frame(iframe)  # iframe으로 전환
    print("iframe 전환 완료")
   
    # iframe 내부의 요소에 접근하는 코드 작성
except Exception as e:
        print(f"오류 발생: {e}")    

# 엑셀 파일에서 C2 셀 읽기
excel_data = pd.read_excel("mail.xlsx", header=None)  # 파일명은 mail.xlsx 예시입니다.
c2_data = excel_data.iloc[1, 2]  # C2는 첫 번째 열(2), 두 번째 행(1)    
print(c2_data)

# 메일본문 박스 xpath('/html/body/p[1]')에 엑셀데이터 복붙.
try:
    # 웹 페이지가 완전히 로드될 때까지 대기
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '/html/body/p[1]')))
   
    # 받는사람 서치박스를 찾아서 데이터 입력
    input_element = driver.find_element(By.XPATH, '/html/body/p[1]')
    input_element.clear()  # 기존 입력 내용 지우기
    input_element.send_keys(str(c2_data))  # A2 셀의 데이터를 입력
    print("있다")
except Exception as e:
    print("없다", e)
   
# 최상위 프레임으로 돌아가기
driver.switch_to.default_content()
 
# 발송 버튼 xpath('/html/body/table/tbody/tr[1]/td/div[1]/ul/li[1]/span') 클릭을 위한 대기
try:
    # 대기 시간 증가
    WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, '/html/body/table/tbody/tr[1]/td/div[1]/ul/li[1]/span')))
   
    # 버튼 요소 가져오기
    send_btn = driver.find_element(By.XPATH, '/html/body/table/tbody/tr[1]/td/div[1]/ul/li[1]/span')

    # 버튼이 가시적이고 클릭 가능한지 확인
    if send_btn.is_displayed() and send_btn.is_enabled():
        # JavaScript로 클릭 시도
        driver.execute_script("arguments[0].click();", send_btn)
    else:
        print("버튼이 표시되지 않거나 클릭할 수 없습니다.")
except TimeoutException:
    print("버튼을 찾는 데 시간이 초과되었습니다.")
except Exception as e:
    print(f"예외 발생: {e}")

# 1회차 종료
 

# 딜레이 주고 2회차 시작
time.sleep(2)

# 모든 윈도우 창의 핸들 가져오기
windows = driver.window_handles
print("모든 창 핸들:", windows)

# 마이오피스 창으로 포커스 이동
driver.switch_to.window(windows[0]) # 열려있는 크롬 창 1개 이므로 [0] 지정
print("포커스 창:", driver.title)

# 최상위 프레임으로 돌아가기
driver.switch_to.default_content()

# 마이오피스 버튼이 위치한 iframe(topFrame)으로 전환
driver.switch_to.frame("topFrame")

# 마이오피스 버튼 xpath('//*[@id="top_menu02(18)"]') 클릭을 위한 대기
try:
    # 대기 시간 증가
    WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, '//*[@id="top_menu02(18)"]')))
   
    # 버튼 요소 가져오기(버튼일련번호1 추가)
    Office_btn = driver.find_element(By.XPATH, '//*[@id="top_menu02(18)"]')

    # 버튼이 가시적이고 클릭 가능한지 확인
    if Office_btn.is_displayed() and Office_btn.is_enabled():
        # JavaScript로 클릭 시도
        driver.execute_script("arguments[0].click();", Office_btn)
    else:
        print("버튼이 표시되지 않거나 클릭할 수 없습니다.")
except TimeoutException:
    print("버튼을 찾는 데 시간이 초과되었습니다.")
except Exception as e:
    print(f"예외 발생: {e}")    

# 최상위 프레임으로 돌아가기
driver.switch_to.default_content()
   
# 메일쓰기 버튼이 위치한 iframe(mainframe)이 로드될 때까지 대기 후 찾기
try:
    # iframe이 로드될 때까지 대기 후 찾기
    iframe = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "mainFrame"))  # ID로 iframe 찾기
    )
    driver.switch_to.frame(iframe)  # iframe으로 전환
    print("iframe 전환 완료")
   
    # iframe 내부의 요소에 접근하는 코드 작성
except Exception as e:
        print(f"오류 발생: {e}")    
       
# iframe(mainframe) 내부의 요소(left)에 접근하는 코드 작성
# 메일쓰기 버튼이 위치한 iframe(left)이 로드될 때까지 대기 후 찾기
try:
    # iframe이 로드될 때까지 대기 후 찾기
    iframe = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.NAME, "left"))  # NAME으로 iframe 찾기
    )
    driver.switch_to.frame(iframe)  # iframe으로 전환
    print("iframe 전환 완료")      

except Exception as e:
        print(f"오류 발생: {e}")    

# 메일쓰기 버튼 XPath('/html/body/div/ul[1]/li[1]/span')의 요소가 존재하는지 확인하고 클릭하기
try:
    elem = driver.find_element(By.XPATH, '/html/body/div/ul[1]/li[1]/span').click()
    print("있다")
except:
    print("없다")
   
# 모든 윈도우 창의 핸들 가져오기
windows = driver.window_handles
print("모든 창 핸들:", windows)

# 메일쓰기 창으로 포커스 이동
driver.switch_to.window(windows[1])
print("포커스 창:", driver.title)

# 최상위 프레임으로 돌아가기
driver.switch_to.default_content()

# 엑셀 파일에서 A3 셀 읽기
excel_data = pd.read_excel("mail.xlsx", header=None)  # 파일명은 mail.xlsx 예시입니다.
print(excel_data)
a3_data = excel_data.iloc[2, 0]  # A3는 첫 번째 열(0), 두 번째 행(2)
print(a3_data)

# 받는사람 서치박스 xpath('/html/body/table/tbody/tr[2]/td/table/tbody/tr[1]/td[1]/input')의 요소가 존재하는 확인하고 엑셀데이터 복붙.
try:
    # 웹 페이지가 완전히 로드될 때까지 대기
    WebDriverWait(driver, 40).until(EC.presence_of_element_located((By.XPATH, '/html/body/table/tbody/tr[2]/td/table/tbody/tr[1]/td[1]/input')))
   
    # 받는사람 서치박스를 찾아서 데이터 입력
    input_element = driver.find_element(By.XPATH, '/html/body/table/tbody/tr[2]/td/table/tbody/tr[1]/td[1]/input')
    input_element.clear()  # 기존 입력 내용 지우기
    input_element.send_keys(str(a3_data))  # A3 셀의 데이터를 입력
    print("있다")
except Exception as e:
    print("없다", e)
   
# 엑셀 파일에서 B3 셀 읽기
excel_data = pd.read_excel("mail.xlsx", header=None)  # 파일명은 mail.xlsx 예시입니다.
b3_data = excel_data.iloc[2, 1]  # B3는 첫 번째 열(1), 두 번째 행(2)
print(b3_data)

# 제목 서치박스 xpath('/html/body/table/tbody/tr[2]/td/table/tbody/tr[7]/td/input')에 엑셀데이터 복붙.
try:
    # 웹 페이지가 완전히 로드될 때까지 대기
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '/html/body/table/tbody/tr[2]/td/table/tbody/tr[7]/td/input')))
   
    # 받는사람 서치박스를 찾아서 데이터 입력
    input_element = driver.find_element(By.XPATH, '/html/body/table/tbody/tr[2]/td/table/tbody/tr[7]/td/input')
    input_element.clear()  # 기존 입력 내용 지우기
    input_element.send_keys(str(b3_data))  # B3 셀의 데이터를 입력
    print("있다")
except Exception as e:
    print("없다", e)
 
# 메일본문 박스가 위치한 iframe(tbContentElement)으로 전환
try:
    # iframe이 로드될 때까지 대기 후 찾기
    iframe = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "tbContentElement"))  # ID로 iframe 찾기
    )
    driver.switch_to.frame(iframe)  # iframe으로 전환
    print("iframe 전환 완료")
   
    # iframe 내부의 요소에 접근하는 코드 작성
except Exception as e:
        print(f"오류 발생: {e}")    

# iframe(tbContentElement) 내부의 요소(dext_frame_DextEditor)에 접근하는 코드 작성
try:
    # iframe이 로드될 때까지 대기 후 찾기
    iframe = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "dext_frame_DextEditor"))  # ID로 iframe 찾기
    )
    driver.switch_to.frame(iframe)  # iframe으로 전환
    print("iframe 전환 완료")
   
    # iframe 내부의 요소에 접근하는 코드 작성
except Exception as e:
        print(f"오류 발생: {e}")    

# iframe(dext_frame_DextEditor) 내부의 요소(dext5_design_DextEditor)에 접근하는 코드 작성
try:
    # iframe이 로드될 때까지 대기 후 찾기
    iframe = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "dext5_design_DextEditor"))  # ID로 iframe 찾기
    )
    driver.switch_to.frame(iframe)  # iframe으로 전환
    print("iframe 전환 완료")
   
    # iframe 내부의 요소에 접근하는 코드 작성
except Exception as e:
        print(f"오류 발생: {e}")    

# 엑셀 파일에서 C3 셀 읽기
excel_data = pd.read_excel("mail.xlsx", header=None)  # 파일명은 mail.xlsx 예시입니다.
c3_data = excel_data.iloc[2, 2]  # C3는 첫 번째 열(2), 두 번째 행(2)    
print(c3_data)

# 메일본문 박스 xpath('/html/body/p[1]')에 엑셀데이터 복붙.
try:
    # 웹 페이지가 완전히 로드될 때까지 대기
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '/html/body/p[1]')))
   
    # 받는사람 서치박스를 찾아서 데이터 입력
    input_element = driver.find_element(By.XPATH, '/html/body/p[1]')
    input_element.clear()  # 기존 입력 내용 지우기
    input_element.send_keys(str(c3_data))  # C3 셀의 데이터를 입력
    print("있다")
except Exception as e:
    print("없다", e)
   
# 최상위 프레임으로 돌아가기
driver.switch_to.default_content()
 
# 발송 버튼 xpath('/html/body/table/tbody/tr[1]/td/div[1]/ul/li[1]/span') 클릭을 위한 대기
try:
    # 대기 시간 증가
    WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, '/html/body/table/tbody/tr[1]/td/div[1]/ul/li[1]/span')))
   
    # 버튼 요소 가져오기
    send_btn = driver.find_element(By.XPATH, '/html/body/table/tbody/tr[1]/td/div[1]/ul/li[1]/span')

    # 버튼이 가시적이고 클릭 가능한지 확인
    if send_btn.is_displayed() and send_btn.is_enabled():
        # JavaScript로 클릭 시도
        driver.execute_script("arguments[0].click();", send_btn)
    else:
        print("버튼이 표시되지 않거나 클릭할 수 없습니다.")
except TimeoutException:
    print("버튼을 찾는 데 시간이 초과되었습니다.")
except Exception as e:
    print(f"예외 발생: {e}")    

# 전자문서 상 동명이인인 경우 메일주소로 송부해야하며, 이때 발송 버튼 2회 실행
# 발송 버튼 xpath('/html/body/table/tbody/tr[1]/td/div[1]/ul/li[1]/span') 클릭을 위한 대기
try:
    # 대기 시간 증가
    WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, '/html/body/table/tbody/tr[1]/td/div[1]/ul/li[1]/span')))
   
    # 버튼 요소 가져오기
    send_btn = driver.find_element(By.XPATH, '/html/body/table/tbody/tr[1]/td/div[1]/ul/li[1]/span')

    # 버튼이 가시적이고 클릭 가능한지 확인
    if send_btn.is_displayed() and send_btn.is_enabled():
        # JavaScript로 클릭 시도
        driver.execute_script("arguments[0].click();", send_btn)
    else:
        print("버튼이 표시되지 않거나 클릭할 수 없습니다.")
except TimeoutException:
    print("버튼을 찾는 데 시간이 초과되었습니다.")
except Exception as e:
    print(f"예외 발생: {e}")
   
# 2회차 종료



# 딜레이 주고 3회차 시작
time.sleep(2)

# 모든 윈도우 창의 핸들 가져오기
windows = driver.window_handles
print("모든 창 핸들:", windows)

# 마이오피스 창으로 포커스 이동
driver.switch_to.window(windows[0]) # 열려있는 크롬 창 1개 이므로 [0] 지정
print("포커스 창:", driver.title)

# 최상위 프레임으로 돌아가기
driver.switch_to.default_content()

# 마이오피스 버튼이 위치한 iframe(topFrame)으로 전환
driver.switch_to.frame("topFrame")

# 마이오피스 버튼 xpath('//*[@id="top_menu02(18)"]') 클릭을 위한 대기
try:
    # 대기 시간 증가
    WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, '//*[@id="top_menu02(18)"]')))
   
    # 버튼 요소 가져오기(버튼일련번호1 추가)
    Office_btn = driver.find_element(By.XPATH, '//*[@id="top_menu02(18)"]')

    # 버튼이 가시적이고 클릭 가능한지 확인
    if Office_btn.is_displayed() and Office_btn.is_enabled():
        # JavaScript로 클릭 시도
        driver.execute_script("arguments[0].click();", Office_btn)
    else:
        print("버튼이 표시되지 않거나 클릭할 수 없습니다.")
except TimeoutException:
    print("버튼을 찾는 데 시간이 초과되었습니다.")
except Exception as e:
    print(f"예외 발생: {e}")    

# 최상위 프레임으로 돌아가기
driver.switch_to.default_content()
   
# 메일쓰기 버튼이 위치한 iframe(mainframe)이 로드될 때까지 대기 후 찾기
try:
    # iframe이 로드될 때까지 대기 후 찾기
    iframe = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "mainFrame"))  # ID로 iframe 찾기
    )
    driver.switch_to.frame(iframe)  # iframe으로 전환
    print("iframe 전환 완료")
   
    # iframe 내부의 요소에 접근하는 코드 작성
except Exception as e:
        print(f"오류 발생: {e}")    
       
# iframe(mainframe) 내부의 요소(left)에 접근하는 코드 작성
# 메일쓰기 버튼이 위치한 iframe(left)이 로드될 때까지 대기 후 찾기
try:
    # iframe이 로드될 때까지 대기 후 찾기
    iframe = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.NAME, "left"))  # NAME으로 iframe 찾기
    )
    driver.switch_to.frame(iframe)  # iframe으로 전환
    print("iframe 전환 완료")      

except Exception as e:
        print(f"오류 발생: {e}")    

# 메일쓰기 버튼 XPath('/html/body/div/ul[1]/li[1]/span')의 요소가 존재하는지 확인하고 클릭하기
try:
    elem = driver.find_element(By.XPATH, '/html/body/div/ul[1]/li[1]/span').click()
    print("있다")
except:
    print("없다")
   
# 모든 윈도우 창의 핸들 가져오기
windows = driver.window_handles
print("모든 창 핸들:", windows)

# 메일쓰기 창으로 포커스 이동
driver.switch_to.window(windows[1])
print("포커스 창:", driver.title)

# 최상위 프레임으로 돌아가기
driver.switch_to.default_content()

# 엑셀 파일에서 A4 셀 읽기
excel_data = pd.read_excel("mail.xlsx", header=None)  # 파일명은 mail.xlsx 예시입니다.
print(excel_data)
a4_data = excel_data.iloc[3, 0]  # A4는 첫 번째 열(0), 두 번째 행(3)
print(a4_data)

# 받는사람 서치박스 xpath('/html/body/table/tbody/tr[2]/td/table/tbody/tr[1]/td[1]/input')의 요소가 존재하는 확인하고 엑셀데이터 복붙.
try:
    # 웹 페이지가 완전히 로드될 때까지 대기
    WebDriverWait(driver, 40).until(EC.presence_of_element_located((By.XPATH, '/html/body/table/tbody/tr[2]/td/table/tbody/tr[1]/td[1]/input')))
   
    # 받는사람 서치박스를 찾아서 데이터 입력
    input_element = driver.find_element(By.XPATH, '/html/body/table/tbody/tr[2]/td/table/tbody/tr[1]/td[1]/input')
    input_element.clear()  # 기존 입력 내용 지우기
    input_element.send_keys(str(a4_data))  # A3 셀의 데이터를 입력
    print("있다")
except Exception as e:
    print("없다", e)
   
# 엑셀 파일에서 B4 셀 읽기
excel_data = pd.read_excel("mail.xlsx", header=None)  # 파일명은 mail.xlsx 예시입니다.
b4_data = excel_data.iloc[3, 1]  # B4는 첫 번째 열(1), 두 번째 행(3)
print(b4_data)

# 제목 서치박스 xpath('/html/body/table/tbody/tr[2]/td/table/tbody/tr[7]/td/input')에 엑셀데이터 복붙.
try:
    # 웹 페이지가 완전히 로드될 때까지 대기
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '/html/body/table/tbody/tr[2]/td/table/tbody/tr[7]/td/input')))
   
    # 받는사람 서치박스를 찾아서 데이터 입력
    input_element = driver.find_element(By.XPATH, '/html/body/table/tbody/tr[2]/td/table/tbody/tr[7]/td/input')
    input_element.clear()  # 기존 입력 내용 지우기
    input_element.send_keys(str(b4_data))  # B3 셀의 데이터를 입력
    print("있다")
except Exception as e:
    print("없다", e)
 
# 메일본문 박스가 위치한 iframe(tbContentElement)으로 전환
try:
    # iframe이 로드될 때까지 대기 후 찾기
    iframe = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "tbContentElement"))  # ID로 iframe 찾기
    )
    driver.switch_to.frame(iframe)  # iframe으로 전환
    print("iframe 전환 완료")
   
    # iframe 내부의 요소에 접근하는 코드 작성
except Exception as e:
        print(f"오류 발생: {e}")    

# iframe(tbContentElement) 내부의 요소(dext_frame_DextEditor)에 접근하는 코드 작성
try:
    # iframe이 로드될 때까지 대기 후 찾기
    iframe = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "dext_frame_DextEditor"))  # ID로 iframe 찾기
    )
    driver.switch_to.frame(iframe)  # iframe으로 전환
    print("iframe 전환 완료")
   
    # iframe 내부의 요소에 접근하는 코드 작성
except Exception as e:
        print(f"오류 발생: {e}")    

# iframe(dext_frame_DextEditor) 내부의 요소(dext5_design_DextEditor)에 접근하는 코드 작성
try:
    # iframe이 로드될 때까지 대기 후 찾기
    iframe = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "dext5_design_DextEditor"))  # ID로 iframe 찾기
    )
    driver.switch_to.frame(iframe)  # iframe으로 전환
    print("iframe 전환 완료")
   
    # iframe 내부의 요소에 접근하는 코드 작성
except Exception as e:
        print(f"오류 발생: {e}")    

# 엑셀 파일에서 C4 셀 읽기
excel_data = pd.read_excel("mail.xlsx", header=None)  # 파일명은 mail.xlsx 예시입니다.
c4_data = excel_data.iloc[3, 2]  # C4는 첫 번째 열(2), 두 번째 행(3)    
print(c4_data)

# 메일본문 박스 xpath('/html/body/p[1]')에 엑셀데이터 복붙.
try:
    # 웹 페이지가 완전히 로드될 때까지 대기
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '/html/body/p[1]')))
   
    # 받는사람 서치박스를 찾아서 데이터 입력
    input_element = driver.find_element(By.XPATH, '/html/body/p[1]')
    input_element.clear()  # 기존 입력 내용 지우기
    input_element.send_keys(str(c3_data))  # C3 셀의 데이터를 입력
    print("있다")
except Exception as e:
    print("없다", e)
   
# 최상위 프레임으로 돌아가기
driver.switch_to.default_content()
 
# 발송 버튼 xpath('/html/body/table/tbody/tr[1]/td/div[1]/ul/li[1]/span') 클릭을 위한 대기
try:
    # 대기 시간 증가
    WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, '/html/body/table/tbody/tr[1]/td/div[1]/ul/li[1]/span')))
   
    # 버튼 요소 가져오기
    send_btn = driver.find_element(By.XPATH, '/html/body/table/tbody/tr[1]/td/div[1]/ul/li[1]/span')

    # 버튼이 가시적이고 클릭 가능한지 확인
    if send_btn.is_displayed() and send_btn.is_enabled():
        # JavaScript로 클릭 시도
        driver.execute_script("arguments[0].click();", send_btn)
    else:
        print("버튼이 표시되지 않거나 클릭할 수 없습니다.")
except TimeoutException:
    print("버튼을 찾는 데 시간이 초과되었습니다.")
except Exception as e:
    print(f"예외 발생: {e}")    

# 전자문서 상 동명이인인 경우 메일주소로 송부해야하며, 이때 발송 버튼 2회 실행
# 발송 버튼 xpath('/html/body/table/tbody/tr[1]/td/div[1]/ul/li[1]/span') 클릭을 위한 대기
try:
    # 대기 시간 증가
    WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, '/html/body/table/tbody/tr[1]/td/div[1]/ul/li[1]/span')))
   
    # 버튼 요소 가져오기
    send_btn = driver.find_element(By.XPATH, '/html/body/table/tbody/tr[1]/td/div[1]/ul/li[1]/span')

    # 버튼이 가시적이고 클릭 가능한지 확인
    if send_btn.is_displayed() and send_btn.is_enabled():
        # JavaScript로 클릭 시도
        driver.execute_script("arguments[0].click();", send_btn)
    else:
        print("버튼이 표시되지 않거나 클릭할 수 없습니다.")
except TimeoutException:
    print("버튼을 찾는 데 시간이 초과되었습니다.")
except Exception as e:
    print(f"예외 발생: {e}")    
   
# 3회차 종료

 
# 웹페이지가 닫히지 않도록 사용자 입력 대기
input("웹페이지를 닫으려면 Enter 키를 누르세요...")

# 드라이버 종료
driver.quit()
728x90
반응형