Merge pull request #6359 from emilghittasv/playwright-add-more-group-tests

Playwright handle wait timeouts and add new AAQ topics for AAQ test coverage
This commit is contained in:
Emil Ghitta 2024-11-20 10:44:22 +02:00 коммит произвёл GitHub
Родитель c760798d79 c6316d9532
Коммит 247ccc36a9
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
17 изменённых файлов: 264 добавлений и 162 удалений

Просмотреть файл

@ -14,14 +14,14 @@ class BasePage:
This helper function returns the element locator from a given xpath.
"""
if with_wait:
self._wait_for_dom_load_to_finish()
self.wait_for_dom_to_load()
return self.page.locator(xpath)
def _get_elements_locators(self, xpath: str) -> list[Locator]:
"""
This helper function returns a list of element locators from a given xpath.
"""
self._wait_for_dom_load_to_finish()
self.wait_for_dom_to_load()
return self.page.locator(xpath).all()
def _get_current_page_url(self) -> str:
@ -80,7 +80,7 @@ class BasePage:
if isinstance(element, str):
return self._get_element_locator(element).get_attribute(attribute)
elif isinstance(element, list):
self._wait_for_dom_load_to_finish()
self.wait_for_dom_to_load()
values = []
for element in element:
values.append(element.get_attribute(attribute))
@ -127,7 +127,7 @@ class BasePage:
element (Union[str, ElementHandle]): The element locator to interact with.
check (bool): Whether to check or uncheck the checkbox.
"""
self.page.wait_for_load_state("networkidle")
self.wait_for_networkidle()
for attempt in range(retries):
try:
locator = self._get_element_locator(element) if isinstance(
@ -155,7 +155,7 @@ class BasePage:
expected_url (str): The expected URL to wait for after the click.
with_force (bool): Whether to force the click.
"""
self.page.wait_for_load_state("networkidle")
self.wait_for_networkidle()
for attempt in range(retries):
try:
element_locator = self._get_element_locator(element) if isinstance(
@ -178,14 +178,14 @@ class BasePage:
"""
This helper function clicks on a given element locator based on a given index.
"""
self.page.wait_for_load_state("networkidle")
self.wait_for_networkidle()
self._get_element_locator(xpath).nth(index).click()
def _click_on_first_item(self, xpath: str):
"""
This helper function clicks on the first item from a given web element locator list.
"""
self.page.wait_for_load_state("networkidle")
self.wait_for_networkidle()
self._get_element_locator(xpath).first.click()
def _fill(self, xpath: str, text: str):
@ -267,15 +267,6 @@ class BasePage:
"""
return self._get_element_locator(xpath).is_checked()
def _wait_for_dom_load_to_finish(self):
"""
This helper function performs two waits:
1. Waits for the dom load to finish.
2. Waits for the load event to be fired when the whole page, including resources has loaded
"""
self.page.wait_for_load_state("domcontentloaded")
self.page.wait_for_load_state("load")
def _wait_for_selector(self, xpath: str, timeout=3500):
"""
This helper function waits for a given element locator to be visible based on a given
@ -295,3 +286,30 @@ class BasePage:
y (int): The y-coordinate.
"""
self.page.mouse.move(x, y)
def wait_for_page_to_load(self):
"""
This helper function awaits for the load event to be fired.
"""
try:
self.page.wait_for_load_state("load")
except PlaywrightTimeoutError:
print("Load event was not fired. Continuing...")
def wait_for_dom_to_load(self):
"""
This helper function awaits for the DOMContentLoaded event to be fired.
"""
try:
self.page.wait_for_load_state("domcontentloaded")
except PlaywrightTimeoutError:
print("DOMContentLoaded event was not fired. Continuing...")
def wait_for_networkidle(self):
"""
This helper function waits until there are no network connections for at least 500ms.
"""
try:
self.page.wait_for_load_state("networkidle")
except PlaywrightTimeoutError:
print("Network idle state was not reached. Continuing...")

Просмотреть файл

@ -175,7 +175,7 @@ class Utilities:
"""
This helper function navigates directly to the SUMO hompage.
"""
self.page.goto(HomepageMessages.STAGE_HOMEPAGE_URL)
self.navigate_to_link(HomepageMessages.STAGE_HOMEPAGE_URL)
def navigate_to_link(self, link: str):
"""
@ -262,19 +262,28 @@ class Utilities:
"""
This helper function awaits for the load event to be fired.
"""
self.page.wait_for_load_state("load")
try:
self.page.wait_for_load_state("load")
except PlaywrightTimeoutError:
print("Load event was not fired. Continuing...")
def wait_for_dom_to_load(self):
"""
This helper function awaits for the DOMContentLoaded event to be fired.
"""
self.page.wait_for_load_state("domcontentloaded")
try:
self.page.wait_for_load_state("domcontentloaded")
except PlaywrightTimeoutError:
print("DOMContentLoaded event was not fired. Continuing...")
def wait_for_networkidle(self):
"""
This helper function waits until there are no network connections for at least 500ms.
"""
self.page.wait_for_load_state("networkidle")
try:
self.page.wait_for_load_state("networkidle")
except PlaywrightTimeoutError:
print("Network idle state was not reached. Continuing...")
def store_session_cookies(self, session_file_name: str):
"""
@ -340,7 +349,10 @@ class Utilities:
"""
This helper function performs a page reload.
"""
self.page.reload(wait_until="networkidle")
try:
self.page.reload(wait_until="networkidle")
except PlaywrightTimeoutError:
print("Network idle state was not reached. Continuing...")
def get_user_agent(self) -> str:
"""
@ -575,6 +587,22 @@ class Utilities:
"""
return page.request.get(api_url)
def post_api_request(self, page: Page, api_url: str, data: dict):
"""Post the API request
Args:
page (Page): The page object
api_url (str): The API URL
data (dict): The data to be posted
"""
# It seems that playwright doesn't send the correct origin header by default.
headers = {
'origin': HomepageMessages.STAGE_HOMEPAGE_URL
}
return page.request.post(api_url, form=data, headers=headers)
def block_request(self, route):
"""
This function blocks a certain request
@ -601,3 +629,10 @@ class Utilities:
if attempt < 2:
continue
break
def get_csrfmiddlewaretoken(self) -> str:
"""
This helper function fetches the csrfmiddlewaretoken from the page.
"""
return self.page.evaluate("document.querySelector('input[name=csrfmiddlewaretoken]')"
".value")

Просмотреть файл

@ -1,5 +1,8 @@
from playwright.sync_api import Page
from typing import Any
from slugify import slugify
from playwright_tests.core.utilities import Utilities
from playwright_tests.flows.explore_articles_flows.article_flows.add_kb_media_flow import \
AddKbMediaFlow
@ -48,7 +51,7 @@ class AddKbArticleFlow:
approve_first_revision=False,
ready_for_localization=False
) -> dict[str, Any]:
self.page.goto(KBArticlePageMessages.CREATE_NEW_KB_ARTICLE_STAGE_URL)
self.utilities.navigate_to_link(KBArticlePageMessages.CREATE_NEW_KB_ARTICLE_STAGE_URL)
kb_article_test_data = self.utilities.kb_article_test_data
@ -314,3 +317,56 @@ class AddKbArticleFlow:
"revision_time": revision_time,
"changes_description": self.utilities.kb_article_test_data['changes_description']
}
def kb_article_creation_via_api(self, page: Page, approve_revision=False,
is_template=False) -> dict[str, Any]:
kb_article_test_data = self.utilities.kb_article_test_data
self.utilities.navigate_to_link(KBArticlePageMessages.CREATE_NEW_KB_ARTICLE_STAGE_URL)
if is_template:
kb_title = (kb_article_test_data["kb_template_title"] + self.utilities.
generate_random_number(0, 5000))
category = "60"
else:
kb_title = (kb_article_test_data["kb_article_title"] + self.utilities.
generate_random_number(0, 5000))
category = "10"
slug = slugify(kb_title)
form_data = {
"csrfmiddlewaretoken": self.utilities.get_csrfmiddlewaretoken(),
"title": kb_title,
"slug": slug,
"category": category,
"is_localizable": "on",
"products": "1",
"topics": "383",
"allow_discussion": "on",
"keywords": kb_article_test_data["keywords"],
"summary": kb_article_test_data["search_result_summary"],
"content": kb_article_test_data["article_content"],
"expires": "",
"based_on": "",
"comment": kb_article_test_data["changes_description"]
}
response = self.utilities.post_api_request(
page, KBArticlePageMessages.CREATE_NEW_KB_ARTICLE_STAGE_URL, data=form_data
)
print(response)
self.utilities.navigate_to_link(response.url)
first_revision_id = self.kb_article_show_history_page.get_last_revision_id()
if approve_revision:
self.approve_kb_revision(first_revision_id)
return {"article_title": kb_title,
"article_content": kb_article_test_data["article_content"],
"article_slug": slug,
"keyword": kb_article_test_data["keywords"],
"search_results_summary": kb_article_test_data["search_result_summary"],
"article_url": response.url.removesuffix("/history"),
"article_show_history_url": self.utilities.get_page_url(),
"first_revision_id": first_revision_id,
"article_review_description": kb_article_test_data["changes_description"]
}

Просмотреть файл

@ -99,4 +99,4 @@ class KBArticleEditMetadata(BasePage):
def click_on_save_changes_button(self):
self._click(self.__save_changes_button)
self._wait_for_dom_load_to_finish()
self.wait_for_page_to_load()

Просмотреть файл

@ -237,7 +237,7 @@ class InboxPage(BasePage):
excerpt: The excerpt of the message.
expected_url: The expected URL after deleting all the messages.
"""
self._wait_for_dom_load_to_finish()
self.wait_for_dom_to_load()
if excerpt != '':
inbox_messages_count = self._inbox_message_element_handles(excerpt)
else:

Просмотреть файл

@ -83,10 +83,12 @@
},
"Firefox for Enterprise": {
"Accounts": "accounts",
"Browse": "browse",
"Installation and updates": "installation-and-updates",
"Performance and connectivity": "performance-and-connectivity",
"Privacy and security": "privacy-and-security",
"Settings": "settings",
"default_slug": "none"
"default_slug": "firefox-enterprise"
},
"Thunderbird": {
"Accessibility": "accessibility",
@ -98,16 +100,22 @@
"Privacy and security": "privacy-and-security",
"Search, tag, and share": "search-tag-and-share",
"Settings": "settings",
"default_slug": "none"
"default_slug": "thunderbird"
},
"Thunderbird for Android": {
"Accessibility": "accessibility",
"Accounts": "accounts",
"Email and messaging": "email-and-messaging",
"Installation and updates": "installation-and-updates",
"Passwords and sign in": "passwords-and-sign-in",
"Performance and connectivity": "performance-and-connectivity",
"Privacy and security": "privacy-and-security",
"Search, tag, and share": "search-tag-and-share",
"Settings": "settings",
"default_slug": "thunderbird-android"
},
"Firefox Focus": {
"Browse": "browse",
"Installation and updates": "installation-and-updates",
"Performance and connectivity": "performance-and-connectivity",
"Privacy and security": "privacy-and-security",

Просмотреть файл

@ -1,7 +1,6 @@
import allure
import pytest
from pytest_check import check
from playwright.sync_api import expect, TimeoutError, Page
from playwright_tests.core.utilities import Utilities
from playwright_tests.messages.ask_a_question_messages.AAQ_messages.aaq_widget import (
@ -13,7 +12,9 @@ from playwright_tests.pages.sumo_pages import SumoPages
# C890370, C890374
@pytest.mark.productSolutionsPage
def test_featured_articles_redirect(page: Page):
def test_featured_articles_redirect(page: Page, is_chromium):
if is_chromium:
pytest.skip("Skipping this test for chromium browser")
utilities = Utilities(page)
sumo_pages = SumoPages(page)
with allure.step("Accessing the contact support page via the top navbar Get Help > "

Просмотреть файл

@ -15,8 +15,8 @@ def navigate_to_homepage(page: Page):
object.
"""
utilities = Utilities(page)
# Set default navigation timeout to 2 minutes.
page.set_default_navigation_timeout(120000)
# Set default navigation timeout to 30 seconds.
page.set_default_navigation_timeout(30000)
# Block pontoon requests in the current page context.
page.route("**/pontoon.mozilla.org/**", utilities.block_request)
@ -36,7 +36,7 @@ def navigate_to_homepage(page: Page):
page.context.on("response", handle_502_error)
# Navigate to the SUMO stage homepage.
page.goto(HomepageMessages.STAGE_HOMEPAGE_URL)
utilities.navigate_to_link(HomepageMessages.STAGE_HOMEPAGE_URL)
return page

Просмотреть файл

@ -20,9 +20,7 @@ def test_unreviewed_articles_visibility_in_kb_dashboard(page: Page):
))
with allure.step("Create a new simple article"):
article_details = sumo_pages.submit_kb_article_flow.submit_simple_kb_article()
sumo_pages.kb_article_page.click_on_article_option()
article_url = utilities.get_page_url()
article_details = sumo_pages.submit_kb_article_flow.kb_article_creation_via_api(page)
with allure.step("Navigating to the kb dashboards and clicking on the 'Complete "
"overview' option"):
@ -75,7 +73,7 @@ def test_unreviewed_articles_visibility_in_kb_dashboard(page: Page):
sumo_pages.kb_dashboard_page._click_on_article_title(article_details['article_title'])
with allure.step("Verifying that the user is redirected to the correct kb page"):
expect(page).to_have_url(article_url)
expect(page).to_have_url(article_details['article_url'])
with allure.step("Approving the article revision"):
sumo_pages.submit_kb_article_flow.approve_kb_revision(article_details['first_revision_id'])
@ -134,13 +132,10 @@ def test_kb_dashboard_articles_status(page: Page):
))
with allure.step("Creating a new simple article"):
article_details = sumo_pages.submit_kb_article_flow.submit_simple_kb_article(
approve_first_revision=True
)
article_details = sumo_pages.submit_kb_article_flow.kb_article_creation_via_api(
page=page,approve_revision=True)
article_url = utilities.get_page_url()
with allure.step("Creating a anew revision for the document"):
with allure.step("Creating a new revision for the document"):
second_revision = sumo_pages.submit_kb_article_flow.submit_new_kb_revision()
with check, allure.step("Navigating to the kb overview dashboard and verifying that the "
@ -154,7 +149,7 @@ def test_kb_dashboard_articles_status(page: Page):
)
with allure.step("Navigating back to the article history and deleting the revision"):
utilities.navigate_to_link(article_url)
utilities.navigate_to_link(article_details["article_show_history_url"])
sumo_pages.kb_article_show_history_page.click_on_delete_revision_button(
second_revision['revision_id']
)
@ -184,11 +179,10 @@ def test_kb_dashboard_revision_deferred_status(page: Page):
))
with allure.step("Creating a new simple article"):
article_details = sumo_pages.submit_kb_article_flow.submit_simple_kb_article(
approve_first_revision=True
)
article_details = sumo_pages.submit_kb_article_flow.kb_article_creation_via_api(
page=page,approve_revision=True)
article_url = utilities.get_page_url()
article_show_history_url = utilities.get_page_url()
with allure.step("Creating a new revision for the document"):
second_revision = sumo_pages.submit_kb_article_flow.submit_new_kb_revision()
@ -202,7 +196,7 @@ def test_kb_dashboard_revision_deferred_status(page: Page):
second_revision['changes_description'])
with allure.step("Navigating back to the article history page and deferring the revision"):
utilities.navigate_to_link(article_url)
utilities.navigate_to_link(article_show_history_url)
sumo_pages.kb_article_show_history_page.click_on_review_revision(
second_revision['revision_id']
)
@ -217,7 +211,7 @@ def test_kb_dashboard_revision_deferred_status(page: Page):
) == kb_dashboard_page_messages.KB_LIVE_STATUS
with allure.step("Deleting the article"):
utilities.navigate_to_link(article_url)
utilities.navigate_to_link(article_show_history_url)
sumo_pages.kb_article_deletion_flow.delete_kb_article()
@ -232,11 +226,8 @@ def test_kb_dashboard_needs_update_when_reviewing_a_revision(page: Page):
))
with allure.step("Creating a new simple article"):
article_details = sumo_pages.submit_kb_article_flow.submit_simple_kb_article(
approve_first_revision=True
)
article_url = utilities.get_page_url()
article_details = sumo_pages.submit_kb_article_flow.kb_article_creation_via_api(
page=page,approve_revision=True)
with allure.step("Creating an new article revision for the document"):
second_revision = sumo_pages.submit_kb_article_flow.submit_new_kb_revision()
@ -252,7 +243,7 @@ def test_kb_dashboard_needs_update_when_reviewing_a_revision(page: Page):
).strip() == utilities.kb_revision_test_data['needs_change_message']
with allure.step("Deleting the article"):
utilities.navigate_to_link(article_url)
utilities.navigate_to_link(article_details["article_show_history_url"])
sumo_pages.kb_article_deletion_flow.delete_kb_article()
@ -268,11 +259,8 @@ def test_kb_dashboard_needs_update_edit_metadata(page: Page):
))
with allure.step("Create a new simple article"):
article_details = sumo_pages.submit_kb_article_flow.submit_simple_kb_article(
approve_first_revision=True
)
article_url = utilities.get_page_url()
article_details = sumo_pages.submit_kb_article_flow.kb_article_creation_via_api(
page=page, approve_revision=True)
with allure.step("Clicking on the 'Edit Article Metadata' option and enabling the 'Needs "
"change with comment' option"):
@ -289,7 +277,7 @@ def test_kb_dashboard_needs_update_edit_metadata(page: Page):
with allure.step("Navigating back to the article's 'Edit Article Metadata' page and "
"removing the comment from the needs change textarea"):
utilities.navigate_to_link(article_url)
utilities.navigate_to_link(article_details["article_show_history_url"])
sumo_pages.edit_article_metadata_flow.edit_article_metadata(needs_change=True)
with allure.step("Navigating to the complete dashboard list and verifying that the "
@ -301,7 +289,7 @@ def test_kb_dashboard_needs_update_edit_metadata(page: Page):
with allure.step("Navigating back to the article's 'Edit Article Metadata' page and "
"removing the needs change updates"):
utilities.navigate_to_link(article_url)
utilities.navigate_to_link(article_details["article_show_history_url"])
sumo_pages.edit_article_metadata_flow.edit_article_metadata()
with check, allure.step("Navigating to the kb overview page and verifying that the "
@ -312,7 +300,7 @@ def test_kb_dashboard_needs_update_edit_metadata(page: Page):
)
with allure.step("Deleting the article"):
utilities.navigate_to_link(article_url)
utilities.navigate_to_link(article_details["article_show_history_url"])
sumo_pages.kb_article_deletion_flow.delete_kb_article()
@ -328,11 +316,9 @@ def test_ready_for_l10n_kb_dashboard_revision_approval(page: Page):
))
with allure.step("Create a new simple article"):
article_details = sumo_pages.submit_kb_article_flow.submit_simple_kb_article()
article_details = sumo_pages.submit_kb_article_flow.kb_article_creation_via_api(page=page)
article_url = utilities.get_page_url()
revision_id = sumo_pages.kb_article_show_history_page.get_last_revision_id()
revision_id = article_details['first_revision_id']
with allure.step("Approving the first revision and marking it as ready for l10n"):
sumo_pages.submit_kb_article_flow.approve_kb_revision(
@ -346,7 +332,7 @@ def test_ready_for_l10n_kb_dashboard_revision_approval(page: Page):
) == kb_dashboard_page_messages.GENERAL_POSITIVE_STATUS
with allure.step("Deleting the article"):
utilities.navigate_to_link(article_url)
utilities.navigate_to_link(article_details["article_show_history_url"])
sumo_pages.kb_article_deletion_flow.delete_kb_article()
@ -362,11 +348,8 @@ def test_ready_for_l10n_kb_dashboard_revision_l10n_status(page: Page):
))
with allure.step("Creating a new kb article"):
article_details = sumo_pages.submit_kb_article_flow.submit_simple_kb_article(
approve_first_revision=True
)
article_url = utilities.get_page_url()
article_details = sumo_pages.submit_kb_article_flow.kb_article_creation_via_api(
page=page, approve_revision=True)
with check, allure.step("Navigating to the kb dashboard overview page and verifying that "
"the correct l10n status is displayed"):
@ -377,7 +360,7 @@ def test_ready_for_l10n_kb_dashboard_revision_l10n_status(page: Page):
with allure.step("Navigating back to the article page and marking the revision as ready "
"for l10n"):
utilities.navigate_to_link(article_url)
utilities.navigate_to_link(article_details["article_show_history_url"])
sumo_pages.kb_article_show_history_page.click_on_ready_for_l10n_option(
article_details['first_revision_id']
)
@ -391,7 +374,7 @@ def test_ready_for_l10n_kb_dashboard_revision_l10n_status(page: Page):
) == kb_dashboard_page_messages.GENERAL_POSITIVE_STATUS
with allure.step("Navigating to the article and deleting it"):
utilities.navigate_to_link(article_url)
utilities.navigate_to_link(article_details["article_show_history_url"])
sumo_pages.kb_article_deletion_flow.delete_kb_article()
@ -490,11 +473,8 @@ def test_article_title_update(page: Page):
))
with allure.step("Creating a new kb article"):
article_details = sumo_pages.submit_kb_article_flow.submit_simple_kb_article(
approve_first_revision=True
)
article_url = utilities.get_page_url()
article_details = sumo_pages.submit_kb_article_flow.kb_article_creation_via_api(
page=page, approve_revision=True)
with allure.step("Navigating to the kb dashboard overview page and verifying that the "
"correct title is displayed"):
@ -507,7 +487,7 @@ def test_article_title_update(page: Page):
with allure.step("Navigating to the article's 'Edit Metadata page' page and changing the "
"title"):
utilities.navigate_to_link(article_url)
utilities.navigate_to_link(article_details["article_show_history_url"])
new_article_title = "Updated " + article_details['article_title']
sumo_pages.edit_article_metadata_flow.edit_article_metadata(title=new_article_title)
@ -519,5 +499,5 @@ def test_article_title_update(page: Page):
).to_be_visible()
with allure.step("Deleting the kb article"):
utilities.navigate_to_link(article_url)
utilities.navigate_to_link(article_details["article_show_history_url"])
sumo_pages.kb_article_deletion_flow.delete_kb_article()

Просмотреть файл

@ -23,9 +23,7 @@ def test_recent_revisions_revision_availability(page: Page):
username = sumo_pages.top_navbar.get_text_of_logged_in_username()
with allure.step("Creating a new kb article"):
article_details = sumo_pages.submit_kb_article_flow.submit_simple_kb_article()
article_url = utilities.get_page_url()
article_details = sumo_pages.submit_kb_article_flow.kb_article_creation_via_api(page=page)
with allure.step("Navigating to the recent revisions dashboard and verifying that the "
"posted article is displayed for admin accounts"):
@ -89,7 +87,7 @@ def test_recent_revisions_revision_availability(page: Page):
))
with allure.step("Navigating to the article page and deleting it"):
utilities.navigate_to_link(article_url)
utilities.navigate_to_link(article_details["article_show_history_url"])
sumo_pages.kb_article_deletion_flow.delete_kb_article()
with allure.step("Navigating back to the recent revisions page and verifying that the "
@ -115,11 +113,8 @@ def test_second_revisions_availability(page: Page):
))
with allure.step("Creating a new kb article"):
article_details = sumo_pages.submit_kb_article_flow.submit_simple_kb_article(
approve_first_revision=True
)
article_url = utilities.get_page_url()
article_details = sumo_pages.submit_kb_article_flow.kb_article_creation_via_api(
page=page, approve_revision=True)
with allure.step("Signing in with a non-admin account"):
utilities.start_existing_session(utilities.username_extraction_from_email(
@ -175,7 +170,7 @@ def test_second_revisions_availability(page: Page):
).to_be_visible()
with allure.step("Navigating to the article and approving the revision"):
utilities.navigate_to_link(article_url)
utilities.navigate_to_link(article_details["article_show_history_url"])
sumo_pages.submit_kb_article_flow.approve_kb_revision(second_revision['revision_id'])
utilities.wait_for_given_timeout(1000)
@ -205,7 +200,7 @@ def test_second_revisions_availability(page: Page):
utilities.start_existing_session(utilities.username_extraction_from_email(
utilities.user_secrets_accounts["TEST_ACCOUNT_MODERATOR"]
))
utilities.navigate_to_link(article_url)
utilities.navigate_to_link(article_details["article_show_history_url"])
sumo_pages.kb_article_deletion_flow.delete_kb_article()
with allure.step("Navigating back to the recent revision dashboard, signing out and "
@ -246,12 +241,8 @@ def test_recent_revisions_dashboard_links(page: Page):
first_username = sumo_pages.top_navbar.get_text_of_logged_in_username()
with allure.step("Creating a new kb article"):
article_details = sumo_pages.submit_kb_article_flow.submit_simple_kb_article(
approve_first_revision=True
)
sumo_pages.kb_article_page.click_on_article_option()
article_url = utilities.get_page_url()
article_details = sumo_pages.submit_kb_article_flow.kb_article_creation_via_api(
page=page, approve_revision=True)
with allure.step("Navigating to the recent revisions dashboard and verifying that the "
"'Show Diff' option is not available for first revisions"):
@ -265,7 +256,7 @@ def test_recent_revisions_dashboard_links(page: Page):
with allure.step("Navigating to the article page, signing in with a non-admin user and "
"creating a new revision for the article"):
utilities.navigate_to_link(article_url)
utilities.navigate_to_link(article_details['article_url'])
utilities.start_existing_session(utilities.username_extraction_from_email(
utilities.user_secrets_accounts["TEST_ACCOUNT_13"]
))
@ -282,7 +273,7 @@ def test_recent_revisions_dashboard_links(page: Page):
article_title=article_details['article_title'], username=username
)
expect(page).to_have_url(
article_url + KBArticleRevision.
article_details['article_url'] + KBArticleRevision.
KB_REVISION_PREVIEW + str(utilities.number_extraction_from_string(
second_revision['revision_id']
))
@ -298,7 +289,7 @@ def test_recent_revisions_dashboard_links(page: Page):
sumo_pages.recent_revisions_page._click_on_article_title(
article_title=article_details['article_title'], creator=username
)
expect(page).to_have_url(article_url)
expect(page).to_have_url(article_details['article_url'])
with check, allure.step("Navigating back and verifying that the correct comment is "
"displayed"):
@ -333,7 +324,7 @@ def test_recent_revisions_dashboard_links(page: Page):
utilities.start_existing_session(utilities.username_extraction_from_email(
utilities.user_secrets_accounts["TEST_ACCOUNT_MODERATOR"]
))
utilities.navigate_to_link(article_url)
utilities.navigate_to_link(article_details['article_url'])
sumo_pages.kb_article_deletion_flow.delete_kb_article()
@ -349,12 +340,8 @@ def test_recent_revisions_dashboard_title_and_username_update(page: Page):
first_username = sumo_pages.top_navbar.get_text_of_logged_in_username()
with allure.step("Creating a new kb article"):
article_details = sumo_pages.submit_kb_article_flow.submit_simple_kb_article(
approve_first_revision=True
)
sumo_pages.kb_article_page.click_on_article_option()
article_url = utilities.get_page_url()
article_details = sumo_pages.submit_kb_article_flow.kb_article_creation_via_api(
page=page, approve_revision=True)
with allure.step("Changing the article title via the 'Edit Article Metadata' page"):
sumo_pages.edit_article_metadata_flow.edit_article_metadata(
@ -390,7 +377,7 @@ def test_recent_revisions_dashboard_title_and_username_update(page: Page):
)
with allure.step("Deleting the article"):
utilities.navigate_to_link(article_url)
utilities.navigate_to_link(article_details['article_url'])
sumo_pages.kb_article_deletion_flow.delete_kb_article()

Просмотреть файл

@ -271,7 +271,7 @@ def test_add_new_group_leader(page: Page):
sumo_pages.user_group_flow.remove_a_user_from_group(test_user)
# C2083499, C2715807
# C2083499, C2715807, C891410
@pytest.mark.userGroupsTests
@pytest.mark.parametrize("user", ['TEST_ACCOUNT_MESSAGE_2', 'TEST_ACCOUNT_MODERATOR'])
def test_add_group_members(page: Page, user):

Просмотреть файл

@ -22,12 +22,16 @@ from playwright_tests.pages.sumo_pages import SumoPages
# C891309, C2102170, C2102168, C2489545, C910271
@pytest.mark.kbArticleShowHistory
@pytest.mark.create_delete_article(False)
def test_kb_article_removal(page: Page, create_delete_article):
def test_kb_article_removal(page: Page):
utilities = Utilities(page)
sumo_pages = SumoPages(page)
kb_show_history_page_messages = KBArticleShowHistoryPageMessages()
article_details = create_delete_article("TEST_ACCOUNT_12")[0]
utilities.start_existing_session(utilities.username_extraction_from_email(
utilities.user_secrets_accounts["TEST_ACCOUNT_12"]
))
article_details = sumo_pages.submit_kb_article_flow.kb_article_creation_via_api(page=page)
revision_id_number = utilities.number_extraction_from_string(
article_details['first_revision_id']
)
@ -52,7 +56,7 @@ def test_kb_article_removal(page: Page, create_delete_article):
with allure.step("Navigating back and verifying that the delete button for the article "
"is not displayed"):
utilities.navigate_to_link(article_details["article_url"])
utilities.navigate_to_link(article_details["article_show_history_url"])
expect(sumo_pages.kb_article_show_history_page.get_delete_this_document_button_locator(
)).to_be_hidden()
@ -68,7 +72,7 @@ def test_kb_article_removal(page: Page, create_delete_article):
assert response.status == 403
with allure.step("Navigating back and deleting the user session"):
utilities.navigate_to_link(article_details["article_url"])
utilities.navigate_to_link(article_details["article_show_history_url"])
utilities.delete_cookies()
with check, allure.step("Manually navigating to the delete revision endpoint and "
@ -80,7 +84,7 @@ def test_kb_article_removal(page: Page, create_delete_article):
with check, allure.step("Navigating back and verifying that manually navigating to the "
"delete endpoint returns the auth page"):
utilities.navigate_to_link(article_details["article_url"])
utilities.navigate_to_link(article_details["article_show_history_url"])
utilities.navigate_to_link(
KBArticlePageMessages
.KB_ARTICLE_PAGE_URL + article_details['article_slug'] + QuestionPageMessages
@ -90,7 +94,7 @@ def test_kb_article_removal(page: Page, create_delete_article):
with allure.step("Navigating back and verifying that the delete button is not available "
"for the only revision"):
utilities.navigate_to_link(article_details["article_url"])
utilities.navigate_to_link(article_details["article_show_history_url"])
expect(sumo_pages.kb_article_show_history_page.get_delete_revision_button_locator(
article_details['first_revision_id'])).to_be_hidden()
@ -165,19 +169,23 @@ def test_kb_article_removal(page: Page, create_delete_article):
# C2490047, C2490048
@pytest.mark.kbArticleShowHistory
def test_kb_article_category_link_and_header(page: Page, create_delete_article):
def test_kb_article_category_link_and_header(page: Page):
utilities = Utilities(page)
sumo_pages = SumoPages(page)
utilities.start_existing_session(utilities.username_extraction_from_email(
utilities.user_secrets_accounts["TEST_ACCOUNT_MODERATOR"]
))
for category in utilities.general_test_data["kb_article_categories"]:
if category != "Templates":
with allure.step("Creating a new article"):
article_info = create_delete_article("TEST_ACCOUNT_MODERATOR",
{"article_category": category})[0]
article_info = sumo_pages.submit_kb_article_flow.submit_simple_kb_article(
article_category=category
)
else:
with allure.step("Creating a new template article"):
article_info = create_delete_article("TEST_ACCOUNT_MODERATOR",
{"article_category": category,
"is_template": True})[0]
article_info = sumo_pages.submit_kb_article_flow.submit_simple_kb_article(
article_category=category, is_template=True
)
with check, allure.step("Verifying that the correct page header is displayed"):
assert sumo_pages.kb_article_show_history_page.get_show_history_page_title(
@ -203,15 +211,21 @@ def test_kb_article_category_link_and_header(page: Page, create_delete_article):
with allure.step("Navigating back and deleting the article"):
utilities.navigate_back()
sumo_pages.kb_article_deletion_flow.delete_kb_article()
# C2101637, C2489543, C2102169, C2489542
@pytest.mark.kbArticleShowHistory
def test_kb_article_contributor_removal(page: Page, create_delete_article):
def test_kb_article_contributor_removal(page: Page):
utilities = Utilities(page)
sumo_pages = SumoPages(page)
kb_show_history_page_messages = KBArticleShowHistoryPageMessages()
article_details, username_one = create_delete_article("TEST_ACCOUNT_MODERATOR")
username_one = utilities.start_existing_session(utilities.username_extraction_from_email(
utilities.user_secrets_accounts["TEST_ACCOUNT_MODERATOR"]
))
article_details = sumo_pages.submit_kb_article_flow.kb_article_creation_via_api(page=page)
with allure.step("Verifying that no users are added inside the contributors list"):
expect(sumo_pages.kb_article_show_history_page.get_all_contributors_locator()
).to_be_hidden()
@ -379,16 +393,22 @@ def test_kb_article_contributor_removal(page: Page, create_delete_article):
sumo_pages.kb_article_page.click_on_article_option()
assert username_two in sumo_pages.kb_article_page.get_list_of_kb_article_contributors()
with allure.step("Deleting the artice"):
sumo_pages.kb_article_deletion_flow.delete_kb_article()
# C2101638
@pytest.mark.kbArticleShowHistory
def test_contributors_can_be_manually_added(page: Page, create_delete_article):
def test_contributors_can_be_manually_added(page: Page):
utilities = Utilities(page)
sumo_pages = SumoPages(page)
kb_show_history_page_messages = KBArticleShowHistoryPageMessages()
utilities.start_existing_session(utilities.username_extraction_from_email(
utilities.user_secrets_accounts["TEST_ACCOUNT_MODERATOR"]
))
with allure.step("Clicking on the 'Edit Contributors' option, adding and selecting the "
"username from the search field"):
create_delete_article("TEST_ACCOUNT_MODERATOR")
sumo_pages.submit_kb_article_flow.kb_article_creation_via_api(page=page)
sumo_pages.kb_article_show_history_page.click_on_edit_contributors_option()
new_contributor = utilities.username_extraction_from_email(
utilities.user_secrets_accounts["TEST_ACCOUNT_12"]
@ -414,14 +434,22 @@ def test_contributors_can_be_manually_added(page: Page, create_delete_article):
sumo_pages.kb_article_page.click_on_article_option()
assert new_contributor in sumo_pages.kb_article_page.get_list_of_kb_article_contributors()
with allure.step("Deleting the article"):
sumo_pages.kb_article_deletion_flow.delete_kb_article()
# C2101634, C2489553, C2102186
@pytest.mark.kbArticleShowHistory
def test_kb_article_contributor_profile_access(page: Page, create_delete_article):
def test_kb_article_contributor_profile_access(page: Page):
utilities = Utilities(page)
sumo_pages = SumoPages(page)
kb_article_show_history_page = KBArticleShowHistoryPage(page)
create_delete_article("TEST_ACCOUNT_MODERATOR", {"approve_first_revision": True})
utilities.start_existing_session(utilities.username_extraction_from_email(
utilities.user_secrets_accounts["TEST_ACCOUNT_MODERATOR"]
))
sumo_pages.submit_kb_article_flow.kb_article_creation_via_api(
page=page, approve_revision=True)
sumo_pages.kb_article_page.click_on_article_option()
article_url = utilities.get_page_url()
@ -495,19 +523,21 @@ def test_kb_article_contributor_profile_access(page: Page, create_delete_article
with allure.step("Navigating back and deleting the created article"):
utilities.navigate_back()
sumo_pages.kb_article_deletion_flow.delete_kb_article()
# C2499415, C2271120, C2101633
@pytest.mark.kbArticleShowHistory
def test_kb_article_revision_date_functionality(page: Page, create_delete_article):
def test_kb_article_revision_date_functionality(page: Page):
utilities = Utilities(page)
sumo_pages = SumoPages(page)
with allure.step("Signing in with an admin account and creating a new article and "
"approving it's first revision"):
article_details, main_user = create_delete_article("TEST_ACCOUNT_MODERATOR",
{"approve_first_revision": True})
sumo_pages.kb_article_page.click_on_article_option()
article_url = utilities.get_page_url()
main_user = utilities.start_existing_session(utilities.username_extraction_from_email(
utilities.user_secrets_accounts["TEST_ACCOUNT_MODERATOR"]
))
article_details = sumo_pages.submit_kb_article_flow.kb_article_creation_via_api(
page=page, approve_revision=True)
with allure.step("Signing in with a non-admin account"):
creator_username = utilities.start_existing_session(
@ -696,6 +726,10 @@ def test_kb_article_revision_date_functionality(page: Page, create_delete_articl
(sumo_pages.kb_article_preview_revision_page
._click_on_edit_article_based_on_this_revision_link())
expect(page).to_have_url(
article_url + QuestionPageMessages.EDIT_QUESTION_URL_ENDPOINT + "/" + str(
utilities.number_extraction_from_string(second_revision_info['revision_id']))
article_details['article_url'] + QuestionPageMessages.
EDIT_QUESTION_URL_ENDPOINT + "/" + str(utilities.number_extraction_from_string(
second_revision_info['revision_id']))
)
with allure.step("Deleting the article"):
sumo_pages.kb_article_deletion_flow.delete_kb_article()

Просмотреть файл

@ -906,7 +906,7 @@ def test_posting_a_new_kb_test_article(page: Page):
utilities.user_secrets_accounts["TEST_ACCOUNT_MODERATOR"]
))
sumo_pages.submit_kb_article_flow.submit_simple_kb_article(approve_first_revision=True)
sumo_pages.submit_kb_article_flow.kb_article_creation_via_api(page=page, approve_revision=True)
sumo_pages.kb_article_page.click_on_article_option()
with open("test_data/test_article", 'w') as file:
file.write(utilities.get_page_url())

Просмотреть файл

@ -123,7 +123,9 @@ def test_product_support_page_frequent_topics_redirect(page: Page):
# T5696580, C891335, C891336
@pytest.mark.productSupportPage
def test_product_support_page_featured_articles_redirect(page: Page):
def test_product_support_page_featured_articles_redirect(page: Page, is_chromium):
if is_chromium:
pytest.skip("Skipping this test for chromium browser")
utilities = Utilities(page)
sumo_pages = SumoPages(page)
with allure.step("Navigating to products page via top-navbar"):

Просмотреть файл

@ -26,6 +26,7 @@ def test_explore_by_topic_product_filter(page: Page):
topic = topic.strip()
if topic != "Browse":
sumo_pages.explore_by_topic_page.click_on_a_topic_filter(topic)
utilities.wait_for_dom_to_load()
with allure.step("Verifying that the correct page header is displayed"):
assert topic == (sumo_pages.explore_by_topic_page
.get_explore_by_topic_page_header().strip())

Просмотреть файл

@ -687,10 +687,6 @@ def _validate_profile_info(page: Page, target: str, profile_info: str, username:
"involved_from_month": sumo_pages.my_profile_page.get_my_contributed_from_text,
"involved_from_year": sumo_pages.my_profile_page.get_my_contributed_from_text,
}
link_click_methods = {
"community_portal": sumo_pages.my_profile_page.click_on_community_portal_link,
"people_directory": sumo_pages.my_profile_page.click_on_people_directory_link,
}
with allure.step("Signing in with a different non-admin user"):
utilities.start_existing_session(utilities.username_extraction_from_email(
@ -704,27 +700,11 @@ def _validate_profile_info(page: Page, target: str, profile_info: str, username:
if profile_info not in profile_info_getters.get(target, lambda: None)():
return False
if target in link_click_methods:
with allure.step("Clicking on the link and verifying redirection"):
link_click_methods[target]()
utilities.wait_for_networkidle()
print(utilities.get_page_url())
if profile_info not in utilities.get_page_url():
return False
utilities.navigate_to_link(MyProfileMessages.get_my_profile_stage_url(username))
with allure.step("Signing out and verifying the information again"):
utilities.delete_cookies()
utilities.navigate_to_link(MyProfileMessages.get_my_profile_stage_url(username))
if profile_info not in profile_info_getters.get(target, lambda: None)():
return False
if target in link_click_methods:
with allure.step("Clicking on the link and verifying redirection"):
link_click_methods[target]()
utilities.wait_for_networkidle()
if profile_info not in utilities.get_page_url():
return False
utilities.navigate_to_link(MyProfileMessages.get_my_profile_stage_url(username))
return True

Просмотреть файл

@ -38,7 +38,7 @@ def test_my_profile_page_can_be_accessed_via_top_navbar(page: Page):
) == UserProfileNavbarMessages.NAVBAR_OPTIONS[0]
# C891411
# C891411, C891410
@pytest.mark.userProfile
def test_my_profile_sign_out_button_functionality(page: Page):
utilities = Utilities(page)
@ -63,7 +63,7 @@ def test_my_profile_sign_out_button_functionality(page: Page):
expect(sumo_pages.top_navbar.sign_in_up_button_displayed_element()).to_be_visible()
# C2108828
# C2108828, C891410
@pytest.mark.userProfile
def test_provided_solutions_number_is_successfully_displayed(page: Page):
utilities = Utilities(page)
@ -133,7 +133,7 @@ def test_provided_solutions_number_is_successfully_displayed(page: Page):
expect(sumo_pages.product_support_page.product_product_title_element()).to_be_visible()
# C890832, C2094281
# C890832, C2094281, C891410
@pytest.mark.userProfile
def test_number_of_my_profile_answers_is_successfully_displayed(page: Page):
utilities = Utilities(page)
@ -201,7 +201,7 @@ def test_number_of_my_profile_answers_is_successfully_displayed(page: Page):
expect(sumo_pages.product_support_page.product_product_title_element()).to_be_visible()
# C2094285, C2094284, C891309
# C2094285, C2094284, C891309, C891410
@pytest.mark.userProfile
def test_number_of_posted_articles_is_successfully_displayed(page: Page):
utilities = Utilities(page)