Skip to content

QA-7400 added steps to handle Asynchronous restore banner #379

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 15 commits into from
Jan 29, 2025
Merged
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
1 change: 1 addition & 0 deletions Features/CaseSearch/constants.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Property Types
TEXT_INPUT = "TEXT_INPUT"
COMBOBOX = "COMBOBOX"
COMBOBOX2 = "COMBOBOX2"
YES = "YES"
NO = "NO"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,7 @@ def test_case_18_conditionally_required_condition_property(driver, settings):
message=CaseSearchUserInput.required_msg_if_rating_two,
required_or_validated=YES,
property_type=COMBOBOX)
webapps.clear_selections_on_case_search_page()
"""Check disabled"""
casesearch.search_against_property(search_property=CaseSearchUserInput.rating,
input_value=CaseSearchUserInput.three_star,
Expand Down
21 changes: 17 additions & 4 deletions Features/CaseSearch/test_pages/casesearch_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ def __init__(self, driver):
self.search_against_text_property_format = "//input[contains (@id, '{}')]"
self.help_text_format = '//label[@for="{}"]//following::a[@data-bs-content="{}" or @data-content="{}"]'
self.combox_select = "//label[contains(text(), '{}')]//following::select[contains(@class, 'query-field')][1]"
self.combox_select2 = "//label[contains(text(), '{}')]//following::div/select[contains(@class, 'query-field')][1]"
self.search_for_address = "//*[contains(text(),'{}')]//following::input[contains(@aria-label,'Search')][1]"
self.include_blanks = self.search_property_name_combobox + "//following::input[contains(@class,'search-for-blank')][1]"
self.required_validation_on_top = "//div[contains(@class,'alert-danger')]//following::li[contains(text(),'{}')]"
Expand Down Expand Up @@ -85,14 +86,15 @@ def check_default_values_displayed(self, search_property, default_value, search_
elif search_format == combobox:
search_property = (
By.XPATH, self.combobox_search_property_name_and_value_format.format(search_property, default_value))
self.wait_for_ajax()
assert self.is_visible_and_displayed(search_property, 100), "Search "+default_value+" property not present"
time.sleep(20)
assert self.is_visible_and_displayed(search_property, 400), "Search "+default_value+" property not present"
print("Search "+default_value+" property is present")

def search_against_property(self, search_property, input_value, property_type, include_blanks=None):
print("Providing value: ", input_value)
if property_type == TEXT_INPUT:
self.search_property = self.get_element(self.search_against_text_property_format, search_property)
self.wait_for_element(self.search_property, 100)
class_type = self.get_attribute(self.search_property, "class")
self.wait_to_click(self.search_property)
time.sleep(4)
Expand All @@ -108,10 +110,17 @@ def search_against_property(self, search_property, input_value, property_type, i
else:
self.send_keys(self.search_property, input_value + Keys.TAB)
time.sleep(5)
self.wait_for_ajax()
time.sleep(20)
elif property_type == COMBOBOX:
self.combox_select_element = self.get_element(self.combox_select, search_property)
time.sleep(2)
self.wait_for_element(self.combox_select_element, 100)
self.select_by_text(self.combox_select_element, input_value)
time.sleep(4)
elif property_type == COMBOBOX2:
self.combox_select_element = self.get_element(self.combox_select2, search_property)
time.sleep(2)
self.wait_for_element(self.combox_select_element, 100)
self.select_by_text(self.combox_select_element, input_value)
time.sleep(4)
if include_blanks == YES:
Expand Down Expand Up @@ -232,6 +241,7 @@ def check_validations_on_property(self, search_property, property_type, message=
time.sleep(4)
assert not self.is_displayed(validation_message_per_prop), f"validation present {validation_message_per_prop}"
print(f"validation not present {validation_message_per_prop}")
time.sleep(5)

def check_dropdown_value(self, search_property, value, present):
dropdown_values_ = self.get_element(self.dropdown_values, search_property)
Expand Down Expand Up @@ -321,12 +331,15 @@ def select_checkbox(self, search_property, values, select_by_value):
if select_by_value == text:
checkbox_xpath = (By.XPATH, self.checkbox_xpath.format(search_property, values))
self.wait_for_element(checkbox_xpath)
self.scroll_to_element(checkbox_xpath)
# self.scroll_to_element(checkbox_xpath)
time.sleep(3)
self.js_click(checkbox_xpath)
time.sleep(3)
elif select_by_value == index:
for value in values:
checkbox_xpath = (By.XPATH, self.checkbox_xpath.format(search_property, value - 1))
self.js_click(checkbox_xpath)
time.sleep(3)
list_string = map(str, values)
return list(list_string)

Expand Down
2 changes: 2 additions & 0 deletions Features/MultiSelect/test_cases/test_01_multi_select.py
Original file line number Diff line number Diff line change
Expand Up @@ -343,6 +343,8 @@ def test_case_16_multiselect_with_case_tiles(driver, settings):


def test_case_17_multiselect_enabled_select_parent_first(driver, settings):
if 'www' in settings['url']:
pytest.skip("Production has a linked app")
multiselect = MultiSelectWorkflows(driver)
menu = HomePage(driver, settings)
menu.applications_menu(MultiSelectUserInput.multiselect_app_name)
Expand Down
3 changes: 3 additions & 0 deletions Features/MultiSelect/test_pages/multiselect_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,10 @@ def check_if_value_present_in_drop_down(self, menu_name_input, match=None):

def open_menu_settings(self, menu):
menu_xpath = self.get_element(self.open_app_builder_menu, menu)
self.wait_for_element(menu_xpath)
self.js_click(menu_xpath)
time.sleep(2)
self.wait_for_element(self.case_list_settings)
self.js_click(self.case_list_settings)


Expand Down
2 changes: 2 additions & 0 deletions HQSmokeTests/testCases/test_07_applications.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ def test_case_40_app_preview(driver, settings):
@pytest.mark.reportSubmitHistory
@pytest.mark.appReleases
def test_case_38_create_new_build_deploy_to_mobile(driver, settings):
if 'staging' in settings['url']:
pytest.xfail("Failing on Staging due to QA-7314")
load = ApplicationPage(driver)
install_code, field_text = load.update_form_field()
print(install_code, field_text)
Expand Down
3 changes: 2 additions & 1 deletion HQSmokeTests/testPages/home/home_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ def __init__(self, driver, settings):
self.settings_bar = (By.XPATH, "//ul[@role='menu']//a[@data-action='Click Gear Icon']/i")
self.project_settings_menu = (By.LINK_TEXT, "Project Settings")
self.project_settings_elements = (By.XPATH, "//form[@class='form form-horizontal']")
self.application_names = "//li[@class='nav-header dropdown-header' and contains(.,'My Applications')]//following-sibling::li[contains(.,'{}')]"

self.DASHBOARD_TITLE = "CommCare HQ"
self.REPORTS_TITLE = "My Saved Reports : Project Reports :: - CommCare HQ"
Expand Down Expand Up @@ -74,7 +75,7 @@ def applications_menu(self, app_name):
self.open_menu(self.applications_menu_id)
else:
raise TimeoutException
self.wait_to_click((By.LINK_TEXT, str(app_name)))
self.wait_to_click((By.XPATH, self.application_names.format(app_name)))
self.APP_TITLE = "Releases - " + str(app_name) + " - CommCare HQ"
assert self.APP_TITLE in self.driver.title, "This is not the Applications page."

Expand Down
2 changes: 1 addition & 1 deletion USH_Apps/CO_BHA/test_cases/test_02_discharge_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ def test_case_discharge_client_1(driver, settings):
property_type=TEXT_INPUT)
casesearch.search_against_property(search_property=BhaUserInput.reason_for_no_ssn,
input_value=BhaUserInput.does_not_have_ssn,
property_type=COMBOBOX)
property_type=COMBOBOX2)
casesearch.select_checkbox(BhaUserInput.consent, BhaUserInput.yes_small, select_by_value=text)
webapps.search_button_on_case_search_page()
app.click_on_admit_new_client()
Expand Down
19 changes: 14 additions & 5 deletions common_utilities/selenium/base_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from dateutil.parser import parse
from selenium.webdriver.support.select import Select
from selenium.common.exceptions import TimeoutException, ElementClickInterceptedException, \
UnexpectedAlertPresentException, StaleElementReferenceException, NoSuchElementException
UnexpectedAlertPresentException, StaleElementReferenceException, NoSuchElementException, JavascriptException
from selenium.webdriver import ActionChains, Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ec
Expand Down Expand Up @@ -381,10 +381,19 @@ def get_element(self, xpath_format, insert_value):
element = (By.XPATH, xpath_format.format(insert_value))
return element

def wait_for_ajax(self, value=300):
wait = WebDriverWait(self.driver, value)
wait.until(lambda driver: self.driver.execute_script('return jQuery.active') == 0)
wait.until(lambda driver: self.driver.execute_script('return document.readyState') == 'complete')
def wait_for_ajax(self, value=200):
try:
wait = WebDriverWait(self.driver, value)
if self.driver.execute_script('return jQuery.active') != 'undefined':
wait.until(lambda driver: self.driver.execute_script('return jQuery.active') == 0)
elif self.driver.execute_script('return document.readyState') != 'complete':
wait.until(lambda driver: self.driver.execute_script('return document.readyState') == 'complete')
else:
print("Undefined JQuery, waiting for sometime")
time.sleep(10)
except JavascriptException:
print("Undefined JQuery")
time.sleep(20)

def is_date(self, string, fuzzy=False):
"""
Expand Down
77 changes: 56 additions & 21 deletions common_utilities/selenium/webapps.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ def __init__(self, driver, settings):
super().__init__(driver)
self.settings = settings

self.title = "//title[text()='{}']"
self.current_page = "//a[@aria-current='page' and contains(.,'{}')]"
self.content_container = (By.XPATH, "//div[@id='content-container']")
self.url = self.settings['url']
self.app_name_format = "//div[@aria-label='{}']/div/h3"
self.app_header_format = "//h1[contains(text(),'{}')]"
Expand All @@ -38,7 +41,7 @@ def __init__(self, driver, settings):


self.form_submit = (By.XPATH, "//div[contains(@id,'submit')]//button[contains(@class,'submit')]")
self.form_submission_successful = (By.XPATH, "//p[contains(text(), 'successfully saved')]")
self.form_submission_successful = (By.XPATH, "//div[contains(@class,'alert-success')][contains(text(), 'successfully saved') or .//p[contains(text(), 'successfully saved')]]")
self.form_500_error = (By.XPATH, "//*[contains(text(),'500 :')]")
self.search_all_cases_button = (By.XPATH,
"(//*[contains(text(),'Search All')]//parent::div[@class='case-list-action-button btn-group formplayer-request']/button)[1]")
Expand All @@ -49,7 +52,7 @@ def __init__(self, driver, settings):
self.case_list = (By.XPATH, "//div[contains(@id,'results')][//tbody or //section[contains(@class,'list')]]")#"//table[@class='table module-table module-table-case-list']")
self.omni_search_input = (By.ID, "searchText")
self.omni_search_button = (By.ID, "case-list-search-button")
self.continue_button = (By.ID, "select-case")
self.continue_button = (By.XPATH, "//button[@id='select-case']")
self.first_case_on_list = (By.XPATH, "(//*[@class='module-case-list-column'])[1]")

self.webapps_home = (By.XPATH, "//i[@class='fcc fcc-flower']")
Expand All @@ -76,6 +79,10 @@ def __init__(self, driver, settings):
self.iframe_app_preview = (By.XPATH, "//iframe[@class='preview-phone-window']")
self.app_preview_model = (By.XPATH, "//div[@class='preview-phone-container']")

self.async_restore_error = (By.XPATH, "//div[contains(@class,'alert-danger') and contains(.,'Asynchronous restore')]/button[contains(@class,'close')]")
self.error_message = (By.XPATH, "//div[contains(@class,'alert-danger')]/button[contains(@class,'close')]")


def open_app(self, app_name):
time.sleep(2)
if self.is_present_and_displayed(self.webapps_home, 20):
Expand All @@ -84,20 +91,23 @@ def open_app(self, app_name):
self.application_header = self.get_element(self.app_header_format, app_name)
self.scroll_to_element(self.application)
self.js_click(self.application)
self.wait_for_ajax()
self.is_visible_and_displayed(self.application_header, timeout=200)
time.sleep(10)
self.wait_for_element(self.application_header, timeout=200)

def navigate_to_breadcrumb(self, breadcrumb_value):
self.link = (By.XPATH, self.breadcrumb_format.format(breadcrumb_value, breadcrumb_value))
self.wait_for_element(self.link)
self.js_click(self.link)
time.sleep(5)
self.wait_for_element((By.XPATH, self.current_page.format(breadcrumb_value)), timeout=60)

def open_menu(self, menu_name):
self.caselist_menu = self.get_element(self.menu_name_format, menu_name)
self.caselist_header = self.get_element(self.menu_name_header_format, menu_name)
self.scroll_to_element(self.caselist_menu)
self.js_click(self.caselist_menu)
self.wait_for_ajax()
time.sleep(5)
self.wait_for_element((By.XPATH, self.current_page.format(menu_name)), timeout=60)
assert self.is_visible_and_displayed(self.caselist_header)

def open_form(self, form_name):
Expand All @@ -106,10 +116,11 @@ def open_form(self, form_name):
logging.info("Auto advance enabled")
else:
self.form_name = self.get_element(self.form_name_format, form_name)
self.wait_for_element(self.form_name, timeout=500)
self.wait_for_element(self.form_name, timeout=50)
self.scroll_to_element(self.form_name)
self.js_click(self.form_name)
self.wait_for_ajax()
time.sleep(5)
self.wait_for_element((By.XPATH, self.current_page.format(form_name)), timeout=50)

def search_all_cases(self):
self.scroll_to_element(self.search_all_cases_button)
Expand All @@ -121,11 +132,19 @@ def search_again_cases(self):
self.js_click(self.search_again_button)

def clear_selections_on_case_search_page(self):
self.wait_for_element(self.clear_case_search_page, timeout=500)
time.sleep(10)
if self.is_present_and_displayed(self.error_message):
print("Error present")
self.js_click(self.error_message)
time.sleep(3)
else:
print("No banners present")
self.scroll_to_bottom()
self.wait_for_element(self.clear_case_search_page)
self.scroll_to_element(self.clear_case_search_page)
time.sleep(2)
self.js_click(self.clear_case_search_page)
self.wait_for_ajax()
time.sleep(5)
time.sleep(10)

def search_button_on_case_search_page(self, enter_key=None, case_list=None):
if enter_key == YES:
Expand All @@ -137,9 +156,9 @@ def search_button_on_case_search_page(self, enter_key=None, case_list=None):
self.scroll_to_element(self.submit_on_case_search_page)
self.js_click(self.submit_on_case_search_page)
time.sleep(10)
self.wait_for_ajax(60)
self.wait_for_ajax()
if case_list == None:
self.is_visible_and_displayed(self.case_list, timeout=500)
self.is_visible_and_displayed(self.case_list, timeout=100)
else:
print("Case List is not displayed")

Expand All @@ -152,7 +171,7 @@ def omni_search(self, case_name, displayed=YES):
self.wait_to_clear_and_send_keys(self.omni_search_input, case_name)
self.wait_for_element(self.omni_search_button)
self.js_click(self.omni_search_button)
self.wait_for_ajax(100)
time.sleep(50)
else:
print("Split Screen Case Search enabled")
self.case = self.get_element(self.case_name_format, case_name)
Expand All @@ -170,7 +189,6 @@ def omni_search(self, case_name, displayed=YES):
assert self.is_displayed(self.case)
elif displayed == NO:
assert not self.is_displayed(self.case)

return case_name

def select_case(self, case_name):
Expand All @@ -194,26 +212,43 @@ def select_first_case_on_list_and_continue(self):
def continue_to_forms(self):
self.wait_for_element(self.continue_button, 100)
self.js_click(self.continue_button)
time.sleep(10)

def select_case_and_continue(self, case_name):
self.select_case(case_name)
self.continue_to_forms()
self.wait_for_ajax()
self.wait_for_element(self.content_container, timeout=100)
form_names = self.find_elements_texts(self.form_names)
return form_names

def async_restore_resubmit(self):
time.sleep(10)
if self.is_present_and_displayed(self.async_restore_error, 30):
self.click(self.async_restore_error)
time.sleep(10)
self.scroll_to_element(self.form_submit)
self.js_click(self.form_submit)
else:
print("No Asynchronous restore error present")



def submit_the_form(self):
time.sleep(3)
self.wait_for_element(self.form_submit)
self.js_click(self.form_submit)
time.sleep(5)
time.sleep(10)
self.async_restore_resubmit()
time.sleep(10)
try:
assert self.is_visible_and_displayed(self.form_submission_successful, timeout=500)
self.wait_for_element(self.form_submission_successful, timeout=50)
assert self.is_visible_and_displayed(self.form_submission_successful, timeout=50)
except AssertionError:
if self.is_displayed(self.form_500_error):
time.sleep(60)
self.js_click(self.form_submit)
assert self.is_visible_and_displayed(self.form_submission_successful, timeout=500)
self.wait_for_element(self.form_submission_successful, timeout=50)
assert self.is_visible_and_displayed(self.form_submission_successful, timeout=50)
else:
raise AssertionError
time.sleep(5)
Expand Down Expand Up @@ -249,7 +284,7 @@ def login_as(self, username):
self.wait_for_element(self.webapp_login)
self.js_click(self.webapp_login)
time.sleep(10)
self.wait_for_element(self.search_user_webapps)
self.wait_for_element(self.search_user_webapps, timeout=100)
self.send_keys(self.search_user_webapps, username)
time.sleep(1)
self.wait_for_element(self.search_button_webapps)
Expand Down Expand Up @@ -285,10 +320,10 @@ def change_page_number(self, page_number):

def switch_bw_pages(self):
self.js_click(self.next_page)
self.wait_for_ajax()
time.sleep(30)
self.wait_for_element(self.prev_page)
self.js_click(self.prev_page)
self.wait_for_ajax()
time.sleep(30)

def go_to_page(self, page_number):
self.send_keys(self.go_to_page_textarea, page_number)
Expand Down
Loading