Skip to content

Commit fb8264a

Browse files
Further updates to POMs and methods for compartment 4 (#27)
<!-- markdownlint-disable-next-line first-line-heading --> ## Description <!-- Added new poms and methods for compartment 4 test. --> ## Context <!-- Removed hard coded locators --> ## Type of changes <!-- What types of changes does your code introduce? Put an `x` in all the boxes that apply. --> - [x] Refactoring (non-breaking change) - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would change existing functionality) - [ ] Bug fix (non-breaking change which fixes an issue) ## Checklist <!-- Go over all the following points, and put an `x` in all the boxes that apply. --> - [x] I am familiar with the [contributing guidelines](https://github.com/nhs-england-tools/playwright-python-blueprint/blob/main/CONTRIBUTING.md) - [ ] I have followed the code style of the project - [ ] I have added tests to cover my changes (where appropriate) - [ ] I have updated the documentation accordingly - [ ] This PR is a result of pair or mob programming --- ## Sensitive Information Declaration To ensure the utmost confidentiality and protect your and others privacy, we kindly ask you to NOT including [PII (Personal Identifiable Information) / PID (Personal Identifiable Data)](https://digital.nhs.uk/data-and-information/keeping-data-safe-and-benefitting-the-public) or any other sensitive data in this PR (Pull Request) and the codebase changes. We will remove any PR that do contain any sensitive information. We really appreciate your cooperation in this matter. - [x] I confirm that neither PII/PID nor sensitive data are included in this PR and the codebase changes.
1 parent 89c63b2 commit fb8264a

File tree

8 files changed

+199
-39
lines changed

8 files changed

+199
-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: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from playwright.sync_api import Page, expect
2+
from pages.base_page import BasePage
3+
4+
5+
class BookAppointmentPage(BasePage):
6+
def __init__(self, page: Page):
7+
super().__init__(page)
8+
self.page = page
9+
# Book Appointment - page locators
10+
self.screening_center_dropdown = page.locator("#UI_NEW_SCREENING_CENTRE")
11+
self.site_dropdown = page.locator("#UI_NEW_SITE")
12+
self.day_with_available_slots = page.locator(
13+
'input.twoColumnCalendar[style*="background-color: rgb(102, 255, 153);"]'
14+
).last
15+
self.appointment_time_radio_button = page.locator(
16+
page.get_by_role("radio", name="UI_NEW_SLOT_SELECTION_ID")
17+
)
18+
self.save_button = page.get_by_role("button", name="Save")
19+
20+
def select_screening_centre_dropdown_option(self, screening_centre: str) -> None:
21+
self.screening_center_dropdown.select_option(label=screening_centre)
22+
23+
def select_site_dropdown_option(self, screening_site: str) -> None:
24+
self.site_dropdown.select_option(label=screening_site)
25+
self.site_dropdown.press("Enter")
26+
27+
def choose_day_with_available_slots(self) -> None:
28+
self.click(self.day_with_available_slots)
29+
30+
def choose_appointment_time(self) -> None:
31+
self.appointment_time_radio_button.check()
32+
33+
def click_save_button(self) -> None:
34+
self.click(self.save_button)
35+
36+
def appointment_booked_confirmation_is_displayed(self, message: str) -> None:
37+
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()
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"

tests/smokescreen/test_compartment_4.py

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
@@ -46,42 +66,48 @@ def test_compartment_4(page: Page, smokescreen_properties: dict) -> None:
4666

4767
UserTools.user_login(page, "Screening Centre Manager at BCS001")
4868
BasePage(page).go_to_screening_practitioner_appointments_page()
49-
page.get_by_role("link", name="Set Availability").click()
50-
page.get_by_role("link", name="Practitioner Availability -").click()
51-
page.locator("#UI_SITE_ID").select_option(index=1)
52-
page.locator("#UI_PRACTITIONER_ID").select_option(index=1)
53-
page.get_by_role("button", name="Calendar").click()
69+
ScreeningPractitionerAppointmentsPage(page).go_to_set_availability_page()
70+
SetAvailabilityPage(page).go_to_practitioner_availability_page()
71+
PractitionerAvailabilityPage(page).select_site_dropdown_option(
72+
"THE ROYAL HOSPITAL (WOLVERHAMPTON)"
73+
)
74+
PractitionerAvailabilityPage(page).select_practitioner_dropdown_option(
75+
"Astonish, Ethanol"
76+
)
77+
PractitionerAvailabilityPage(page).click_calendar_button()
5478
CalendarPicker(page).select_day(
5579
datetime.today()
5680
) # 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
57-
page.get_by_role("button", name="Show").dblclick()
58-
page.get_by_role("textbox", name="From:").click()
59-
page.get_by_role("textbox", name="From:").fill("09:00")
60-
page.get_by_role("textbox", name="To:").click()
61-
page.get_by_role("textbox", name="To:").fill("17:15")
62-
page.get_by_role("button", name="Calculate Slots").click()
63-
page.locator("#FOR_WEEKS").click()
64-
page.locator("#FOR_WEEKS").fill("6")
65-
page.locator("#FOR_WEEKS").press("Enter")
66-
page.get_by_role("button", name="Save").click()
67-
expect(page.get_by_text("Slots Updated for 6 Weeks")).to_be_visible()
68-
Logout(page).log_out()
81+
PractitionerAvailabilityPage(page).click_show_button()
82+
PractitionerAvailabilityPage(page).enter_start_time("09:00")
83+
PractitionerAvailabilityPage(page).enter_end_time("17:15")
84+
PractitionerAvailabilityPage(page).click_calculate_slots_button()
85+
PractitionerAvailabilityPage(page).enter_number_of_weeks("6")
86+
PractitionerAvailabilityPage(page).click_save_button()
87+
PractitionerAvailabilityPage(page).slots_updated_message_is_displayed(
88+
"Slots Updated for 6 Weeks"
89+
)
90+
Logout(page).log_out(close_page=False)
6991

70-
page.get_by_role("button", name="Log in").click()
92+
ScreeningPractitionerAppointmentsPage(page).go_to_log_in_page()
7193
UserTools.user_login(page, "Hub Manager State Registered at BCS01")
7294
BasePage(page).go_to_screening_practitioner_appointments_page()
73-
page.get_by_role("link", name="Patients that Require").click()
95+
ScreeningPractitionerAppointmentsPage(page).go_to_patients_that_require_page()
7496
# Add for loop to loop x times (depends on how many we want to run it for) 70 - 79
75-
page.locator("#nhsNumberFilter").click()
76-
page.locator("#nhsNumberFilter").fill("9991406131")
77-
page.locator("#nhsNumberFilter").press("Enter")
78-
page.get_by_role("link", name="999 140 6131").click()
79-
page.get_by_label("Screening Centre ( All)").select_option("23162")
80-
page.locator("#UI_NEW_SITE").select_option("42808")
81-
page.locator('input[name="fri2"]').click() # Todays date if available
82-
page.locator("#UI_NEW_SLOT_SELECTION_ID_359119").check()
83-
page.get_by_role("button", name="Save").click()
84-
expect(page.get_by_text("Appointment booked")).to_be_visible()
97+
ColonoscopyAssessmentAppointments(page).filter_by_nhs_number("999 205 6339")
98+
ColonoscopyAssessmentAppointments(page).click_nhs_number_link("999 205 6339")
99+
BookAppointmentPage(page).select_screening_centre_dropdown_option(
100+
"BCS001 - Wolverhampton Bowel Cancer Screening Centre"
101+
)
102+
BookAppointmentPage(page).select_site_dropdown_option("Holly Hall Clinic (? km)")
103+
BookAppointmentPage(page).choose_day_with_available_slots()
104+
# page.locator("#UI_NEW_SLOT_SELECTION_ID_359119").check()
105+
# Will be revisited as part of Utilities update
106+
BookAppointmentPage(page).choose_appointment_time()
107+
BookAppointmentPage(page).click_save_button()
108+
BookAppointmentPage(page).appointment_booked_confirmation_is_displayed(
109+
"Appointment booked"
110+
)
85111

86112
batch_processing(
87113
page,
@@ -96,9 +122,10 @@ def test_compartment_4(page: Page, smokescreen_properties: dict) -> None:
96122
"GP Result (Abnormal)",
97123
"A25 - 1st Colonoscopy Assessment Appointment Booked, letter sent",
98124
)
99-
page.locator("#ID_LINK_EPISODES_img").click()
100-
page.get_by_role("link", name="FOBT Screening").click()
101-
expect(
102-
page.get_by_role("cell", name="A167 - GP Abnormal FOBT Result Sent", exact=True)
103-
).to_be_visible()
125+
126+
SubjectScreeningSummary(page).expand_episodes_list()
127+
SubjectScreeningSummary(page).click_first_fobt_episode_link()
128+
EpisodeEventsAndNotesPage(page).expected_episode_event_is_displayed(
129+
"A167 - GP Abnormal FOBT Result Sent"
130+
)
104131
Logout(page).log_out()

0 commit comments

Comments
 (0)