203 lines
6.2 KiB
Python
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") != ""
|
|
|
|
|
|
|