TIF_NGANJUK_E41222052/pages/profile_page.py

194 lines
6.1 KiB
Python

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class ProfilePage:
# ===============================
# LOCATORS
# ===============================
# --- Profile Display ---
EMAIL_FIELD = (By.ID, "email")
NAMA_LENGKAP_FIELD = (By.ID, "nama_lengkap")
NIM_FIELD = (By.ID, "nim")
SEMESTER_DROPDOWN = (By.ID, "semester")
ANGKATAN_DROPDOWN = (By.ID, "angkatan")
# --- Upload Foto ---
FILE_INPUT = (By.ID, "profile_image")
PROFILE_IMAGE = (By.ID, "uploadedAvatar")
RESET_BUTTON = (By.XPATH, "//a[.//span[text()='Reset']]")
# --- Buttons ---
SAVE_BUTTON = (By.XPATH, "//button[contains(text(),'Simpan Perubahan')]")
CANCEL_BUTTON = (By.XPATH, "//button[contains(text(),'Batal')]")
# --- Error Messages ---
ERROR_NAMA = (By.ID, "nama_lengkap-error")
ERROR_NIM = (By.ID, "nim-error")
ERROR_SEMESTER = (By.ID, "semester-error")
ERROR_ANGKATAN = (By.ID, "angkatan-error")
# --- Success Message ---
SUCCESS_ALERT = (By.CLASS_NAME, "alert-success")
# ===============================
# PROFILE DISPLAY METHODS
# ===============================
def __init__(self, driver):
self.driver = driver
self.wait = WebDriverWait(driver, 10)
def get_email(self):
return self.driver.find_element(*self.EMAIL_FIELD).get_attribute("value")
def is_email_readonly(self):
return self.driver.find_element(*self.EMAIL_FIELD).get_attribute("readonly") is not None
def get_nama_lengkap(self):
return self.driver.find_element(*self.NAMA_LENGKAP_FIELD).get_attribute("value")
def get_nim(self):
return self.driver.find_element(*self.NIM_FIELD).get_attribute("value")
def get_selected_semester(self):
select = Select(self.driver.find_element(*self.SEMESTER_DROPDOWN))
return select.first_selected_option.text
def get_selected_angkatan(self):
select = Select(self.driver.find_element(*self.ANGKATAN_DROPDOWN))
return select.first_selected_option.text
def get_all_semester_options(self):
"""
Mengambil seluruh opsi semester dari dropdown
Return: list of string (contoh: ["1","2","3","4","5","6","7","8"])
"""
select_element = Select(self.driver.find_element(*self.SEMESTER_DROPDOWN))
options = select_element.options
return [option.text.strip() for option in options]
def get_all_angkatan_options(self):
"""
Mengambil seluruh opsi angkatan dari dropdown
Return: list of string (contoh: ["2020","2021","3","4","5","6","7","8"])
"""
select_element = Select(self.driver.find_element(*self.ANGKATAN_DROPDOWN))
options = select_element.options
return [option.text.strip() for option in options]
# ===============================
# EDIT METHODS
# ===============================
def set_nama_lengkap(self, name):
field = self.driver.find_element(*self.NAMA_LENGKAP_FIELD)
field.clear()
field.send_keys(name)
def set_nim(self, nim):
field = self.driver.find_element(*self.NIM_FIELD)
field.clear()
field.send_keys(nim)
def select_semester(self, value):
Select(self.driver.find_element(*self.SEMESTER_DROPDOWN)).select_by_value(value)
def select_angkatan(self, value):
Select(self.driver.find_element(*self.ANGKATAN_DROPDOWN)).select_by_value(value)
# ===============================
# UPLOAD METHODS
# ===============================
def upload_photo(self, file_path):
self.driver.find_element(*self.FILE_INPUT).send_keys(file_path)
def get_profile_image_src(self):
return self.driver.find_element(*self.PROFILE_IMAGE).get_attribute("src")
def click_reset_photo(self):
wait = WebDriverWait(self.driver, 10)
reset_btn = wait.until(
EC.element_to_be_clickable(self.RESET_BUTTON)
)
self.driver.execute_script("arguments[0].scrollIntoView(true);", reset_btn)
self.driver.execute_script("arguments[0].click();", reset_btn)
# ===============================
# BUTTON ACTIONS
# ===============================
def click_save(self):
wait = WebDriverWait(self.driver, 10)
save_btn = wait.until(
EC.element_to_be_clickable(self.SAVE_BUTTON)
)
# scroll dulu supaya tidak ketutup elemen
self.driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", save_btn)
wait.until(EC.element_to_be_clickable(self.SAVE_BUTTON))
save_btn.click()
def click_cancel(self):
cancel_btn = WebDriverWait(self.driver, 10).until(
EC.element_to_be_clickable(self.CANCEL_BUTTON)
)
self.driver.execute_script("arguments[0].scrollIntoView(true);", cancel_btn)
cancel_btn.click()
# ===============================
# UTILITIES
# ===============================
def refresh_page(self):
self.driver.refresh()
def wait_until_page_loaded(self):
self.wait.until(
EC.presence_of_element_located(self.EMAIL_FIELD)
)
# ===============================
# VALIDATION MESSAGE METHODS
# ===============================
def get_error_nama(self):
return self.wait.until(
EC.visibility_of_element_located(self.ERROR_NAMA)
).text
def get_error_nim(self):
return self.wait.until(
EC.visibility_of_element_located(self.ERROR_NIM)
).text
def get_error_semester(self):
return self.wait.until(
EC.visibility_of_element_located(self.ERROR_SEMESTER)
).text
def get_error_angkatan(self):
return self.wait.until(
EC.visibility_of_element_located(self.ERROR_ANGKATAN)
).text
def wait_until_reload_after_save(self):
self.wait.until(
EC.presence_of_element_located(self.EMAIL_FIELD)
)