티스토리 뷰

상세 코드는 여기서 볼 수 있습니다.

github.com/choisaelim/attendcheck

 

이번 포스팅에서는 다음 작업을 해보겠습니다. IDE 툴로는 vs코드를 사용하며 크게 필요하지 않지만 Python 익스텐션을 설치하면 도움이 될 수 있습니다.

 

3. 로그인, 로그아웃

먼저 필요한 플러그인을 import 합니다.

url, idtxt, pwd는 따로 작성한 userinfo.py 파일에 정의한 변수입니다.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support import expected_conditions as EC
from userinfo import idtxt, pwd, url #userinfo.py 파일에 정의된 idtxt, pwd, url 불러옴

웹 크롤링에 사용할 브라우저 설정을 합니다.

기본 설정은 크롤링 화면이 보이게 되어 있으므로, 보이지 않게 설정하려면 다음과 같이 작성합니다.

options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)

코드 작성시에는 화면을 확인해야 하므로 이렇게 작성합니다.

driver = webdriver.Chrome(ChromeDriverManager().install())

크롬 외의 다른 브라우저 설정은 문서를 확인하세요.

pypi.org/project/webdriver-manager/

 

다음은 특정 url 페이지를 띄우고 특정 frame 안에 있는 아이디, 패스워드 입력창에 입력하고

로그인 버튼을 클릭하는 코드입니다.

로그인을 하고 페이지가 바뀌면 로그아웃 버튼이 나타나므로, 이 버튼이 나타날 때까지 기다립니다.

get / click() / find_element_by_XXX / Webelement.text / send_keys 등이 자주 쓰이는 함수입니다.

framename = 'frame3'
idbox = 'input[name="dlfma"]'
passbox = 'input[name="dkagh"]'
loginbox = '#Table_01 > tbody > tr > td > table > tbody > tr:nth-child(2) > td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(2) > label'
logoutbox = 'body > div:nth-child(3) > table:nth-child(1) > tbody > tr:nth-child(1) > td > table > tbody > tr > td:nth-child(2) > label:nth-child(15)'

driver.get(url) #url 페이지 이동
driver.switch_to.frame(driver.find_element_by_name(framename))
#찾는 항목이 frameset 안에 있는 경우 먼저 프레임을 찾아 그 프레임 안으로 이동

#css selector로 WebElement를 찾고 send_keys를 통해 아이디, 비밀번호 각각 입력
driver.find_element_by_css_selector(idbox).send_keys(idtxt)
driver.find_element_by_css_selector(passbox).send_keys(pwd)
#입력 후 로그인 버튼을 찾아 클릭한다
driver.find_element_by_css_selector(loginbox).click()

#최대 3초까지 기다린다
WebDriverWait(driver, 3).until(
  #다음 element가 로딩될 때까지
  EC.presence_of_element_located(
    #logout 버튼이 로딩될 때까지
  	(By.CSS_SELECTOR, logoutbox)
  )
)

element를 쓰일 때 자주 쓰이는 find_element_by_는 

find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector

의 종류가 있으며,

id, name, class_name과 다르게 html 코드를 보고 바로 알기 힘든 xpath, selector는

크롬 개발자 도구 창에서 해당 요소를 오른쪽 클릭, Copy > Copy selector, Copy XPath를 통해 확인 가능합니다.

크롬 콘솔에서 selector, xpath 구하기

find_elements_by_XX를 통해 여러 element 반환도 가능합니다.

관련 문서

selenium-python.readthedocs.io/locating-elements.html

 

4. 로그아웃 시간 출력

로그인을 하고 페이지가 전환될 때까지 기다렸으니 출근 / 퇴근 정보가 표시됩니다.

해당 정보가 있는 곳을 css selector로 선택하여 콘솔에 출력하고,

로그아웃하는 로직을 작성합니다.

#출퇴근 시간을 가져옵니다
tmpTime = driver.find_element_by_css_selector(outbox).text
#출퇴근 시간을 출력합니다
print(tmpTime)

#로그아웃 버튼을 누릅니다
driver.find_element_by_css_selector(logoutbox).click()

#로그아웃시 alert 창이 뜨므로, 다시 로그인을 하기 위해 이 창을 닫아줍니다.
WebDriverWait(driver, 3).until(
	#alert 창이 뜰 때까지 기다립니다.
	EC.alert_is_present()
)
#alert창으로 전환합니다.
alert = driver.switch_to.alert

alert_text = alert.text
if alert_text != '' :
	#alert 메세지가 제대로 뜰 경우 'Log out'이 뜹니다. 여기에 'Success' 메세지를 붙입니다.
	print(alert_text, ' Success!')
#alert창의 OK 버튼을 눌러 alert 창을 닫습니다
alert.accept()

5. 파이썬 함수 정의, 반복문 실행

두 번 반복해서,

첫 번째 실행이면 logout을,

두 번째 실행이면 출퇴근 시간을 출력하고 창을 닫도록 합니다.

def login_logout(index) :
    driver.get(url)
    driver.switch_to.frame(driver.find_element_by_name(framename))

    driver.find_element_by_css_selector(idbox).send_keys(idtxt)
    driver.find_element_by_css_selector(passbox).send_keys(pwd)
    driver.find_element_by_css_selector(loginbox).click()

    WebDriverWait(driver, 3).until(
        EC.presence_of_element_located(
            (By.CSS_SELECTOR, logoutbox)
        )
    )

    if index == 1:
        tmpTime = driver.find_element_by_css_selector(outbox).text
        print(tmpTime)
        driver.close()

    if index == 0:
        driver.find_element_by_css_selector(logoutbox).click()

        WebDriverWait(driver, 3).until(
            EC.alert_is_present()
        )
        alert = driver.switch_to.alert

        alert_text = alert.text
        if alert_text != '' :
            print(alert_text, ' Success!')
        alert.accept()


for i in range(0, 2):
    login_logout(i)

 

다음 포스팅엔 실행 파일을 만들겠습니다.

hanaweb.tistory.com/38

 

 

 

 

.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함