TIF_NGANJUK_E41222052/pages/register_page.py

203 lines
6.2 KiB
Python

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class RegisterPage:
#URL = "https://hypermedialearning.sanggadewa.my.id/register"
URL = "https://hypermedialearning.project2025.id/public/register"
# ===============================
# LOCATORS
# ===============================
NAMA_LENGKAP = (By.ID, "nama_lengkap")
NIM = (By.ID, "nim")
SEMESTER = (By.ID, "semester")
ANGKATAN = (By.ID, "angkatan")
EMAIL = (By.ID, "email")
PASSWORD = (By.NAME, "password")
KONFIRMASI_PASSWORD = (By.NAME, "password_confirmation")
BUTTON_DAFTAR = (By.XPATH, "//button[@type='submit']")
ERROR_MESSAGE = (By.CLASS_NAME, "invalid-feedback")
EMAIL_ERROR_MESSAGE = (
By.XPATH,
"//*[contains(text(),'Email harus menggunakan domain')]"
)
# ===============================
# INIT
# ===============================
def __init__(self, driver):
self.driver = driver
self.wait = WebDriverWait(driver, 10)
# ===============================
# PAGE ACTIONS
# ===============================
def open(self):
self.driver.get(self.URL)
def fill_nama_lengkap(self, value: str):
field = self.wait.until(
EC.visibility_of_element_located(self.NAMA_LENGKAP)
)
field.clear()
field.send_keys(value)
def fill_nim(self, value: str):
field = self.wait.until(
EC.visibility_of_element_located(self.NIM)
)
field.clear()
field.send_keys(value)
def fill_semester(self, value: str):
field = self.wait.until(
EC.visibility_of_element_located(self.SEMESTER)
)
field.clear()
field.send_keys(value)
def fill_angkatan(self, value: str):
field = self.wait.until(
EC.visibility_of_element_located(self.ANGKATAN)
)
field.clear()
field.send_keys(value)
def fill_email(self, value: str):
field = self.wait.until(
EC.visibility_of_element_located(self.EMAIL)
)
field.clear()
field.send_keys(value)
def fill_password(self, value: str):
field = self.wait.until(
EC.visibility_of_element_located(self.PASSWORD)
)
field.clear()
field.send_keys(value)
def fill_confirm_password(self, value: str):
field = self.wait.until(
EC.visibility_of_element_located(self.KONFIRMASI_PASSWORD)
)
field.clear()
field.send_keys(value)
def click_daftar(self):
self.wait.until(
EC.element_to_be_clickable(self.BUTTON_DAFTAR)
).click()
# ===============================
# HELPER / BUSINESS METHODS
# ===============================
def fill_form(self, data: dict):
self.fill_nama_lengkap(data["nama_lengkap"])
self.fill_nim(data["nim"])
self.fill_semester(data["semester"])
self.fill_angkatan(data["angkatan"])
self.fill_email(data["email"])
self.fill_password(data["password"])
if "konfirmasi_password" in data:
self.fill_confirm_password(data["konfirmasi_password"])
pwd = self.driver.find_element(*self.PASSWORD).get_attribute("value")
cpwd = self.driver.find_element(*self.KONFIRMASI_PASSWORD).get_attribute("value")
print("PASSWORD FIELD :", repr(pwd))
print("CONFIRM FIELD :", repr(cpwd))
def submit(self):
"""Alias agar test lebih readable"""
self.click_daftar()
def get_error_messages(self):
elements = self.driver.find_elements(*self.ERROR_MESSAGE)
return [el.text for el in elements if el.text.strip()]
def has_error(self, field_name: str) -> bool:
"""
Mengecek apakah error message terkait field tertentu muncul
"""
return any(
field_name.lower() in err.lower()
for err in self.get_error_messages()
)
def is_email_domain_error_displayed(self) -> bool:
try:
return self.driver.find_element(
*self.EMAIL_ERROR_MESSAGE
).is_displayed()
except Exception:
return False
def is_register_success(self) -> bool:
"""
Register dianggap sukses jika terjadi redirect dari halaman register.
"""
self.wait.until(
lambda d: d.current_url != self.URL
)
return True
def is_field_required(self, label_text: str) -> bool:
"""
Mengecek apakah field dengan label tertentu memiliki atribut required
(HTML5 native validation)
"""
fields = {
"nama_lengkap": self.NAMA_LENGKAP,
"NIM": self.NIM,
"nim": self.NIM,
"semester": self.SEMESTER,
"angkatan": self.ANGKATAN,
"email": self.EMAIL,
"password": self.PASSWORD,
"konfirmasi_password":self.KONFIRMASI_PASSWORD,
}
locator = fields.get(label_text)
if not locator:
raise ValueError(f"Field '{label_text}' tidak dikenali")
element = self.driver.find_element(*locator)
return element.get_attribute("required") is not None
def get_value(self, field_name: str) -> str:
field = self.get_field(field_name)
return field.get_attribute("value")
def get_field(self, field_name: str):
fields = {
"nama_lengkap": self.NAMA_LENGKAP,
"NIM": self.NIM,
"nim": self.NIM,
"semester": self.SEMESTER,
"Semester": self.SEMESTER,
"angkatan": self.ANGKATAN,
"Angkatan": self.ANGKATAN,
"email": self.EMAIL,
"password": self.PASSWORD,
"konfirmasi_password":self.KONFIRMASI_PASSWORD,
}
locator = fields.get(field_name)
if not locator:
raise ValueError(f"Field '{field_name}' tidak dikenali")
return self.driver.find_element(*locator)
def has_html5_validation(self, field_name: str) -> bool:
field = self.get_field(field_name)
return field.get_attribute("validationMessage") != ""