forked from ckh08045/AutoPercenty
109 lines
5.1 KiB
Python
109 lines
5.1 KiB
Python
from selenium.webdriver.common.by import By
|
|
from selenium.webdriver.support.ui import WebDriverWait
|
|
from selenium.webdriver.common.action_chains import ActionChains
|
|
from selenium.webdriver.support import expected_conditions as EC
|
|
from selenium.common.exceptions import TimeoutException
|
|
import logging
|
|
import time
|
|
|
|
# 로거 인스턴스 가져오기
|
|
logger = logging.getLogger('default_logger')
|
|
def click_element(driver, element_type, element_identifier, wait_time=10, click_type='normal'):
|
|
"""
|
|
주어진 요소를 찾아 클릭합니다.
|
|
|
|
Parameters:
|
|
- driver: WebDriver 인스턴스
|
|
- element_type: 요소를 찾는 방법 ('CSS_SELECTOR', 'CLASS_NAME', 'XPATH', 'ID')
|
|
- element_identifier: 요소의 식별자
|
|
- wait_time: 요소가 나타날 때까지 대기하는 시간 (초)
|
|
- click_type: 클릭 방식 ('normal' 또는 'js' 또는 'ac')
|
|
- visibility_of_element_located : 사용자가 실제로 볼 수 있고, 상호작용할 수 있는 요소에 대한 작업을 진행하기 전에 요소의 가시성을 보장
|
|
- presence_of_element_located : 페이지 로딩이 완료되었는지 확인하거나, 특정 요소가 DOM에 추가되었는지를 확인할 때
|
|
"""
|
|
try:
|
|
element = WebDriverWait(driver, wait_time).until(
|
|
EC.visibility_of_element_located((getattr(By, element_type), element_identifier))
|
|
)
|
|
|
|
if click_type == 'normal':
|
|
element.click()
|
|
elif click_type == 'js':
|
|
driver.execute_script("arguments[0].scrollIntoView();", element)
|
|
time.sleep(0.2)
|
|
driver.execute_script("arguments[0].click();", element)
|
|
elif click_type == 'ac':
|
|
actions = ActionChains(driver)
|
|
actions.move_to_element(element).perform() # 요소로 스크롤
|
|
logger.debug(f"'{element}' 요소로 스크롤 실행")
|
|
time.sleep(0.2)
|
|
ActionChains(driver).click(element).perform()
|
|
|
|
logger.debug(f"'{element_identifier}' 요소를 성공적으로 클릭함.")
|
|
|
|
except TimeoutException:
|
|
logger.error(f"'{element_identifier}' 요소를 {wait_time} 초 이내에 찾지 못함.")
|
|
except Exception as e:
|
|
logger.error(f"예상치 못한 오류 발생: {e}")
|
|
|
|
def return_element(driver, element_type, element_identifier, wait_time=10):
|
|
"""
|
|
주어진 요소를 찾아 클릭합니다.
|
|
|
|
Parameters:
|
|
- driver: WebDriver 인스턴스
|
|
- element_type: 요소를 찾는 방법 ('CSS_SELECTOR', 'CLASS_NAME', 'XPATH', 'ID')
|
|
- element_identifier: 요소의 식별자
|
|
- wait_time: 요소가 나타날 때까지 대기하는 시간 (초)
|
|
- visibility_of_element_located : 사용자가 실제로 볼 수 있고, 상호작용할 수 있는 요소에 대한 작업을 진행하기 전에 요소의 가시성을 보장
|
|
- presence_of_element_located : 페이지 로딩이 완료되었는지 확인하거나, 특정 요소가 DOM에 추가되었는지를 확인할 때
|
|
"""
|
|
try:
|
|
# 요소가 DOM에 존재하는지 확인
|
|
element_present = EC.presence_of_element_located((getattr(By, element_type), element_identifier))
|
|
element = WebDriverWait(driver, wait_time).until(element_present)
|
|
|
|
# 요소가 사용자 화면에 보이도록 스크롤
|
|
driver.execute_script("arguments[0].scrollIntoView(true);", element)
|
|
|
|
# 요소가 실제로 사용자에게 보이는지 다시 확인
|
|
element_visible = WebDriverWait(driver, wait_time).until(
|
|
EC.visibility_of_element_located((getattr(By, element_type), element_identifier))
|
|
)
|
|
|
|
logger.debug(f"'{element_visible}' 요소를 성공적으로 찾음.")
|
|
return element_visible
|
|
|
|
except TimeoutException as e:
|
|
logger.debug(f"'{element_identifier}' 요소를 {wait_time} 초 이내에 찾지 못함. 예외: {e}")
|
|
# 시각적으로 보이지 않는 경우, DOM 내 존재 여부만 확인
|
|
try:
|
|
element_in_dom = driver.find_element(getattr(By, element_type), element_identifier)
|
|
logger.debug(f"'{element_identifier}' 요소는 DOM 내에 존재하지만 보이지 않음.")
|
|
return element_in_dom
|
|
except Exception as e:
|
|
logger.debug(f"DOM 내에서도 '{element_identifier}' 요소를 찾을 수 없음. 예외: {e}")
|
|
return None
|
|
|
|
except Exception as e:
|
|
logger.debug(f"예상치 못한 오류 발생: {e}")
|
|
return None
|
|
|
|
|
|
def wait_element(driver, element_type, element_identifier, wait_time=10):
|
|
try:
|
|
element = WebDriverWait(driver, wait_time).until(
|
|
EC.visibility_of_element_located((getattr(By, element_type), element_identifier))
|
|
)
|
|
|
|
if element:
|
|
logger.debug(f"'{element_identifier}' 요소를 {wait_time} 초 이내에 찾음")
|
|
return True
|
|
except TimeoutException:
|
|
logger.error(f"에러 : '{element_identifier}' 요소를 {wait_time} 초 이내에 찾지 못함.")
|
|
return False
|
|
except Exception as e:
|
|
logger.error(f"예상치 못한 오류 발생: {e}")
|
|
return False
|
|
|
|
|