1+ from datetime import datetime
12from playwright .sync_api import Page , Locator
23from pages .base_page import BasePage
34from typing import Dict
45
6+ # Assume you have a CalendarPicker utility in your project
7+ from utils .calendar_picker import CalendarPicker
8+
59class SpineSearchPage :
610 """
711 Page object for the Spine Search screen, enabling demographic searches
@@ -15,35 +19,68 @@ def __init__(self, page: Page):
1519 self .retrieve_data_link = self .page .get_by_role ("link" , name = "Retrieve Data from Spine" )
1620 self .demographics_radio = self .page .get_by_role ("radio" , name = "Demographics" )
1721 self .date_of_birth_field = self .page .locator ("#dateOfBirth" )
18-
19- # Represents the calendar cell for the 6th day in the date picker
20- self .date = self .page .get_by_role ("cell" , name = "6" ).first
21-
2222 self .surname_field = self .page .locator ("#surname" )
2323 self .forename_field = self .page .locator ("#forename" )
2424 self .gender_dropdown = self .page .locator ("#gender" )
2525 self .postcode_field = self .page .locator ("#postcode" )
2626 self .search_button = self .page .get_by_role ("button" , name = "Search" )
27- self .alert_message = self .page .get_by_role ( " alert" )
27+ self .alert_message = self .page .locator ( ".spine- alert" )
2828
29- def navigate_to_spine_search (self ):
29+ # CalendarPicker utility instance
30+ self .calendar_picker = CalendarPicker (self .page )
31+
32+ def navigate_to_spine_search (self ) -> None :
33+ """
34+ Navigates to the Spine Search screen by clicking the appropriate link
35+ and loading the target URL.
36+ """
3037 self .retrieve_data_link .click ()
3138 self .page .goto (self .spine_url )
3239
33- def select_demographic_search (self ):
40+ def select_demographic_search (self ) -> None :
41+ """
42+ Selects the 'Demographics' radio button to enable demographic search mode.
43+ """
3444 self .demographics_radio .check ()
3545
36- def enter_search_criteria (self , dob : str , surname : str , forename : str , gender : str , postcode : str ):
46+ def enter_search_criteria (
47+ self , dob : str , surname : str , forename : str , gender : str , postcode : str
48+ ) -> None :
49+ """
50+ Fills in the demographic search fields with the provided values.
51+
52+ Args:
53+ dob (str): Date of birth in string format (e.g., "06 May 1940").
54+ surname (str): Subject's surname.
55+ forename (str): Subject's forename.
56+ gender (str): Gender value ("Male" or "Female").
57+ postcode (str): Subject's postcode.
58+ """
59+
60+ # Convert dob string to datetime object
61+ dob_dt = datetime .strptime (dob , "%d %b %Y" ) # Adjust format if needed
3762 self .date_of_birth_field .click ()
38- self .date . click ()
63+ self .calendar_picker . v2_calendar_picker ( dob_dt ) # dob should be in a supported format, e.g. "YYYY-MM-DD"
3964 self .surname_field .fill (surname )
4065 self .forename_field .fill (forename )
4166 gender_option = {"Male" : "1" , "Female" : "2" }.get (gender , "1" )
4267 self .gender_dropdown .select_option (gender_option )
4368 self .postcode_field .fill (postcode )
4469
45- def perform_search (self ):
70+ def perform_search (self ) -> None :
71+ """
72+ Clicks the 'Search' button to initiate the Spine demographic search.
73+ """
4674 self .search_button .click ()
4775
4876 def get_spine_alert_message (self ) -> str :
49- return self .alert_message .inner_text () if self .alert_message .is_visible () else ""
77+ alert_locator = self .page .locator (".spine-alert" ) # Update selector if needed
78+ try :
79+ alert_locator .wait_for (state = "visible" , timeout = 5000 )
80+ return alert_locator .inner_text ().strip ()
81+ except TimeoutError :
82+ print ("Alert message not visible within timeout." )
83+ return ""
84+ except Exception as e :
85+ print (f"Unexpected error while fetching alert: { e } " )
86+ return ""
0 commit comments