playwright_tests/pages/contribute/groups_page.py (170 lines of code) (raw):

from playwright_tests.core.basepage import BasePage from playwright.sync_api import Page, Locator class GroupsPage(BasePage): def __init__(self, page: Page): super().__init__(page) # General Groups Page Locators self.add_group_profile_button = page.get_by_role( "link", name="Add group profile", exact=True) # Group Page Locators self.group_avatar_image = page.locator("section#avatar-area img") self.change_uploaded_group_image_option = page.locator( "section#avatar-area p").get_by_role("link", name="Change", exact=True) self.delete_uploaded_group_image_option = page.locator( "section#avatar-area p a[title='Delete avatar']") self.change_avatar_button = page.locator("section#avatar-area p a[title='Change avatar']") self.edit_in_admin_button = page.locator("section#main-area").get_by_role( "link", name="Edit in admin", exact=True) self.group_profile_information = page.locator("div#doc-content p") self.edit_group_profile_page_header = page.locator("article#group-profile h1") self.edit_group_profile_button = page.locator("section#main-area").get_by_role( "link", name="Edit group profile", exact=True) self.edit_group_profile_textarea = page.locator("textarea#id_information") self.save_group_profile_edit_button = page.locator( "article#group-profile input[value='Save']") self.edit_group_leaders_button = page.locator("div#group-leaders").get_by_role( "link", name="Edit group leaders", exact=True) self.add_group_leader_field = page.locator("div#group-leaders input#token-input-id_users") self.add_group_leader_button = page.locator("input[value='Add Leader']") self.private_message_group_members_button = page.locator("section#main-area > p.pm a") self.user_notification = page.locator("ul.user-messages p") self.edit_group_members_option = page.locator("div#group-members").get_by_role( "link", name="Edit group members", exact=True) self.add_group_member_field = page.locator("div#group-members input#token-input-id_users") self.add_member_button = page.locator("div#group-members input[value='Add Member']") self.group_leader_list = page.locator("div#group-leaders div.info a") self.group_members_list = page.locator("div#group-members div.info a") self.group_by_name = lambda group_name: page.get_by_role( "link", name=group_name, exact=True) self.pm_a_group_user = lambda username: page.locator("div.info").get_by_role( "link", name=username, exact=True).locator("+ p a") self.search_username = lambda username: page.locator( f"//div[@class='name_search']/b[text()='{username}']") self.listed_group_user = lambda username: page.locator("div.info").get_by_role( "link", name=username, exact=True) self.listed_group_leader = lambda username: page.locator( "div#group-leaders").get_by_role("link", name=username, exact=True) # Change Avatar Page Locators self.upload_avatar_page_header = page.locator("article#change-avatar h1") self.upload_avatar_image_preview = page.locator( "//input[@id='id_avatar']/preceding-sibling::img") self.upload_avatar_browse_button = page.locator("input#id_avatar") self.upload_avatar_button = page.locator("input[type='submit']") self.upload_avatar_cancel_option = page.get_by_role("link", name="Cancel", exact=True) # Delete Avatar Page Locators self.delete_uploaded_avatar_page_header = page.locator("article#avatar-delete h1") self.delete_uploaded_avatar_image_preview = page.locator("div#avatar-preview img") self.delete_uploaded_avatar_page_info = page.locator("form p") self.delete_uploaded_avatar_button = page.locator("input[value='Delete avatar']") self.delete_uploaded_avatar_cancel_button = page.get_by_role( "link", name="Cancel", exact=True) # Remove User Page Locators self.remove_leader_page_header = page.locator("article#remove-leader h1") self.remove_user_page_header = page.locator("article#remove-member h1") self.remove_leader_button = page.locator("input[value='Remove leader']") self.remove_member_button = page.locator("input[value='Remove member']") self.remove_member_cancel_button = page.locator("div.form-actions").get_by_role( "link", name="Cancel", exact=True) self.remove_leader = lambda username: page.locator( f"//div[@class='info']/a[text()='{username}']/../..//a[@title='Remove user from " f"leaders']") self.remove_user = lambda username: page.locator( f"//div[@class='info']/a[text()='{username}']/../..//a[@title='Remove user from " f"group']" ) # Actions against the all groups page. def is_add_group_profile_button_visible(self) -> bool: """Check if the add group profile button is visible""" return self._is_element_visible(self.add_group_profile_button) def click_on_a_particular_group(self, group_name): """Click on a particular group Args: group_name (str): The name of the group to click on """ self._click(self.group_by_name(group_name)) # Actions against the group page. def get_all_leaders_name(self) -> list[str]: """Get the names of all the leaders in the group""" return self._get_text_of_elements(self.group_leader_list) def get_all_members_name(self) -> list[str]: """Get the names of all the members in the group""" return self._get_text_of_elements(self.group_members_list) def get_group_avatar_locator(self) -> Locator: """Get the locator of the group avatar image""" return self.group_avatar_image def is_change_avatar_button_visible(self) -> bool: """Check if the change avatar button is visible""" return self._is_element_visible(self.change_avatar_button) def is_edit_in_admin_button_visible(self) -> bool: """Check if the edit in admin button is visible""" return self._is_element_visible(self.edit_in_admin_button) def get_edit_group_profile_page_header(self) -> str: """Get the text of the edit group profile page header""" return self._get_text_of_element(self.edit_group_profile_page_header) def is_edit_group_profile_button_visible(self) -> bool: """Check if the edit group profile button is visible""" return self._is_element_visible(self.edit_group_profile_button) def click_on_edit_group_profile_button(self): """Click on the edit group profile button""" self._click(self.edit_group_profile_button) def get_edit_group_profile_textarea_content(self) -> str: """Get the content of the edit group profile textarea""" return self._get_element_input_value(self.edit_group_profile_textarea) def type_into_edit_group_profile_textarea(self, text: str): """Type into the edit group profile textarea Args: text (str): The text to type into the edit group profile textarea """ self._clear_field(self.edit_group_profile_textarea) self._fill(self.edit_group_profile_textarea, text) def get_profile_information(self) -> str: """Get the profile information""" return self._get_text_of_element(self.group_profile_information) def click_on_edit_group_profile_save_button(self): """Click on the save group profile edit button""" self._click(self.save_group_profile_edit_button) def is_edit_group_leaders_button_visible(self) -> bool: """Check if the edit group leaders button is visible""" return self._is_element_visible(self.edit_group_leaders_button) def is_edit_group_members_option_visible(self) -> bool: """Check if the edit group members option is visible""" return self._is_element_visible(self.edit_group_members_option) def click_on_edit_group_leaders_option(self): self._click(self.edit_group_leaders_button) def type_into_add_leader_field(self, text: str): """Type into the add leader field Args: text (str): The text to type into the add leader field """ self._type(self.add_group_leader_field, text, delay=0) def click_on_add_group_leader_button(self): self._click(self.add_group_leader_button) def click_on_pm_group_members_button(self): """Click on the PM group members button""" self._click(self.private_message_group_members_button) def click_on_pm_for_a_particular_user(self, username: str): """Click on the PM button for a particular user Args: username (str): The username of the user to click on the PM button for """ self._click(self.pm_a_group_user(username)) # Add Group member def get_group_update_notification(self) -> str: """Get the text of the user added successfully message""" return self._get_text_of_element(self.user_notification) def get_pm_group_members_button(self) -> Locator: """Get the locator of the PM group members button""" return self.private_message_group_members_button def click_on_change_uploaded_avatar_button(self): """Click on the change uploaded avatar button""" self._click(self.change_uploaded_group_image_option, expected_locator=self.upload_avatar_page_header) def click_on_delete_uploaded_avatar_button(self): """Click on the delete uploaded avatar button""" self._click(self.delete_uploaded_group_image_option) def click_on_change_avatar_button(self): """Click on the change avatar button""" self._click(self.change_avatar_button, expected_locator=self.upload_avatar_page_header) def click_on_edit_group_members(self): """Click on the edit group members option""" self._click(self.edit_group_members_option) # Actions against the change avatar page. def get_change_avatar_image_preview_locator(self) -> Locator: """Get the locator of the change avatar image preview""" return self.upload_avatar_image_preview def get_upload_avatar_page_header(self) -> str: """Get the text of the upload avatar page header""" return self._get_text_of_element(self.upload_avatar_page_header) def click_on_upload_avatar_button(self, expected_url=None): """Click on the upload avatar button""" self._click(self.upload_avatar_button, expected_url=expected_url) def click_on_upload_avatar_cancel_button(self): """Click on the upload avatar cancel button""" self._click(self.upload_avatar_cancel_option) # Actions against the delete avatar page. def get_delete_avatar_image_preview_locator(self) -> Locator: """Get the locator of the delete avatar image preview""" return self.delete_uploaded_avatar_image_preview def click_on_cancel_delete_avatar_button(self): """Click on the cancel delete avatar button""" self._click(self.delete_uploaded_avatar_cancel_button) def get_delete_avatar_page_header(self) -> str: """Get the text of the delete avatar page header""" return self._get_text_of_element(self.delete_uploaded_avatar_page_header) def is_image_preview_visible(self) -> bool: """Check if the image preview is visible""" return self._is_element_visible(self.delete_uploaded_avatar_image_preview) def get_delete_avatar_page_info(self) -> str: """Get the text of the delete avatar page info""" return self._get_text_of_element(self.delete_uploaded_avatar_page_info) def click_on_delete_avatar_button(self): """Click on the delete avatar button""" self._click(self.delete_uploaded_avatar_button) # Actions against the removal or user addition def click_on_remove_a_user_from_group_button(self, username: str, from_leaders=False): """Click on the remove a user from group button Args: username (str): The username of the user to remove from the group from_leaders (bool, optional): If True, the user will be removed from the leaders. """ if from_leaders: self._click(self.remove_leader(username)) else: self._click(self.remove_user(username)) def type_into_add_member_field(self, text: str): """Type into the add member field Args: text (str): The text to type into the add member field """ self._type(self.add_group_member_field, text, delay=0) def group_click_on_a_searched_username(self, username: str): """Click on a searched username Args: username (str): The username to click on """ self._click(self.search_username(username)) def click_on_add_member_button(self): """Click on the add member button""" self._click(self.add_member_button) def click_on_a_listed_group_user(self, username: str): """Click on a listed group user. Args: username (str): The username of the user to click on """ self._click(self.listed_group_user(username)) def click_on_a_listed_group_leader(self, username: str): """Click on a listed group leader. Args: username (str): The username of the leader to click on """ self._click(self.listed_group_leader(username)) def get_remove_leader_page_header(self) -> str: return self._get_text_of_element(self.remove_leader_page_header) def get_remove_user_page_header(self) -> str: """Get the text of the remove user page header""" return self._get_text_of_element(self.remove_user_page_header) def click_on_remove_leader_button(self): self._click(self.remove_leader_button) def click_on_remove_member_button(self): """Click on the remove member button""" self._click(self.remove_member_button) def click_on_remove_member_cancel_button(self): """Click on the remove member cancel button""" self._click(self.remove_member_cancel_button)