110 lines
3.8 KiB
Python
110 lines
3.8 KiB
Python
"""
|
|
Feedback Survey Page Object Model
|
|
|
|
Handles overall test feedback modal.
|
|
Scope: feedback_survey
|
|
"""
|
|
from selenium.webdriver.common.by import By
|
|
from pages.base_page import BasePage
|
|
|
|
|
|
class FeedbackSurveyPage(BasePage):
|
|
"""Page Object for Feedback Survey Modal"""
|
|
|
|
# Locators using data-testid (scope: feedback_survey)
|
|
OVERALL_MODAL = (By.CSS_SELECTOR, "[data-testid='feedback_survey__overall_modal']")
|
|
PER_QUESTION_MODAL = (By.CSS_SELECTOR, "[data-testid='feedback_survey__per_question_modal']")
|
|
SUBMIT_BUTTON = (By.CSS_SELECTOR, "[data-testid='feedback_survey__submit_button']")
|
|
|
|
def __init__(self, driver):
|
|
"""Initialize Feedback Survey Page"""
|
|
super().__init__(driver)
|
|
|
|
def is_overall_modal_present(self):
|
|
"""Check if overall feedback modal is present"""
|
|
try:
|
|
return self.is_element_visible(self.OVERALL_MODAL, timeout=5)
|
|
except:
|
|
return False
|
|
|
|
def is_per_question_modal_present(self):
|
|
"""Check if per-question feedback modal is present"""
|
|
try:
|
|
return self.is_element_visible(self.PER_QUESTION_MODAL, timeout=5)
|
|
except:
|
|
return False
|
|
|
|
def set_overall_rating(self, rating):
|
|
"""
|
|
Set overall rating (1-5)
|
|
|
|
Args:
|
|
rating: Rating value (1-5)
|
|
"""
|
|
rating_locator = (By.CSS_SELECTOR, f"[data-testid='feedback_survey__overall_rating_{rating}']")
|
|
self.click_element(rating_locator)
|
|
|
|
def set_question_rating(self, question_id, rating):
|
|
"""
|
|
Set rating for a specific question
|
|
|
|
Args:
|
|
question_id: Question ID
|
|
rating: Rating value (1-5)
|
|
"""
|
|
rating_locator = (By.CSS_SELECTOR, f"[data-testid='feedback_survey__question_{question_id}_rating_{rating}']")
|
|
self.click_element(rating_locator)
|
|
|
|
def set_question_comment(self, question_id, comment):
|
|
"""
|
|
Set comment for a specific question
|
|
|
|
Args:
|
|
question_id: Question ID
|
|
comment: Comment text
|
|
"""
|
|
comment_locator = (By.CSS_SELECTOR, f"[data-testid='feedback_survey__question_{question_id}_comment']")
|
|
self.send_keys(comment_locator, comment)
|
|
|
|
def submit_feedback(self):
|
|
"""Submit feedback survey"""
|
|
self.click_element(self.SUBMIT_BUTTON)
|
|
# Wait for modal to close
|
|
self.wait.wait_for_element_invisible(self.OVERALL_MODAL)
|
|
self.wait.wait_for_element_invisible(self.PER_QUESTION_MODAL)
|
|
|
|
def is_final_feedback_available(self):
|
|
"""Check if any final feedback modal is available"""
|
|
return self.is_overall_modal_present() or self.is_per_question_modal_present()
|
|
|
|
def get_feedback_questions(self):
|
|
"""
|
|
Get all feedback question IDs
|
|
|
|
Returns:
|
|
list: List of question IDs
|
|
"""
|
|
import re
|
|
questions = self.driver.find_elements(By.CSS_SELECTOR, "[data-testid^='feedback_survey__question_']")
|
|
question_ids = set()
|
|
for question in questions:
|
|
test_id = question.get_attribute("data-testid")
|
|
if test_id:
|
|
match = re.search(r'question_(\d+)_', test_id)
|
|
if match:
|
|
question_ids.add(match.group(1))
|
|
return list(question_ids)
|
|
|
|
def select_overall_rating(self, rating):
|
|
"""Alias for set_overall_rating"""
|
|
self.set_overall_rating(rating)
|
|
|
|
def select_question_rating(self, question_id, rating):
|
|
"""Alias for set_question_rating"""
|
|
self.set_question_rating(question_id, rating)
|
|
|
|
def enter_question_comment(self, question_id, comment):
|
|
"""Alias for set_question_comment"""
|
|
self.set_question_comment(question_id, comment)
|
|
|