Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion playwright_tests/flows/auth_flows/auth_flow.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from playwright.sync_api import Page
from playwright.sync_api import Page, TimeoutError as PlaywrightTimeoutError
from playwright_tests.core.utilities import Utilities
from playwright_tests.pages.auth_page import AuthPage
from playwright_tests.pages.top_navbar import TopNavbar
Expand Down Expand Up @@ -88,3 +88,19 @@ def sign_in_flow(self, username: str, account_password: str, via_top_navbar: boo
)
self.utilities.wait_for_dom_to_load()
return username, account_password

def delete_test_account_flow(self, username: str, password: str):
self.page.goto(self.utilities.different_endpoints['fxa_stage'])
try:
self.auth_page.enter_your_email_input_field.wait_for(state="visible", timeout=3500)
self.auth_page.add_data_to_email_input_field(username)
self.auth_page.click_on_enter_your_email_submit_button()
self.auth_page.add_data_to_password_input_field(password)
self.auth_page.click_on_enter_your_password_submit_button()
except PlaywrightTimeoutError:
self.auth_page.click_on_user_logged_in_sign_in_button()
self.auth_page.click_on_delete_account_button()
self.auth_page.check_all_acknowledge_fxa_page_checkboxes()
self.auth_page.click_on_continue_deletion_button()
self.auth_page.add_fxa_password(password)
self.auth_page.click_on_the_delete_confirmation_button()
10 changes: 2 additions & 8 deletions playwright_tests/flows/user_groups_flows/user_group_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,6 @@ def remove_a_user_from_group(self, user: str, is_leader=False):
user (str): The username to be removed from the group.
is_leader (bool, optional): If True, the user is a leader. Defaults
"""
self.groups_page.click_on_edit_group_leaders_option(
) if is_leader else self.groups_page.click_on_edit_group_members()

self.groups_page.click_on_remove_a_user_from_group_button(
user,True) if is_leader else (self.groups_page.
click_on_remove_a_user_from_group_button(user))
Expand All @@ -36,11 +33,8 @@ def add_a_user_to_group(self, user: str, is_leader=False):
is_leader (bool, optional): If True, the user will be added as a leader. Defaults to
False.
"""

self.groups_page.click_on_edit_group_leaders_option(
) if is_leader else self.groups_page.click_on_edit_group_members()
self.groups_page.type_into_add_leader_field(
user) if is_leader else self.groups_page.type_into_add_member_field(user)
self.groups_page.click_on_add_users_button()
self.groups_page.type_into_add_user_to_group_field(user)
self.groups_page.group_click_on_a_searched_username(user)
self.groups_page.click_on_add_group_leader_button(
) if is_leader else self.groups_page.click_on_add_member_button()
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ def __init__(self, page: Page):
"""Locators belonging to the Share Data section."""
self.share_data_button = page.locator("button#share-data")
self.troubleshooting_information_textarea = page.locator("textarea#id_troubleshooting")
self.try_these_manual_steps_link = page.locator("p#troubleshooting-manual a")
self.try_these_manual_steps_link = page.locator("div#troubleshooting-manual a")
self.show_details_option = page.locator("a[class='show']")
self.product_version_input = page.locator("input#id_ff_version")
self.product_os = page.locator("input#id_os")
Expand Down
2 changes: 1 addition & 1 deletion playwright_tests/pages/auth_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ def __init__(self, page: Page):
"link", name="Use a different account", exact=True)
self.user_logged_in_sign_in_button = page.get_by_role(
"button", name="Sign in", exact=True)
self.enter_your_email_input_field = page.locator("input[name='email']")
self.enter_your_email_input_field = page.locator("//input[@name='email']")
self.enter_your_email_submit_button = page.get_by_role(
"button", name='Sign up or sign in', exact=True)
self.enter_your_password_input_field = page.locator("input[type='password']")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ def __init__(self, page: Page):
self.learn_more_button = page.locator("div#id_scam_alert").get_by_role("link")

"""Locators belonging to the Still need help widget."""
self.aaq_widget = page.locator("div[class*='aaq-widget']")
self.aaq_button = page.locator("div[class*='aaq-widget']").get_by_role("link")
self.still_need_help_subheading = page.locator("div.aaq-widget p")

Expand Down Expand Up @@ -51,7 +52,7 @@ def __init__(self, page: Page):

"""Locators belonging to the pagination elements."""
self.pagination_item = lambda pagination_item: page.locator(
"ol[class='pagination']").get_by_role("link").filter(has_text=pagination_item)
f"//ol[@class='pagination']//a[text()={pagination_item}]")
self.selected_pagination_item = page.locator(
"ol[class='pagination'] li[class='selected']").get_by_role("link")
self.previous_pagination_item = page.locator(
Expand Down
167 changes: 78 additions & 89 deletions playwright_tests/pages/contribute/groups_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,31 +9,13 @@ def __init__(self, page: Page):
"""General locators belonging to the groups page."""
self.add_group_profile_button = page.get_by_role(
"link", name="Add group profile", exact=True)
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.edit_in_admin_button = page.locator(
"//div[@class='group-header--actions']/a[normalize-space(text())='Edit in admin']")
self.edit_group_profile_button = page.locator(
"//div[@class='group-header--actions']/a[normalize-space(text())='Edit Profile']")
self.group_profile_information = page.locator("//div[@class='group-info-content']/p")
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(
Expand All @@ -42,18 +24,39 @@ def __init__(self, page: Page):
"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_member = lambda username: page.locator(
f"//div[@id='group-members']//a[text()='{username}']")
self.listed_group_leader = lambda username: page.locator(
"div#group-leaders").get_by_role("link", name=username, exact=True)
f"//div[@id='group-leaders']//a[text()='{username}']")
self.group_avatar = page.locator("//img[@class='group-avatar']")

"""Locators belonging to the 'Edit Profile' page."""
self.edit_group_profile_page_header = page.locator("//article[@id='group-profile']/h1")
self.edit_group_profile_textarea = page.locator("//textarea[@id='id_information']")
self.save_group_profile_edit_button = page.locator("//input[@type='submit']")

"""Locators belonging to the Avatar section."""
self.change_avatar_button = page.locator("//a[normalize-space(text())='Change Avatar']")
self.delete_uploaded_group_image_option = page.locator(
"//a[normalize-space(text())='Delete Avatar']")

"""Locators belonging to the 'Manage group' section."""
self.manage_group_section = page.locator(
"//h3[@class='card--title' and text()='Manage Group']/..")
self.add_users_button = page.locator(
"//h3[@class='card--title']/..//label[@class='action-button']")
self.username_field = page.locator("//input[@id='token-input-id_users']")
self.add_to_members_button = page.locator("//button[@value='member']")
self.add_to_leaders_button = page.locator("//button[@value='leader']")

"""Locators belonging to the change avatar page."""
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_image_preview = page.locator("//img[@id='avatar-preview']")
self.upload_avatar_browse_button = page.locator("//label[@for='id_avatar']")
self.upload_avatar_button = page.locator(
"//div[@class='avatar-edit-content']//button[@type='submit']")
self.upload_avatar_cancel_option = page.get_by_role("link", name="Cancel", exact=True)
self.preview_overlay = page.locator("//div[@id='avatar-overlay']")

"""Locators belonging to the delete avatar page."""
self.delete_uploaded_avatar_page_header = page.locator("article#avatar-delete h1")
Expand All @@ -71,12 +74,11 @@ def __init__(self, page: Page):
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']")
f"//div[@class='info']/a[text()='{username}']/../../..//"
f"a[@title='Remove user from leaders']")
self.remove_user = lambda username: page.locator(
f"//div[@class='info']/a[text()='{username}']/../..//a[@title='Remove user from "
f"group']"
)
f"//div[@class='info']/a[text()='{username}']/../../..//a["
f"@title='Remove user from group']")

"""Actions against the all groups listing page locators."""
def is_add_group_profile_button_visible(self) -> bool:
Expand Down Expand Up @@ -108,10 +110,6 @@ 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)
Expand All @@ -120,48 +118,27 @@ 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 is_manage_group_section_visible(self) -> bool:
"""Check if the manage group section is visible"""
return self._is_element_visible(self.manage_group_section)

def type_into_add_leader_field(self, text: str):
"""Type into the add leader field
def click_on_add_users_button(self):
"""Click on the 'Add Users' button from the 'Manage Group' section."""
self._click(self.add_users_button)

def type_into_add_user_to_group_field(self, text: str):
"""Type into the add users input field.
Args:
text (str): The text to type into the add leader field
text (str): The text to type into the add users input field.
"""
self._type(self.add_group_leader_field, text, delay=0)
self._type(self.username_field, text, delay=0)

def click_on_add_group_leader_button(self):
self._click(self.add_group_leader_button)
self._click(self.add_to_leaders_button)

def click_on_pm_group_members_button(self):
"""Click on the PM group members button"""
Expand All @@ -175,15 +152,36 @@ def click_on_pm_for_a_particular_user(self, username: str):
"""
self._click(self.pm_a_group_user(username))

"""Actions against the 'Edit group profile page'"""
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 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 click_on_edit_group_profile_save_button(self):
"""Click on the save group profile edit button"""
self._click(self.save_group_profile_edit_button)

"""Actions against the add group member locators."""
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 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)
self._click(self.change_avatar_button, expected_locator=self.upload_avatar_page_header)

def click_on_delete_uploaded_avatar_button(self):
"""Click on the delete uploaded avatar button"""
Expand All @@ -193,10 +191,6 @@ 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 locators."""
def get_upload_avatar_page_header(self) -> str:
"""Get the text of the upload avatar page header"""
Expand Down Expand Up @@ -240,18 +234,12 @@ def click_on_remove_a_user_from_group_button(self, username: str, from_leaders=F
from_leaders (bool, optional): If True, the user will be removed from the leaders.
"""
if from_leaders:
self._hover_over_element(self.listed_group_leader(username))
self._click(self.remove_leader(username))
else:
self._hover_over_element(self.listed_group_member(username))
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

Expand All @@ -262,15 +250,15 @@ def group_click_on_a_searched_username(self, username: str):

def click_on_add_member_button(self):
"""Click on the add member button"""
self._click(self.add_member_button)
self._click(self.add_to_members_button)

def click_on_a_listed_group_user(self, username: str):
"""Click on a listed group user.
def click_on_a_listed_group_member(self, username: str):
"""Click on a listed group member.

Args:
username (str): The username of the user to click on
"""
self._click(self.listed_group_user(username))
self._click(self.listed_group_member(username))

def click_on_a_listed_group_leader(self, username: str):
"""Click on a listed group leader.
Expand All @@ -280,6 +268,7 @@ def click_on_a_listed_group_leader(self, username: str):
"""
self._click(self.listed_group_leader(username))

"""Actions against the 'Remove group members/leaders' page."""
def get_remove_leader_page_header(self) -> str:
return self._get_text_of_element(self.remove_leader_page_header)

Expand Down
2 changes: 1 addition & 1 deletion playwright_tests/pages/search/search_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ def __init__(self, page: Page):
self.searchbar_sidebar = page.locator("form#support-search-sidebar input#search-q")
self.hidden_searchbar = page.locator("form#hidden-search input#search-q")
self.searchbar_search_button = page.locator("form#support-search-masthead button")
self.search_results_header = page.locator("div[class='home-search-section--content'] h2")
self.search_results_header = page.locator("//main[@id='search-results-list']/h2")
self.popular_searches = page.locator("div[class='popular-searches'] a")
self.popular_search = lambda option: page.locator(
"p[class='popular-searches']").get_by_role("link", name=option, exact=True)
Expand Down
Loading