33from playwright .sync_api import Page , Locator
44from pages .base_page import BasePage
55from sys import platform
6- import logging
76import pytest
87
98
@@ -16,6 +15,13 @@ def __init__(self, page: Page):
1615 self .v1_prev_month = self .page .get_by_role ("cell" , name = "‹" ).locator ("div" )
1716 self .v1_next_month = self .page .get_by_role ("cell" , name = "›" ).locator ("div" )
1817 self .v1_next_year = self .page .get_by_role ("cell" , name = "»" ).locator ("div" )
18+ self .v1_calendar_current_date = self .page .locator (
19+ 'td.title[colspan="5"][style="cursor: move;"]'
20+ )
21+ # V2 Calendar picker locators
22+ self .v2date_picker_switch = self .page .locator (
23+ 'th.datepicker-switch[colspan="5"]:visible'
24+ )
1925 # Book Appointment picker locators
2026 self .appointments_prev_month = self .page .get_by_role (
2127 "link" , name = "<-" , exact = True
@@ -98,23 +104,32 @@ def select_day(self, date: datetime) -> None:
98104 "cell" , name = day_to_select
99105 ).count ()
100106
107+ all_days = self .page .locator (".day" ).all ()
108+
109+ matching_days = [
110+ day
111+ for day in all_days
112+ if day .evaluate ("el => el.textContent.trim()" ) == day_to_select
113+ ]
114+
101115 if int (day_to_select ) < 15 and number_of_cells_with_day > 1 :
102- self .click (self . page . locator ( ".day" , has_text = day_to_select ) .first )
116+ self .click (matching_days [ 0 ] .first )
103117 elif int (day_to_select ) > 15 and number_of_cells_with_day > 1 :
104- self .click (self . page . locator ( ".day" , has_text = day_to_select ) .last )
118+ self .click (matching_days [ 0 ] .last )
105119 else :
106- self .click (self . page . locator ( ".day" , has_text = day_to_select ) )
120+ self .click (matching_days [ 0 ] )
107121
108122 def v1_calender_picker (self , date : datetime ) -> None :
109123 """
110124 This is the main method used to traverse the v1 calendar picker (e.g. the one on the subject screening search page)
111125 You provide it with a date and it will call the necessary functions to calculate how to navigate to the specified date
112126 """
113- current_date = datetime .today ()
127+ current_date = datetime .strptime (
128+ self .v1_calendar_current_date .inner_text (), "%B, %Y"
129+ )
114130 years_to_traverse , months_to_traverse = (
115131 self .calculate_years_and_months_to_traverse (date , current_date )
116132 )
117-
118133 self .traverse_years_in_v1_calendar (years_to_traverse )
119134
120135 self .traverse_months_in_v1_calendar (months_to_traverse )
@@ -132,21 +147,17 @@ def calculate_v2_calendar_variables(
132147 month_short: the wanted month is short format (e.g. Jun)
133148 current_year: the current year in yyyy format (e.g. 2025)
134149 year: the wanted year in yyyy format (e.g. 1983)
135- end_of_current_decade: the end of the current decade in yyyy format (e.g. 2029)
136150 current_decade: the current decade in yyyy format (e.g. 2020)
137151 decade: the wanted decade in yyyy format (e.g. 1980)
138- end_of_current_century: 10 years before the end of the current century in yyyy format (e.g. 2090)
139152 current_century: the current century in yyyy format (e.g. 2000/2100)
140153 century: the wanted century in yyyy format (e.g. 1900)
141154 """
142155 current_month_long = str (current_date .strftime ("%B" ))
143156 current_year = int (current_date .strftime ("%Y" ))
144157 current_century = (current_year // 100 ) * 100
145- end_of_current_century = str (current_century + 90 )
146158 current_decade = (
147159 ((current_year - current_century ) // 10 ) * 10
148160 ) + current_century
149- end_of_current_decade = str (current_decade + 9 )
150161
151162 year = int (date .strftime ("%Y" ))
152163 century = (year // 100 ) * 100
@@ -160,10 +171,8 @@ def calculate_v2_calendar_variables(
160171 month_short ,
161172 current_year ,
162173 year ,
163- end_of_current_decade ,
164174 current_decade ,
165175 decade ,
166- end_of_current_century ,
167176 current_century ,
168177 century ,
169178 )
@@ -174,10 +183,8 @@ def v2_calendar_picker_traverse_back(
174183 month_long : str ,
175184 current_year : int ,
176185 year : int ,
177- end_of_current_decade : str ,
178186 current_decade : int ,
179187 decade : int ,
180- end_of_current_century : str ,
181188 current_century : int ,
182189 century : int ,
183190 ) -> tuple [bool , bool , bool , bool ]:
@@ -193,22 +200,16 @@ def v2_calendar_picker_traverse_back(
193200 click_century = False
194201
195202 if current_month_long != month_long :
196- self .click (self .page . get_by_role ( "cell" , name = current_month_long ) )
203+ self .click (self .v2date_picker_switch )
197204 click_month = True
198205 if current_year != year :
199- self .click (
200- self .page .get_by_role ("cell" , name = str (current_year ), exact = True )
201- )
206+ self .click (self .v2date_picker_switch )
202207 click_year = True
203208 if current_decade != decade :
204- self .click (
205- self .page .get_by_role ("cell" , name = ("-" + str (end_of_current_decade )))
206- )
209+ self .click (self .v2date_picker_switch )
207210 click_decade = True
208211 if current_century != century :
209- self .click (
210- self .page .get_by_role ("cell" , name = ("-" + str (end_of_current_century )))
211- )
212+ self .click (self .v2date_picker_switch )
212213 click_century = True
213214
214215 return click_month , click_year , click_decade , click_century
@@ -250,10 +251,8 @@ def v2_calendar_picker(self, date: datetime) -> None:
250251 month_short ,
251252 current_year ,
252253 year ,
253- end_of_current_decade ,
254254 current_decade ,
255255 decade ,
256- end_of_current_century ,
257256 current_century ,
258257 century ,
259258 ) = self .calculate_v2_calendar_variables (date , current_date )
@@ -264,10 +263,8 @@ def v2_calendar_picker(self, date: datetime) -> None:
264263 month_long ,
265264 current_year ,
266265 year ,
267- end_of_current_decade ,
268266 current_decade ,
269267 decade ,
270- end_of_current_century ,
271268 current_century ,
272269 century ,
273270 )
0 commit comments