finsh commit
This commit is contained in:
107
page_objects/dynamic_content_page.py
Normal file
107
page_objects/dynamic_content_page.py
Normal file
@@ -0,0 +1,107 @@
|
||||
import time
|
||||
from selenium.webdriver.common.by import By
|
||||
from .base_page import BasePage
|
||||
|
||||
class DynamicContentPage(BasePage):
|
||||
"""
|
||||
Page Object for the Dynamic Content test page.
|
||||
"""
|
||||
|
||||
# --- Locators ---
|
||||
_DELAYED_TEXT = (By.ID, "delayed-text")
|
||||
_ENABLE_BUTTON = (By.XPATH, "//button[text()='Enable Button']")
|
||||
_INITIALLY_DISABLED_BUTTON = (By.XPATH, "//button[text()='Initially Disabled']")
|
||||
By.XPATH, '//*[@id="radix-«r0»-trigger-password"]'
|
||||
_ACCOUNT_TAB = (By.XPATH, "//button[@role='tab' and contains(@id,'trigger-account')]")
|
||||
_PASSWORD_TAB = (By.XPATH, "//button[@role='tab' and contains(@id,'trigger-password')]")
|
||||
_ACTIVE_TAB_CONTENT = (By.XPATH, "//div[@role='tabpanel' and @data-state='active']")
|
||||
_SHOW_ALERT_BUTTON = (By.XPATH, "//button[text()='Show Alert']")
|
||||
_OPEN_MODAL_BUTTON = (By.XPATH, "//button[text()='Open Modal']")
|
||||
_MODAL_TITLE = (By.ID, "radix-") # This ID is dynamic, a better locator is needed.
|
||||
# A better locator for the modal title would be:
|
||||
_MODAL_TITLE_BETTER = (By.XPATH, "//h2[text()='Modal Title']")
|
||||
|
||||
|
||||
def __init__(self, driver):
|
||||
"""Initializes the DynamicContentPage with the WebDriver."""
|
||||
super().__init__(driver)
|
||||
self.page_path = "/dynamic-content"
|
||||
|
||||
# --- Page Actions ---
|
||||
|
||||
def open(self):
|
||||
"""Navigates to the dynamic content page."""
|
||||
self.open_url(self.page_path)
|
||||
|
||||
def get_delayed_text(self) -> str:
|
||||
"""
|
||||
Waits for the delayed text to be visible and returns its content.
|
||||
The wait is handled by find_visible_element.
|
||||
"""
|
||||
# We need to wait for the text "Loading..." to disappear first.
|
||||
# This is a more complex wait condition. For simplicity, we'll just wait for visibility.
|
||||
time.sleep(4)
|
||||
element = self.find_visible_element(self._DELAYED_TEXT)
|
||||
return element.text
|
||||
|
||||
def click_enable_button(self):
|
||||
"""Clicks the button that enables the initially disabled button."""
|
||||
self.click(self._ENABLE_BUTTON)
|
||||
|
||||
def is_initially_disabled_button_enabled(self) -> bool:
|
||||
"""Checks if the initially disabled button is now enabled."""
|
||||
return self.is_element_enabled(self._INITIALLY_DISABLED_BUTTON)
|
||||
|
||||
def switch_to_tab(self, tab_name: str):
|
||||
"""
|
||||
Switches to the specified tab.
|
||||
:param tab_name: 'account' or 'password'.
|
||||
"""
|
||||
if tab_name.lower() == 'account':
|
||||
self.click(self._ACCOUNT_TAB)
|
||||
elif tab_name.lower() == 'password':
|
||||
self.click(self._PASSWORD_TAB)
|
||||
else:
|
||||
raise ValueError("Invalid tab name. Must be 'account' or 'password'.")
|
||||
time.sleep(1) # Add a short delay to allow the tab content to update
|
||||
|
||||
def get_active_tab_content(self) -> str:
|
||||
"""
|
||||
Gets the text of the currently visible tab panel.
|
||||
This requires checking which panel is visible.
|
||||
"""
|
||||
element = self.find_visible_element(self._ACTIVE_TAB_CONTENT)
|
||||
return element.text
|
||||
|
||||
|
||||
# def get_active_tab_content(self) -> str:
|
||||
# """
|
||||
# Gets the text of the currently active tab panel based on hidden attribute.
|
||||
# """
|
||||
# panels = [self._ACCOUNT_TAB_CONTENT, self._PASSWORD_TAB_CONTENT]
|
||||
# for panel in panels:
|
||||
# element = self.find_element(panel)
|
||||
# if element.get_attribute("hidden") in [None, "false"]:
|
||||
# return element.text
|
||||
# return ""
|
||||
|
||||
def trigger_alert(self):
|
||||
"""Clicks the button to show a browser alert."""
|
||||
self.click(self._SHOW_ALERT_BUTTON)
|
||||
|
||||
def get_alert_text_and_accept(self) -> str:
|
||||
"""Switches to an alert, gets its text, and accepts it."""
|
||||
alert = self.switch_to_alert()
|
||||
text = alert.text
|
||||
alert.accept()
|
||||
return text
|
||||
|
||||
def open_modal(self):
|
||||
"""Clicks the button to open the modal dialog."""
|
||||
self.click(self._OPEN_MODAL_BUTTON)
|
||||
|
||||
def get_modal_title(self) -> str:
|
||||
"""Waits for the modal to be visible and returns its title."""
|
||||
# Using the more robust locator
|
||||
title_element = self.find_visible_element(self._MODAL_TITLE_BETTER)
|
||||
return title_element.text
|
||||
Reference in New Issue
Block a user