Skip to content

Commit

Permalink
- Extending playwright coverage over the group messaging system. (#6020)
Browse files Browse the repository at this point in the history
- Updating the playwright.yml to contain the group messaging system suite for both scheduled & workflow dispatch executions.
- Fix twitter profile link test since twitter is now "x".
- Fix footer test.
- Added group page to POM & flows.
  • Loading branch information
emilghittasv committed May 20, 2024
1 parent 40b3842 commit 5fa79c8
Show file tree
Hide file tree
Showing 17 changed files with 603 additions and 87 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/playwright.yml
Original file line number Diff line number Diff line change
Expand Up @@ -92,10 +92,10 @@ jobs:
if: success() || failure() && steps.create-sessions.outcome == 'success'
run: |
declare dispatch_test_suite="${{inputs.TestSuite}}"
declare all_test_suites=("homePageTests" "topNavbarTests" "footerSectionTests" "contributePagesTests" "messagingSystem" "userContributionTests" "userProfile" "userSettings" "editUserProfileTests" "userQuestions" "contactSupportPage" "productSolutionsPage" "productTopicsPage" "aaqPage" "postedQuestions" "kbProductsPage" "kbArticleCreationAndAccess" "beforeThreadTests" "articleThreads" "afterThreadTests" "kbArticleShowHistory" "recentRevisionsDashboard" "kbDashboard" "restrictedArticleCreation" "kbRestrictedVisibilitySingleGroup" "whitelistingDifferentGroup" "kbRestrictedVisibilityMultipleGroups" "removingAllArticleRestrictions" "kbRemovedRestrictions" "deleteAllRestrictedTestArticles")
declare all_test_suites=("homePageTests" "topNavbarTests" "footerSectionTests" "contributePagesTests" "messagingSystem" "messagingSystemCleanup" "userContributionTests" "userProfile" "userSettings" "editUserProfileTests" "userQuestions" "contactSupportPage" "productSolutionsPage" "productTopicsPage" "aaqPage" "postedQuestions" "kbProductsPage" "kbArticleCreationAndAccess" "beforeThreadTests" "articleThreads" "afterThreadTests" "kbArticleShowHistory" "recentRevisionsDashboard" "kbDashboard" "restrictedArticleCreation" "kbRestrictedVisibilitySingleGroup" "whitelistingDifferentGroup" "kbRestrictedVisibilityMultipleGroups" "removingAllArticleRestrictions" "kbRemovedRestrictions" "deleteAllRestrictedTestArticles")
if [ "$dispatch_test_suite" == "All" ] || [ "${{ github.event_name}}" == "schedule" ] ; then
for test in "${all_test_suites[@]}"; do
if ! poetry run pytest -m $test --numprocesses 2 --browser ${{ env.BROWSER }} --reruns 1; then
if ! poetry run pytest -m ${test} --numprocesses 2 --browser ${{ env.BROWSER }} --reruns 1; then
any_failures=true
fi
done
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,25 +14,35 @@ def complete_send_message_form_with_data(self,
recipient_username='',
message_body='',
submit_message=True):
if recipient_username != '':
if recipient_username != '' and not isinstance(recipient_username, list):
super()._type_into_new_message_to_input_field(recipient_username)
super()._click_on_a_searched_user(recipient_username)

if isinstance(recipient_username, list):
for recipient in recipient_username:
super()._type_into_new_message_to_input_field(recipient)
super()._click_on_a_searched_user(recipient)

if message_body != '':
super()._fill_into_new_message_body_textarea(message_body)

if submit_message:
super()._click_on_new_message_send_button()

def delete_message_flow(self, username: str,
def delete_message_flow(self, username='',
excerpt='',
delete_message=True,
from_sent_list=False,
from_inbox_list=False):
if from_sent_list:
super()._click_on_sent_message_delete_button(username)

if from_inbox_list:
super()._click_on_inbox_message_delete_button(username)
if from_sent_list and username != '':
super()._click_on_sent_message_delete_button_by_user(username)
elif from_sent_list and excerpt != '':
super()._click_on_sent_message_delete_button_by_excerpt(excerpt)

if from_inbox_list and username != '':
super()._click_on_inbox_message_delete_button_by_username(username)
elif from_inbox_list and excerpt != '':
super()._click_on_inbox_message_delete_button_by_excerpt(excerpt)

if delete_message:
super()._click_on_delete_page_delete_button()
19 changes: 19 additions & 0 deletions playwright_tests/flows/user_groups_flows/user_group_flow.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from playwright_tests.core.testutilities import TestUtilities
from playwright_tests.pages.contribute.groups_page import GroupsPage
from playwright.sync_api import Page


class UserGroupFlow(TestUtilities, GroupsPage):
def __init__(self, page: Page):
super().__init__(page)

def remove_a_user_from_group(self, user: str):
super()._click_on_edit_group_members()
super()._click_on_remove_a_user_from_group_button(user)
super()._click_on_remove_member_confirmation_button()

def add_a_user_to_group(self, user: str):
super()._click_on_edit_group_members()
super()._type_into_add_member_field(user)
super()._group_click_on_a_searched_username(user)
super()._click_on_add_member_button()
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
class MyProfileMessages:
STAGE_MY_PROFILE_PAGE_HEADER = "Your Account"
TWITTER_REDIRECT_LINK = "https://twitter.com/"
TWITTER_REDIRECT_LINK = "https://x.com/"
COMMUNITY_PORTAL_LINK = "https://community.mozilla.org"
PEOPLE_DIRECTORY_LINK = "https://people.mozilla.org"

Expand Down
3 changes: 3 additions & 0 deletions playwright_tests/messages/user_groups_messages.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
class UserGroupMessages:
def get_user_added_success_message(self, username: str) -> str:
return f"{username} added to the group successfully!"
46 changes: 46 additions & 0 deletions playwright_tests/pages/contribute/groups_page.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
from playwright_tests.core.basepage import BasePage
from playwright.sync_api import Page, Locator


class GroupsPage(BasePage):
__private_message_group_members_button = "//section[@id='main-area']/p[@class='pm']/a"
__user_added_notification = "//ul[@class='user-messages']//p"
__edit_group_members_option = "//div[@id='group-members']/a"
__add_group_member_field = "//div[@id='group-members']//input[@id='token-input-id_users']"
__add_member_button = "//div[@id='group-members']//input[@value='Add Member']"
__remove_user_from_group_confirmation_button = "//input[@value='Remove member']"

def __init__(self, page: Page):
super().__init__(page)

# Add Group member
def _get_user_added_successfully_message(self) -> str:
return super()._get_text_of_element(self.__user_added_notification)

def _get_pm_group_members_button(self) -> Locator:
return super()._get_element_locator(self.__private_message_group_members_button)

def _click_on_a_particular_group(self, group_name):
super()._click(f"//a[text()='{group_name}']")

def _click_on_pm_group_members_button(self):
super()._click(self.__private_message_group_members_button)

def _click_on_edit_group_members(self):
super()._click(self.__edit_group_members_option)

def _click_on_remove_a_user_from_group_button(self, username: str):
super()._click(f"//div[@class='info']/a[text()='{username}']/../..//a"
f"[@title='Remove user from group']")

def _click_on_remove_member_confirmation_button(self):
super()._click(self.__remove_user_from_group_confirmation_button)

def _type_into_add_member_field(self, text: str):
super()._type(self.__add_group_member_field, text, delay=0)

def _group_click_on_a_searched_username(self, username: str):
super()._click(f"//div[@class='name_search']/b[text()='{username}']")

def _click_on_add_member_button(self):
super()._click(self.__add_member_button)
53 changes: 36 additions & 17 deletions playwright_tests/pages/messaging_system_pages/inbox_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,22 +53,24 @@ def _get_text_of_inbox_no_message_header(self) -> str:

# Inbox messages actions.
def _get_inbox_message_subject(self, username: str) -> str:
xpath = (
return super()._get_text_of_element((
f"//div[@class='email-cell from']//a[contains(text(),'{username}')]/../..//"
f"a[@class='read']"
)
return super()._get_text_of_element(xpath)
))

# This requires a change def click_on_inbox_message_banner_close_button(self):
# self._page.locator(self.__inbox_page_message_action_banner_close_button).dispatch_event(
# type='click')

def _click_on_inbox_message_delete_button(self, username: str):
xpath_delete_button = (
def _click_on_inbox_message_delete_button_by_username(self, username: str):
super()._click((
f"//div[@class='email-cell from']//a[contains(text(),'{username}')]/../..//"
f"a[@class='delete']"
)
super()._click(xpath_delete_button)
))

def _click_on_inbox_message_delete_button_by_excerpt(self, excerpt: str):
super()._click(f"//div[@class='email-cell excerpt']/a[normalize-space(text())='{excerpt}']"
f"/../..//a[@class='delete']")

def _click_on_inbox_new_message_button(self):
super()._click(self.__inbox_new_message_button)
Expand All @@ -80,16 +82,19 @@ def _click_on_inbox_delete_selected_button(self):
super()._click(self.__inbox_delete_selected_button)

def _click_on_inbox_message_sender_username(self, username: str):
xpath = f"//div[@class='email-cell from']//a[contains(text(),'{username}')]"
super()._click(xpath)
super()._click(f"//div[@class='email-cell from']//a[contains(text(),'{username}')]")

def _inbox_message_select_checkbox_element(self) -> list[ElementHandle]:
return super()._get_element_handles(self.__inbox_delete_checkbox)
def _inbox_message_select_checkbox_element(self, excerpt='') -> list[ElementHandle]:
if excerpt != '':
return super()._get_element_handles(f"//div[@class='email-cell excerpt']"
f"/a[normalize-space(text())='{excerpt}']/../.."
f"/div[@class='email-cell check']/input")
else:
return super()._get_element_handles(self.__inbox_delete_checkbox)

def _click_on_inbox_message_subject(self, username: str):
xpath = (f"//div[@class='email-cell from']//a[contains(text(),'{username}')]/../..//"
f"a[@class='read']")
super()._click(xpath)
super()._click((f"//div[@class='email-cell from']//a[contains(text(),'{username}')]/../.."
f"//a[@class='read']"))

def _click_on_delete_page_delete_button(self):
super()._click(self.__inbox_delete_page_delete_button)
Expand All @@ -109,6 +114,14 @@ def _inbox_message(self, username: str) -> Locator:
return super()._get_element_locator(f"//div[@class='email-cell from']//a[contains(text(),"
f"'{username}')]")

def _inbox_message_based_on_excerpt(self, excerpt: str) -> Locator:
return super()._get_element_locator(f"//div[@class='email-cell excerpt']/a[normalize-space"
f"(text())='{excerpt}']")

def _inbox_message_element_handles(self, excerpt: str) -> list[ElementHandle]:
return super()._get_element_handles(f"//div[@class='email-cell excerpt']/a[normalize-space"
f"(text())='{excerpt}']")

def _are_inbox_messages_displayed(self) -> bool:
return super()._is_element_visible(self.__inbox_messages_section)

Expand All @@ -122,11 +135,17 @@ def _delete_all_inbox_messages(self):
delete_button.click()
self._click_on_delete_page_delete_button()

def _delete_all_inbox_messages_via_delete_selected_button(self):
inbox_messages_count = super()._get_element_handles(self.__inbox_messages)
def _delete_all_inbox_messages_via_delete_selected_button(self, excerpt=''):
if excerpt != '':
inbox_messages_count = self._inbox_message_element_handles(excerpt)
else:
inbox_messages_count = super()._get_element_handles(self.__inbox_messages)
counter = 0
for i in range(len(inbox_messages_count)):
inbox_checkbox = self._inbox_message_select_checkbox_element()
if excerpt != '':
inbox_checkbox = self._inbox_message_select_checkbox_element(excerpt)
else:
inbox_checkbox = self._inbox_message_select_checkbox_element()
element = inbox_checkbox[counter]
element.click()
counter += 1
Expand Down
8 changes: 8 additions & 0 deletions playwright_tests/pages/messaging_system_pages/new_message.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ class NewMessagePage(BasePage):
__new_message_search_results_bolded_characters = "//div[@class='name_search']/b"
__new_message_search_results_text = "//div[@class='name_search']"
__sent_message_page_to_user_text = "//li[@class='token-input-token-facebook']/p"
__sent_messages_page_no_user_text = ("//div[@class='token-input-dropdown-facebook']/p[text("
")='No results']")
__sent_message_page_to_user_delete_button = ("//span[@class='token-input-delete-token"
"-facebook']")

Expand Down Expand Up @@ -61,6 +63,9 @@ def _get_text_of_message_preview_username(self) -> str:
def _get_user_to_text(self) -> str:
return super()._get_text_of_element(self.__sent_message_page_to_user_text)

def _get_no_user_to_locator(self) -> Locator:
return super()._get_element_locator(self.__sent_messages_page_no_user_text)

def _get_new_message_page_header_text(self) -> str:
return super()._get_text_of_element(self.__new_message_page_header)

Expand Down Expand Up @@ -94,6 +99,9 @@ def _click_on_new_message_preview_button(self):
def _click_on_new_message_send_button(self):
super()._click(self.__new_message_send_button)

def _click_on_a_search_result(self, username: str):
super()._click(f"//div[@class='name_search' and text()='{username}']")

def _click_on_a_searched_user(self, username: str):
xpath = f"//div[@class='name_search' and text()='{username}']"
super()._click(xpath)
Expand Down
Loading

0 comments on commit 5fa79c8

Please sign in to comment.