Skip to content
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

QA-7149 added priority cases from 2022-2023 #378

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
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
54 changes: 53 additions & 1 deletion HQSmokeTests/testPages/android/android_screen.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec

from HQSmokeTests.userInputs.user_inputs import UserData
from appium.options.android import UiAutomator2Options
Expand Down Expand Up @@ -69,6 +70,7 @@ def __init__(self, settings):
self.form = "//android.widget.TextView[@text='"+UserData.new_form_name+"']"
self.text_field = "//android.widget.EditText"
self.submit_button = "//android.widget.TextView[@text='FINISH']"
self.log_out = "//android.widget.TextView[@text='Log out of CommCare']"

def click_xpath(self, locator):
element = self.driver.find_element(AppiumBy.XPATH, locator)
Expand All @@ -86,14 +88,19 @@ def send_text_id(self, locator, user_input):
element = self.driver.find_element(AppiumBy.ID, locator)
element.send_keys(user_input)

def wait_for_element(self, *locator, timeout=20):
clickable = ec.element_to_be_clickable(locator)
WebDriverWait(self.driver, timeout, poll_frequency=5).until(clickable,
message="Couldn't find locator: " + str(locator))

def install_app_and_submit_form(self, code, random_text):
self.driver.find_element(AppiumBy.XPATH, self.enter_code).click()
self.driver.find_element(AppiumBy.ID, self.profile_code).send_keys(code)
self.driver.find_element(AppiumBy.ID, self.start_install).click()
time.sleep(3)
self.driver.find_element(AppiumBy.XPATH, self.install).click()
time.sleep(15)
self.driver.find_element(AppiumBy.ID, self.username).send_keys(UserData.app_login)
self.driver.find_element(AppiumBy.ID, self.username).send_keys(UserData.new_app_login)
self.driver.find_element(AppiumBy.ID, self.password).send_keys(UserData.app_password)
self.driver.find_element(AppiumBy.ID, self.login).click()
time.sleep(50)
Expand All @@ -111,5 +118,50 @@ def install_app_and_submit_form(self, code, random_text):
self.driver.find_element(AppiumBy.XPATH, self.sync_button).click()
time.sleep(3)

def verify_app_install(self, code):
time.sleep(10)
self.driver.find_element(AppiumBy.XPATH, self.enter_code).click()
self.driver.find_element(AppiumBy.ID, self.profile_code).send_keys(code)
self.driver.find_element(AppiumBy.ID, self.start_install).click()
time.sleep(3)
self.driver.find_element(AppiumBy.XPATH, self.install).click()
time.sleep(30)
assert self.driver.find_element(AppiumBy.XPATH, "//android.widget.TextView[@text='Welcome back! Please log in.']").is_displayed(), "App not installed"
print("App installed successfully")

def verify_login_with_old_password(self, code, username, password):
time.sleep(10)
self.driver.find_element(AppiumBy.XPATH, self.enter_code).click()
self.driver.find_element(AppiumBy.ID, self.profile_code).send_keys(code)
self.driver.find_element(AppiumBy.ID, self.start_install).click()
time.sleep(3)
self.driver.find_element(AppiumBy.XPATH, self.install).click()
time.sleep(30)
assert self.driver.find_element(AppiumBy.XPATH, "//android.widget.TextView[@text='Welcome back! Please log in.']").is_displayed(), "App not installed"
print("App installed successfully")
self.driver.find_element(AppiumBy.ID, self.username).send_keys(username)
self.driver.find_element(AppiumBy.ID, self.password).send_keys(password)
self.driver.find_element(AppiumBy.ID, self.login).click()
time.sleep(40)
self.driver.find_element(AppiumBy.XPATH, self.log_out).click()
print("Successfully logged in and logged out with old password:", username, password)
time.sleep(3)
assert self.driver.find_element(AppiumBy.XPATH,
"//android.widget.TextView[@text='Welcome back! Please log in.']"
).is_displayed(), "App not installed"

def verify_login_with_new_password(self, username, password):
time.sleep(30)
assert self.driver.find_element(AppiumBy.XPATH, "//android.widget.TextView[@text='Welcome back! Please log in.']").is_displayed(), "App not installed"
print("Welcome screen present")
self.driver.find_element(AppiumBy.ID, self.username).send_keys(username)
self.driver.find_element(AppiumBy.ID, self.password).send_keys(password)
self.driver.find_element(AppiumBy.ID, self.login).click()
time.sleep(40)
self.driver.find_element(AppiumBy.XPATH, self.log_out).click()
print("Successfully logged in and logged out with new password :", username, password)
time.sleep(3)


def close_android_driver(self):
self.driver.quit()
39 changes: 39 additions & 0 deletions HQSmokeTests/testPages/applications/application_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,11 @@ def __init__(self, driver):
self.advanced_settings_tab = (By.XPATH, "//a[@href='#commcare-settings']")
self.advanced_settings_tab_content = (By.ID, "app-settings-options")
self.form_settings_tab = (By.XPATH, "//a[@href='#form-settings']")
self.case_management_tab = (By.XPATH, "//a[@href='#case-configuration']")
self.user_properties = (By.XPATH, "//a[@href='#usercase-configuration']")
self.form_actions_tab = (By.XPATH, "//a[@href='#advanced']")



# Form Field Edit
self.add_new_form = (By.XPATH,"//a[@class='appnav-secondary js-add-new-item']")
Expand Down Expand Up @@ -110,6 +115,8 @@ def __init__(self, driver):
self.override_btn = (By.XPATH, "//button[contains(.,'Overwrite their work')]")
self.enter_app_code_link = (By.LINK_TEXT, "Enter App Code")



# language tab
self.language_option = "//select[contains(@data-bind,'langcode')]/option[.='{}']"
self.add_language_button = (By.XPATH, "//button[contains(@data-bind,'addLanguage')]")
Expand Down Expand Up @@ -428,3 +435,35 @@ def delete_all_application(self, apps):
self.click(self.delete_confirm)
assert self.is_present_and_displayed(self.delete_success, 200), "Application "+app+" not deleted."
print("Deleted the application", app)

def verify_form_settings_page(self, form_name):
self.hover_on_element((By.XPATH, self.form_link.format(form_name)))
self.wait_to_click((By.XPATH, self.form_settings_btn.format(form_name)))
time.sleep(5)
assert self.is_present_and_displayed(self.form_settings_tab)
assert self.is_present_and_displayed(self.case_management_tab)
assert self.is_present_and_displayed(self.form_actions_tab)
assert self.is_present_and_displayed(self.user_properties)
print("Form Settings page correctly displayed")

def verify_app_version_page(self):
self.wait_to_click((By.XPATH, self.field_edit_app_name.format(UserData.reassign_cases_application)))
time.sleep(2)
assert self.is_present_and_displayed(self.make_new_version_button)
print("Make New Version Page is correctly displayed")

def get_app_code(self, app_name):
self.wait_to_click((By.XPATH, self.field_edit_app_name.format(app_name)))
time.sleep(2)
self.wait_for_element(self.make_new_version_button)
self.wait_to_click(self.publish_button)
if self.is_present_and_displayed(self.enter_app_code_link):
self.wait_to_click(self.enter_app_code_link)
else:
print("Enter App Code link is not present")
code_text = self.wait_to_get_text(self.code)
self.wait_to_click(self.close)
# self.wait_to_click(self.delete_form)
# self.wait_to_click(self.delete_form_confirm)
print("App code: ", code_text)
return code_text
51 changes: 36 additions & 15 deletions HQSmokeTests/testPages/data/copy_cases_page.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import time

from selenium.webdriver import ActionChains
from selenium.webdriver import ActionChains, Keys
from selenium.webdriver.common.by import By
from common_utilities.selenium.base_page import BasePage
from HQSmokeTests.userInputs.user_inputs import UserData
Expand All @@ -16,9 +16,8 @@ def __init__(self, driver, settings):
self.env_url = settings["url"]
self.copy_cases_menu = (By.LINK_TEXT, "Copy Cases")
self.apply = (By.ID, "apply-btn")
self.case_type = (By.XPATH, "//label[.='Case Type']//following-sibling::div/*[@class='select2 select2-container select2-container--default select2-container--below']")
self.case_type_dropdown = (By.XPATH, "//label[.='Case Type']//following-sibling::div/select[@name='case_type']")

self.case_type = (By.XPATH, "//select[@name='case_type']")
self.case_type_option_value = (By.XPATH, "//option[@value='reassign']")

self.select_first_case = (By.XPATH, "(//td[2][not(contains(.,'no name'))]//preceding-sibling::td/input[@type='checkbox'])[1]")
self.first_case_name = (By.XPATH, "(//a[contains(@class, 'ajax_dialog')][not(contains(.,'no name'))])[1]")
Expand All @@ -38,7 +37,9 @@ def __init__(self, driver, settings):
self.copied_user_from_list = "//li[starts-with(text(), '{}')]"
self.success_message = (By.XPATH, "//*[@data-bind='html: message' and contains(.,'Cases copied')]")
self.empty_list = (By.XPATH, "//td[.='No data available to display. Please try changing your filters.']")

self.users_field = (By.XPATH, "(//textarea[@class='select2-search__field'])[1]")
self.users_list_item = "//ul[@role='listbox']/li[contains(.,'{}')]"
self.remove_buttons = (By.XPATH, "//select[@name='case_list_filter']//following-sibling::span//ul//button")

def sort_for_latest_on_top(self):
self.wait_to_click(self.last_modified)
Expand All @@ -47,14 +48,30 @@ def sort_for_latest_on_top(self):
self.wait_to_click(self.last_modified)
self.wait_for_element(self.last_modified_descending, 50)

def get_cases(self):
def remove_default_users(self):
self.wait_for_element(self.users_field)
count = self.find_elements(self.remove_buttons)
print(len(count))
for i in range(len(count)):
count[0].click()
time.sleep(2)
if len(count) != 1:
ActionChains(self.driver).send_keys(Keys.TAB).perform()
time.sleep(2)
count = self.find_elements(self.remove_buttons)
ActionChains(self.driver).send_keys(Keys.ESCAPE).perform()

def get_cases(self, username):
self.wait_to_click(self.copy_cases_menu)
time.sleep(5)
self.wait_for_element(self.apply, 70)
self.select_by_text(self.user_search_dropdown, UserData.searched_user)
self.select_by_value(self.case_type_dropdown, UserData.case_pregnancy)
self.wait_for_element(self.case_type, 60)
self.select_by_value(self.case_type, UserData.case_reassign)
self.remove_default_users()
self.send_keys(self.users_field, username)
self.wait_to_click((By.XPATH, self.users_list_item.format(username)))
time.sleep(1)
self.wait_to_click(self.apply)


def copy_case(self):
self.sort_for_latest_on_top()
time.sleep(5)
Expand All @@ -66,20 +83,24 @@ def copy_case(self):
time.sleep(1)
assigned_username = self.get_text((By.XPATH,self.copied_user_from_list.format(UserData.mobile_testuser)))
print("Assigned Username:", assigned_username)
self.move_to_element_and_click((By.XPATH,self.copied_user_from_list.format(UserData.mobile_testuser)))
self.move_to_element_and_click((By.XPATH, self.copied_user_from_list.format(UserData.mobile_testuser)))
time.sleep(5)
self.wait_to_click(self.copy_btn)
time.sleep(5)
self.wait_for_element(self.success_message, 30)
self.wait_for_element(self.success_message, 130)
print("Sleeping for sometimes for the case to be copied")
time.sleep(60)
self.wait_to_click(self.copy_cases_menu)
self.driver.refresh()
time.sleep(5)
self.wait_for_element(self.apply, 70)
self.select_by_text(self.user_search_dropdown, assigned_username)
self.remove_default_users()
self.send_keys(self.users_field, assigned_username)
self.wait_to_click((By.XPATH, self.users_list_item.format(assigned_username)))
time.sleep(3)
self.send_keys(self.search_query, case_being_copied)
self.wait_to_click(self.apply)
time.sleep(5)
self.scroll_to_bottom()
self.sort_for_latest_on_top()
if self.is_present(self.empty_list):
print("No Case Copied, List is empty")
assert False
Expand Down
103 changes: 103 additions & 0 deletions HQSmokeTests/testPages/data/export_data_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ def __init__(self, driver):
self.date_range = (By.ID, "id_date_range")
self.close_date_picker = (By.XPATH, "//div[@data-action='close']")
self.case_owner = (By.XPATH, "//span[@class='select2-selection select2-selection--multiple']")
self.export_sharing = (By.XPATH, "//select[@id='sharing-select']")

# Export Form and Case data variables
self.export_form_data_link = (By.LINK_TEXT, 'Export Form Data')
Expand Down Expand Up @@ -169,6 +170,14 @@ def __init__(self, driver):
os.path.join(UserData.USER_INPUT_BASE_DIR, "test_data/import_parent_child_case.xlsx")
)

self.repeat_checkbox = (By.XPATH, "//span[./span[@data-bind='text: table.label()'][contains(.,'Repeat') or contains(.,'repeat')]]//preceding-sibling::span/input[@type='checkbox'][contains(@data-bind,'disabled: false')]")

# Shared Export
self.shared_export_name = "//div[@class='card-header'][.='Exports Shared with Me']//following-sibling::div//td[.//span[.='{}']]"
self.shared_export_view_button = "//td[.//span[.='{}']]//following-sibling::td//a[contains(@data-bind,'editUrl')]//span[contains(.,'View')][not(@style)]"
self.shared_export_edit_button = "//td[.//span[.='{}']]//following-sibling::td//a[contains(@data-bind,'editUrl')]//span[contains(.,'Edit')][not(@style)]"


def get_url_paste_browser(self, username, password, item):
if item == 'cases':
odata_feed_link = self.wait_to_get_value(self.copy_odata_link_case)
Expand Down Expand Up @@ -840,3 +849,97 @@ def verify_case_import(self, text):
self.wait_for_element((By.XPATH, self.case_id_value.format(parent_id)))
assert self.is_present(self.related_cases_tab), "Parent not reassigned"
self.validate_child_case_data()

def add_repeat_form_exports(self, app, case, form, export_name):
self.wait_for_element(self.add_export_button, 100)
self.delete_bulk_exports()
self.wait_and_sleep_to_click(self.add_export_button)
time.sleep(100)
self.is_visible_and_displayed(self.app_type, 200)
self.wait_for_element(self.app_type, 200)
self.is_clickable(self.app_type)
self.select_by_text(self.app_type, UserData.app_type)
self.select_by_text(self.application, app)
self.select_by_text(self.module, case)
self.select_by_text(self.form, form)
self.wait_to_click(self.add_export_conf)
self.wait_for_element(self.export_name, 200)
self.clear(self.export_name)
self.send_keys(self.export_name, export_name+Keys.TAB)
time.sleep(5)
self.scroll_to_bottom()
list_repeat = self.find_elements(self.repeat_checkbox)
if len(list_repeat) > 0:
assert True
else:
print("Repeat checkbox are either absent or not enabled")
assert False
time.sleep(5)
self.js_click(self.export_settings_create)
print("Export created!!")

def check_for_case_id(self, case_id):
self.wait_for_element(self.find_data_by_ID)
self.wait_to_click(self.find_data_by_ID)
self.wait_to_clear_and_send_keys(self.find_data_by_case_ID_textbox, case_id)
self.wait_and_sleep_to_click(self.find_data_by_case_ID_button)
self.wait_for_element(self.view_FormID_CaseID)
link = self.get_attribute(self.view_FormID_CaseID, "href")
print(link)
self.driver.get(link)
self.wait_for_element((By.XPATH, self.case_id_value.format(case_id)))
if self.is_present_and_displayed((By.XPATH, self.case_id_value.format(case_id))):
assert True, "Case ID not present"
print("Case ID present")
else:
print("Case ID not present")
assert False

def add_shared_form_exports(self, name, private='NO'):
self.wait_for_element(self.add_export_button, 100)
self.wait_and_sleep_to_click(self.add_export_button)
time.sleep(100)
self.is_visible_and_displayed(self.app_type, 200)
self.wait_for_element(self.app_type, 200)
self.is_clickable(self.app_type)
self.select_by_text(self.app_type, UserData.app_type)
self.select_by_text(self.application, UserData.village_application)
self.select_by_text(self.module, UserData.case_list_name)
self.select_by_text(self.form, UserData.form_name)
self.wait_to_click(self.add_export_conf)
self.wait_for_element(self.export_name, 200)
self.clear(self.export_name)
self.send_keys(self.export_name, name+Keys.TAB)
time.sleep(5)
if private == 'YES':
self.scroll_to_element(self.export_sharing)
self.select_by_value(self.export_sharing, 'private')
time.sleep(2)
else:
self.scroll_to_element(self.export_sharing)
self.select_by_value(self.export_sharing, 'edit_and_export')
time.sleep(2)
self.scroll_to_bottom()
time.sleep(5)
self.js_click(self.export_settings_create)
print("Export created!!")
time.sleep(10)

def verify_shared_export_section(self, shared_export, private_export, permission='YES'):
self.wait_to_click(self.export_form_data_link)
self.wait_for_element(self.add_export_button)
assert self.is_present_and_displayed((By.XPATH, self.shared_export_name.format(shared_export))), "Shared export not present"
assert not self.is_present_and_displayed((By.XPATH, self.shared_export_name.format(private_export)), 5
), "Private export present"
if permission == 'YES':
assert self.is_present_and_displayed((By.XPATH, self.shared_export_edit_button.format(shared_export))
), "Shared export edit button not present"
assert not self.is_present_and_displayed((By.XPATH, self.shared_export_view_button.format(private_export)), 5
), "Shared export view button present"
elif permission == 'NO':
assert self.is_present_and_displayed((By.XPATH, self.shared_export_view_button.format(shared_export))
), "Shared export view button not present"
assert not self.is_present_and_displayed((By.XPATH, self.shared_export_edit_button.format(private_export)), 5
), "Shared export edit button present"
else:
print("Permission value is missing.")
Loading
Loading