Skip to content

Commit ac02ab7

Browse files
Merge branch 'main' of github.com:NHSDigital/bcss-playwright into feature/BCSS-20230-compartment-4-utils
# Conflicts: # tests/smokescreen/test_compartment_4.py
2 parents 4bdac78 + fb8264a commit ac02ab7

File tree

9 files changed

+204
-39
lines changed

9 files changed

+204
-39
lines changed

pages/logout/log_out_page.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ def __init__(self, page: Page):
1313
def verify_log_out_page(self) -> None:
1414
expect(self.log_out_msg).to_be_visible()
1515

16-
def log_out(self) -> None:
17-
logging.info("Test Complete - Logging Out")
16+
def log_out(self, close_page: bool = True) -> None:
17+
logging.info("Logging Out")
1818
self.click_log_out_link()
1919
expect(self.log_out_msg).to_be_visible()
20-
self.page.close()
20+
if close_page:
21+
self.page.close()
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
from playwright.sync_api import Page, expect
2+
from pages.base_page import BasePage
3+
from utils.table_util import TableUtils
4+
5+
6+
class BookAppointmentPage(BasePage):
7+
def __init__(self, page: Page):
8+
super().__init__(page)
9+
self.page = page
10+
# Book Appointment - page locators
11+
self.screening_center_dropdown = page.locator("#UI_NEW_SCREENING_CENTRE")
12+
self.site_dropdown = page.locator("#UI_NEW_SITE")
13+
self.day_with_available_slots = page.locator(
14+
'input.twoColumnCalendar[style*="background-color: rgb(102, 255, 153);"]'
15+
).last
16+
self.appointment_time_radio_button = page.locator(
17+
page.get_by_role("radio", name="UI_NEW_SLOT_SELECTION_ID")
18+
)
19+
self.save_button = page.get_by_role("button", name="Save")
20+
self.appointments_table = TableUtils(self.page, "#displayRS")
21+
22+
def select_screening_centre_dropdown_option(self, screening_centre: str) -> None:
23+
self.screening_center_dropdown.select_option(label=screening_centre)
24+
25+
def select_site_dropdown_option(self, screening_site: str) -> None:
26+
self.site_dropdown.select_option(label=screening_site)
27+
self.site_dropdown.press("Enter")
28+
29+
def choose_day_with_available_slots(self) -> None:
30+
self.click(self.day_with_available_slots)
31+
32+
def choose_appointment_time(self) -> None:
33+
self.appointment_time_radio_button.check()
34+
35+
def click_save_button(self) -> None:
36+
self.click(self.save_button)
37+
38+
def appointment_booked_confirmation_is_displayed(self, message: str) -> None:
39+
expect(self.page.get_by_text(message)).to_be_visible()

pages/screening_practitioner_appointments/colonoscopy_assessment_appointments_page.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,16 @@ def __init__(self, page: Page):
88
self.page = page
99
# Colonoscopy Assessment Appointments - page locators
1010
self.page_header = self.page.locator("#page-title")
11+
self.nhs_number_filter_text_field = self.page.locator("#nhsNumberFilter")
1112

1213
def verify_page_header(self) -> None:
1314
expect(self.page_header).to_contain_text(
1415
"Patients that Require Colonoscopy Assessment Appointments"
1516
)
17+
18+
def filter_by_nhs_number(self, nhs_number: str) -> None:
19+
self.nhs_number_filter_text_field.fill(nhs_number)
20+
self.nhs_number_filter_text_field.press("Enter")
21+
22+
def click_nhs_number_link(self, nhs_number: str) -> None:
23+
self.click(self.page.get_by_role("link", name=nhs_number))
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
from playwright.sync_api import Page, expect
2+
from pages.base_page import BasePage
3+
4+
5+
class PractitionerAvailabilityPage(BasePage):
6+
def __init__(self, page: Page):
7+
super().__init__(page)
8+
self.page = page
9+
# Practitioner Availability - page locators
10+
self.site_id_dropdown = page.locator("#UI_SITE_ID")
11+
self.screening_practitioner_dropdown = page.locator("#UI_PRACTITIONER_ID")
12+
self.calendar_button = page.get_by_role("button", name="Calendar")
13+
self.show_button = page.get_by_role("button", name="Show")
14+
self.time_from_text_field = page.get_by_role("textbox", name="From:")
15+
self.time_to_text_field = page.get_by_role("textbox", name="To:")
16+
self.calculate_slots_button = page.get_by_role("button", name="Calculate Slots")
17+
self.number_of_weeks_text_field = page.locator("#FOR_WEEKS")
18+
self.save_button = page.get_by_role("button", name="Save")
19+
20+
def select_site_dropdown_option(self, site_to_use: str) -> None:
21+
self.site_id_dropdown.select_option(label=site_to_use)
22+
23+
def select_practitioner_dropdown_option(self, practitioner: str) -> None:
24+
self.screening_practitioner_dropdown.select_option(label=practitioner)
25+
26+
def click_calendar_button(self) -> None:
27+
self.click(self.calendar_button)
28+
29+
def click_show_button(self) -> None:
30+
self.click(self.show_button)
31+
32+
def enter_start_time(self, start_time: str) -> None:
33+
self.time_from_text_field.fill(start_time)
34+
35+
def enter_end_time(self, end_time: str) -> None:
36+
self.time_to_text_field.fill(end_time)
37+
38+
def click_calculate_slots_button(self) -> None:
39+
self.click(self.calculate_slots_button)
40+
41+
def enter_number_of_weeks(self, weeks: str) -> None:
42+
self.number_of_weeks_text_field.fill(weeks)
43+
44+
def click_save_button(self) -> None:
45+
self.click(self.save_button)
46+
47+
def slots_updated_message_is_displayed(self, message: str) -> None:
48+
expect(self.page.get_by_text(message)).to_be_visible()

pages/screening_practitioner_appointments/screening_practitioner_appointments.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,6 @@ def go_to_view_appointments_page(self) -> None:
3434

3535
def go_to_patients_that_require_page(self) -> None:
3636
self.click(self.patients_that_require_page)
37+
38+
def go_to_set_availability_page(self) -> None:
39+
self.click(self.set_availability_link)
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from playwright.sync_api import Page
2+
from pages.base_page import BasePage
3+
4+
5+
class SetAvailabilityPage(BasePage):
6+
def __init__(self, page: Page):
7+
super().__init__(page)
8+
self.page = page
9+
# Set Availability - page locators
10+
self.practitioner_availability_link = page.get_by_role(
11+
"link", name="Practitioner Availability -"
12+
)
13+
14+
def go_to_practitioner_availability_page(self) -> None:
15+
self.click(self.practitioner_availability_link)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from playwright.sync_api import Page, expect
2+
from pages.base_page import BasePage
3+
4+
5+
class EpisodeEventsAndNotesPage(BasePage):
6+
def __init__(self, page: Page):
7+
super().__init__(page)
8+
self.page = page
9+
# List of episode events and notes - page locators
10+
11+
def expected_episode_event_is_displayed(self, event_description: str) -> None:
12+
expect(
13+
self.page.get_by_role("cell", name=event_description, exact=True)
14+
).to_be_visible()

pages/screening_subject_search/subject_screening_summary.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ def __init__(self, page: Page):
1919
"link", name="Subject Events & Notes"
2020
)
2121
self.list_episodes = self.page.get_by_role("link", name="List Episodes")
22+
self.episodes_list_expander_icon = self.page.locator("#ID_LINK_EPISODES_img")
2223
self.subject_demographics = self.page.get_by_role(
2324
"link", name="Subject Demographics"
2425
)
@@ -44,6 +45,9 @@ def __init__(self, page: Page):
4445
)
4546
self.subject_search_results_title = self.page.locator("#ntshPageTitle")
4647
self.display_rs = self.page.locator("#displayRS")
48+
self.first_fobt_episode_link = page.get_by_role(
49+
"link", name="FOBT Screening"
50+
).first
4751

4852
def verify_result_contains_text(self, text) -> None:
4953
expect(self.display_rs).to_contain_text(text)
@@ -112,6 +116,12 @@ def select_change_screening_status(self, option: str) -> None:
112116
def select_reason(self, option: str) -> None:
113117
self.reason.select_option(option)
114118

119+
def expand_episodes_list(self) -> None:
120+
self.click(self.episodes_list_expander_icon)
121+
122+
def click_first_fobt_episode_link(self) -> None:
123+
self.click(self.first_fobt_episode_link)
124+
115125

116126
class ChangeScreeningStatusOptions(Enum):
117127
SEEKING_FURTHER_DATA = "4007"
Lines changed: 63 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,28 @@
1-
import logging
21
import pytest
3-
from playwright.sync_api import Page, expect
2+
from playwright.sync_api import Page
43
from pages.logout.log_out_page import Logout
54
from pages.base_page import BasePage
5+
from pages.screening_practitioner_appointments.screening_practitioner_appointments import (
6+
ScreeningPractitionerAppointmentsPage,
7+
)
8+
from pages.screening_practitioner_appointments.set_availability_page import (
9+
SetAvailabilityPage,
10+
)
11+
from pages.screening_practitioner_appointments.practitioner_availability_page import (
12+
PractitionerAvailabilityPage,
13+
)
14+
from pages.screening_practitioner_appointments.colonoscopy_assessment_appointments_page import (
15+
ColonoscopyAssessmentAppointments,
16+
)
17+
from pages.screening_practitioner_appointments.book_appointment_page import (
18+
BookAppointmentPage,
19+
)
20+
from pages.screening_subject_search.subject_screening_summary import (
21+
SubjectScreeningSummary,
22+
)
23+
from pages.screening_subject_search.episode_events_and_notes_page import (
24+
EpisodeEventsAndNotesPage,
25+
)
626
from utils.user_tools import UserTools
727
from utils.load_properties_file import PropertiesFile
828
from utils.calendar_picker import CalendarPicker
@@ -36,44 +56,50 @@ def test_compartment_4(page: Page, smokescreen_properties: dict) -> None:
3656

3757
UserTools.user_login(page, "Screening Centre Manager at BCS001")
3858
BasePage(page).go_to_screening_practitioner_appointments_page()
39-
page.get_by_role("link", name="Set Availability").click()
40-
page.get_by_role("link", name="Practitioner Availability -").click()
41-
page.locator("#UI_SITE_ID").select_option(index=1)
42-
page.locator("#UI_PRACTITIONER_ID").select_option(index=1)
43-
page.get_by_role("button", name="Calendar").click()
59+
ScreeningPractitionerAppointmentsPage(page).go_to_set_availability_page()
60+
SetAvailabilityPage(page).go_to_practitioner_availability_page()
61+
PractitionerAvailabilityPage(page).select_site_dropdown_option(
62+
"THE ROYAL HOSPITAL (WOLVERHAMPTON)"
63+
)
64+
PractitionerAvailabilityPage(page).select_practitioner_dropdown_option(
65+
"Astonish, Ethanol"
66+
)
67+
PractitionerAvailabilityPage(page).click_calendar_button()
4468
CalendarPicker(page).select_day(
4569
datetime.today()
4670
) # This will make it so that we can only run this test once a day, or we need to restore the DB back to the snapshot
47-
page.get_by_role("button", name="Show").dblclick()
48-
page.get_by_role("textbox", name="From:").click()
49-
page.get_by_role("textbox", name="From:").fill("09:00")
50-
page.get_by_role("textbox", name="To:").click()
51-
page.get_by_role("textbox", name="To:").fill("17:15")
52-
page.get_by_role("button", name="Calculate Slots").click()
53-
page.locator("#FOR_WEEKS").click()
54-
page.locator("#FOR_WEEKS").fill("6")
55-
page.locator("#FOR_WEEKS").press("Enter")
56-
page.get_by_role("button", name="Save").click()
57-
expect(page.get_by_text("Slots Updated for 6 Weeks")).to_be_visible()
58-
Logout(page).log_out()
71+
PractitionerAvailabilityPage(page).click_show_button()
72+
PractitionerAvailabilityPage(page).enter_start_time("09:00")
73+
PractitionerAvailabilityPage(page).enter_end_time("17:15")
74+
PractitionerAvailabilityPage(page).click_calculate_slots_button()
75+
PractitionerAvailabilityPage(page).enter_number_of_weeks("6")
76+
PractitionerAvailabilityPage(page).click_save_button()
77+
PractitionerAvailabilityPage(page).slots_updated_message_is_displayed(
78+
"Slots Updated for 6 Weeks"
79+
)
80+
Logout(page).log_out(close_page=False)
5981

60-
page.get_by_role("button", name="Log in").click()
82+
ScreeningPractitionerAppointmentsPage(page).go_to_log_in_page()
6183
UserTools.user_login(page, "Hub Manager State Registered at BCS01")
6284
BasePage(page).go_to_screening_practitioner_appointments_page()
63-
page.get_by_role("link", name="Patients that Require").click()
85+
ScreeningPractitionerAppointmentsPage(page).go_to_patients_that_require_page()
6486
# Add for loop to loop x times (depends on how many we want to run it for) 70 - 79
6587
nhs_number = subjects_df["subject_nhs_number"].iloc[0]
6688
nhs_number_spaced = NHSNumberTools().spaced_nhs_number(nhs_number)
67-
page.locator("#nhsNumberFilter").click()
68-
page.locator("#nhsNumberFilter").fill(nhs_number)
69-
page.locator("#nhsNumberFilter").press("Enter")
70-
page.get_by_role("link", name=nhs_number_spaced).click()
71-
page.get_by_label("Screening Centre ( All)").select_option("23162")
72-
page.locator("#UI_NEW_SITE").select_option("42808")
73-
page.locator('input[name="fri2"]').click() # Todays date if available
74-
page.locator("#UI_NEW_SLOT_SELECTION_ID_359119").check()
75-
page.get_by_role("button", name="Save").click()
76-
expect(page.get_by_text("Appointment booked")).to_be_visible()
89+
ColonoscopyAssessmentAppointments(page).filter_by_nhs_number(nhs_number)
90+
ColonoscopyAssessmentAppointments(page).click_nhs_number_link(nhs_number_spaced)
91+
BookAppointmentPage(page).select_screening_centre_dropdown_option(
92+
"BCS001 - Wolverhampton Bowel Cancer Screening Centre"
93+
)
94+
BookAppointmentPage(page).select_site_dropdown_option("Holly Hall Clinic (? km)")
95+
BookAppointmentPage(page).choose_day_with_available_slots()
96+
BookAppointmentPage(page).appointments_table.click_first_input_in_column(
97+
"Appt/Slot Time"
98+
)
99+
BookAppointmentPage(page).click_save_button()
100+
BookAppointmentPage(page).appointment_booked_confirmation_is_displayed(
101+
"Appointment booked"
102+
)
77103

78104
batch_processing(
79105
page,
@@ -88,9 +114,10 @@ def test_compartment_4(page: Page, smokescreen_properties: dict) -> None:
88114
"GP Result (Abnormal)",
89115
"A25 - 1st Colonoscopy Assessment Appointment Booked, letter sent",
90116
)
91-
page.locator("#ID_LINK_EPISODES_img").click()
92-
page.get_by_role("link", name="FOBT Screening").click()
93-
expect(
94-
page.get_by_role("cell", name="A167 - GP Abnormal FOBT Result Sent", exact=True)
95-
).to_be_visible()
117+
118+
SubjectScreeningSummary(page).expand_episodes_list()
119+
SubjectScreeningSummary(page).click_first_fobt_episode_link()
120+
EpisodeEventsAndNotesPage(page).expected_episode_event_is_displayed(
121+
"A167 - GP Abnormal FOBT Result Sent"
122+
)
96123
Logout(page).log_out()

0 commit comments

Comments
 (0)