CP_AUTOMATION/pages/domain_feedback_page.py
2025-12-12 19:54:54 +05:30

134 lines
4.8 KiB
Python

"""
Domain Feedback Page Object Model
Handles per-domain feedback modal.
Scope: domain_feedback
"""
from selenium.webdriver.common.by import By
from pages.base_page import BasePage
class DomainFeedbackPage(BasePage):
"""Page Object for Domain Feedback Modal"""
# Locators using data-testid (scope: domain_feedback)
MODAL = (By.CSS_SELECTOR, "[data-testid='domain_feedback__modal']")
MODAL_CONTENT = (By.CSS_SELECTOR, "[data-testid='domain_feedback__modal__content']")
QUESTION1 = (By.CSS_SELECTOR, "[data-testid='domain_feedback__question1']")
QUESTION1_YES = (By.CSS_SELECTOR, "[data-testid='domain_feedback__question1_yes']")
QUESTION1_NO = (By.CSS_SELECTOR, "[data-testid='domain_feedback__question1_no']")
QUESTION1_JUSTIFICATION = (By.CSS_SELECTOR, "[data-testid='domain_feedback__question1_justification']")
QUESTION2 = (By.CSS_SELECTOR, "[data-testid='domain_feedback__question2']")
QUESTION2_TEXTAREA = (By.CSS_SELECTOR, "[data-testid='domain_feedback__question2_textarea']")
SUBMIT_BUTTON = (By.CSS_SELECTOR, "[data-testid='domain_feedback__submit_button']")
def __init__(self, driver):
"""Initialize Domain Feedback Page"""
super().__init__(driver)
def is_modal_present(self):
"""
Check if domain feedback modal is present
Returns:
bool: True if modal is visible
"""
try:
return self.is_element_visible(self.MODAL, timeout=5)
except:
return False
def has_question1_yes_no(self):
"""Check if question 1 has yes/no options"""
try:
return (self.is_element_visible(self.QUESTION1_YES, timeout=1) or
self.is_element_visible(self.QUESTION1_NO, timeout=1))
except:
return False
def has_question1_reason(self):
"""Check if question 1 has reason textarea"""
try:
return self.is_element_visible(self.QUESTION1_TEXTAREA, timeout=1)
except:
return False
def has_question2_textarea(self):
"""Check if question 2 textarea exists"""
try:
return self.is_element_visible(self.QUESTION2_TEXTAREA, timeout=1)
except:
return False
def select_question1_yes(self):
"""Select Yes for question 1"""
self.click_element(self.QUESTION1_YES)
def enter_question1_reason(self, text):
"""Enter reason for question 1"""
self.send_keys(self.QUESTION1_TEXTAREA, text)
def enter_question2_text(self, text):
"""Enter text for question 2"""
self.send_keys(self.QUESTION2_TEXTAREA, text)
def click_submit(self):
"""Click submit button"""
self.click_element(self.SUBMIT_BUTTON)
def answer_question1(self, yes=True):
"""
Answer question 1 (yes/no)
Args:
yes: True for yes, False for no
"""
if yes:
self.click_element(self.QUESTION1_YES)
else:
self.click_element(self.QUESTION1_NO)
def fill_question1_justification(self, text):
"""Fill question 1 justification textarea (appears when No is selected)"""
self.send_keys(self.QUESTION1_JUSTIFICATION, text)
def fill_question1_textarea(self, text):
"""Alias for fill_question1_justification"""
self.fill_question1_justification(text)
def fill_question2_textarea(self, text):
"""Fill question 2 textarea"""
self.send_keys(self.QUESTION2_TEXTAREA, text)
def submit_feedback(self, question1_yes=True, question1_justification="", question2_text=""):
"""
Complete and submit domain feedback
Args:
question1_yes: Answer to question 1 (True for Yes, False for No)
question1_justification: Justification text for question 1 (required if question1_yes=False)
question2_text: Text for question 2
"""
if not self.is_modal_present():
raise Exception("Domain feedback modal is not present")
# Answer question 1
self.answer_question1(question1_yes)
# Fill justification if "No" was selected
if not question1_yes and question1_justification:
# Wait for justification textarea to appear
self.wait.wait_for_element_visible(self.QUESTION1_JUSTIFICATION, timeout=3)
self.send_keys(self.QUESTION1_JUSTIFICATION, question1_justification)
# Fill question 2
if question2_text:
self.send_keys(self.QUESTION2_TEXTAREA, question2_text)
# Submit
self.click_element(self.SUBMIT_BUTTON)
# Wait for modal to close and redirect to domains page
self.wait.wait_for_element_invisible(self.MODAL, timeout=10)
self.wait.wait_for_url_contains("/domains")