diff --git a/orgs/prerelease.json b/orgs/prerelease.json index 99e29580622..b37481bd41d 100644 --- a/orgs/prerelease.json +++ b/orgs/prerelease.json @@ -1,7 +1,7 @@ { "orgName": "NPSP - Prerelease Workspace", "edition": "Developer", - "instance": "CS46", + "instance": "CS340", "hasSampleData": "false", "settings": { "userManagementSettings": { diff --git a/robot/Cumulus/perftests/Insert_Tests.robot b/robot/Cumulus/perftests/Insert_Tests.robot index 4fad7334c2f..4fc15a6653a 100644 --- a/robot/Cumulus/perftests/Insert_Tests.robot +++ b/robot/Cumulus/perftests/Insert_Tests.robot @@ -27,7 +27,7 @@ Insert 200 Contacts @{objects}= run keyword if ${IncludeAddress} Get 200 Contacts With Address ... ELSE Get 200 Contacts Without Address Salesforce Collection Insert ${objects} - [return] ${objects} + RETURN ${objects} Insert 200 Opportunities [Arguments] ${IncludePayment} @@ -39,7 +39,7 @@ Insert 200 Opportunities Set Suite Variable ${COUNTER} ${COUNTER + 1} @{objects}= Get 200 Opportunities ${accounts} ${IncludePayment} Salesforce Collection Insert ${objects} - [return] ${objects} + RETURN ${objects} Insert 200 Non-NPSP Contacts [Documentation] Generate and Insert 200 Accounts and Contacts with all NPSP triggers disabled. @@ -70,7 +70,7 @@ Insert 200 Non-NPSP Contacts END Salesforce Collection Insert ${contacts} - [return] ${contacts} + RETURN ${contacts} ## ============================================================================================= ## Data Creation Keywords: @@ -97,7 +97,7 @@ Get 200 Opportunities ${account_id}= Set Variable ${account}[Id] set to dictionary ${object} AccountId ${account_id} END - [return] ${objects} + RETURN ${objects} Get 200 Contacts With Address [Documentation] Generate 200 Contact records with a Mailing Address @@ -114,7 +114,7 @@ Get 200 Contacts With Address ... Phone={{fake.phone_number}} ... Title=${random} ... Email=${timestamp}+{{number}}@${random}-{{number}}.com - [return] ${objects} + RETURN ${objects} Get 200 Contacts Without Address [Documentation] Generate 200 Contact records without a Mailing Address @@ -127,7 +127,7 @@ Get 200 Contacts Without Address ... Phone={{fake.phone_number}} ... Title=${random} ... Email=${timestamp}+{{number}}@${random}-{{number}}.com - [return] ${objects} + RETURN ${objects} ## ============================================================================================= ## Helper Keywords diff --git a/robot/Cumulus/resources/ContactPageObject.py b/robot/Cumulus/resources/ContactPageObject.py index 17700a5dab4..af017b9c726 100644 --- a/robot/Cumulus/resources/ContactPageObject.py +++ b/robot/Cumulus/resources/ContactPageObject.py @@ -1,5 +1,7 @@ +import time from cumulusci.robotframework.pageobjects import ListingPage from cumulusci.robotframework.pageobjects import DetailPage +from cumulusci.robotframework.pageobjects import BasePage from cumulusci.robotframework.pageobjects import pageobject from BaseObjects import BaseNPSPPage from NPSP import npsp_lex_locators @@ -14,6 +16,62 @@ def click_delete_account_button(self): self.selenium.wait_until_location_contains("/delete", message="Account delete page did not load in 30 seconds") self.npsp.select_frame_and_click_element("vfFrameId","button","Delete Account") +@pageobject("Custom", "ContactMerge") +class ContactMergePage(BaseNPSPPage, BasePage): + object_name = "Contact_Merge" + + def navigate_to_contact_merge_page(self, filter_name=None): + """To go to Contact Merge page""" + url_template = "{root}/lightning/n/{object}" + url = url_template.format(root=self.cumulusci.org.lightning_base_url, object=self.object_name) + self.selenium.go_to(url) + self.selenium.wait_until_location_contains( + self.object_name, + timeout=60, + message="Contact Merge page did not load in 1 min", + ) + self.selenium.reload_page() + self.salesforce.wait_until_loading_is_complete() + self.selenium.unselect_frame() + self.selenium.wait_until_page_contains_element("//iframe", timeout=120) + self.selenium.select_frame("//iframe") + + def click_search_contacts_button(self,search_value): + """Clicks on Search Contacts button""" + locator=npsp_lex_locators['id'].format("contactMergePage:pgHeader:srchByConBtn") + self.selenium.click_element(locator) + self.selenium.wait_until_page_contains("Enter search text to find duplicate Contacts") + search_locator=npsp_lex_locators['placeholder'].format("Search Contacts") + self.salesforce._populate_field(search_locator, search_value) + self.npsp.click_button_with_value("Search") + + def select_contact_checkbox(self,contact_number): + """Clicks on Contact Row Selection Checkbox""" + locator=npsp_lex_locators['contact_merge']['select_contact_checkbox'].format(contact_number) + self.selenium.click_element(locator) + time.sleep(1) + + def click_next_button(self): + """Clicks on Next button""" + locator=npsp_lex_locators['button'].format("Next") + self.selenium.click_element(locator) + self.selenium.wait_until_page_contains("Selected Contacts") + + def click_radio_button(self,field_value): + """Clicks on Radio Button With Provided Field Value""" + locator=npsp_lex_locators['contact_merge']['merge_page_radio'].format(field_value) + self.selenium.click_element(locator) + + def click_merge_button(self): + """Clicks on Merge button""" + locator=npsp_lex_locators['button-text'].format("Merge") + self.selenium.click_element(locator) + time.sleep(1) + locator=npsp_lex_locators['contact_merge']['merge_modal_button'] + self.selenium.click_element(locator) + time.sleep(5) + #self.selenium.wait_until_page_contains("Contact Details") + @pageobject("Details", "Contact") class ContactDetailPage(BaseNPSPPage, DetailPage): object_name = "Contact" @@ -23,7 +81,7 @@ def _is_current_page(self): by verifying that the url contains '/view' """ self.selenium.wait_until_location_contains("/view", timeout=60, message="Detail page did not load in 1 min") - self.selenium.location_should_contain("/lightning/r/Contact/",message="Current page is not a Contact record detail view") + self.selenium.location_should_contain("/lightning/r/Contact/", message="Current page is not a Contact record detail view") self.selenium.wait_until_page_contains("Contact Details") def update_field_value(self,field_name,old_value,new_value): @@ -47,7 +105,7 @@ def perform_action_on_related_item(self,action): """ Identifies the value and performs the specified action requested Currently added logic for Delete. In the future can be extended for Edit """ - drop_down = npsp_lex_locators['opportunities_dropdown'].format(1) + drop_down = npsp_lex_locators['locate_dropdown'].format(1) self.selenium.set_focus_to_element(drop_down) self.selenium.wait_until_element_is_visible(drop_down) self.selenium.click_element(drop_down) @@ -81,6 +139,7 @@ def validate_relation_status_message(self, contact1, contact2, relation): def verify_rollup_field_value(self,field_name,value,section=None): """Verifies if the given rollup field contains given value if it doesn't, then recalculates rollup and performs refresh""" + self.selenium.unselect_frame() try : self.npsp.navigate_to_and_validate_field_value(field_name,"contains",value,section) self.builtin.log("Found rollup value on the page on initial try") @@ -105,5 +164,5 @@ def open_relationships_viewer(self): self.selenium.wait_until_element_is_visible(locator) self.selenium.click_element(locator) self.selenium.wait_until_page_contains("Relationships Viewer") - link_locator=npsp_lex_locators['custom_objects']['actions-link'].format("Relationships_Viewer","Relationships_Viewer") - self.selenium.click_link(link_locator) \ No newline at end of file + link_locator=npsp_lex_locators['custom_objects']['option'].format("Relationships Viewer") + self.selenium.click_element(link_locator) \ No newline at end of file diff --git a/robot/Cumulus/resources/CustomizableRollupsPageObject.py b/robot/Cumulus/resources/CustomizableRollupsPageObject.py index a1a25111ec5..1272aed6067 100644 --- a/robot/Cumulus/resources/CustomizableRollupsPageObject.py +++ b/robot/Cumulus/resources/CustomizableRollupsPageObject.py @@ -18,8 +18,20 @@ def navigate_to_crlpsettings(self, filter_name=None): timeout=60, message="custom rollup settings page did not load in 1 min", ) - self.npsp.wait_for_locator("frame_new", "vfFrameId", "vfFrameId") - self.npsp.choose_frame("vfFrameId") + self.selenium.reload_page() + self.salesforce.wait_until_loading_is_complete() + self.builtin.sleep(60) + self.builtin.log(self.selenium.get_source()) + self.selenium.wait_until_page_contains("Account: Average Gift", timeout=60) + # self.selenium.wait_until_page_contains_element("//div[@class='oneAlohaPage']", timeout=120) + self.builtin.log(self.selenium.get_source()) + self.selenium.unselect_frame() + self.selenium.wait_until_page_contains_element("//iframe", timeout=120) + self.selenium.select_frame("//iframe") + + # self.npsp.wait_for_locator("frame_new", "vfFrameId", "vfFrameId") + # self.npsp.choose_frame("vfFrameId") + link = npsp_lex_locators["link-text"].format("Back to NPSP Settings") self.selenium.wait_until_page_contains_element( link, error="Current page is not a customizable rollups setting view" diff --git a/robot/Cumulus/resources/DataImportPageObject.py b/robot/Cumulus/resources/DataImportPageObject.py index a68bfc2de69..8967e70addc 100644 --- a/robot/Cumulus/resources/DataImportPageObject.py +++ b/robot/Cumulus/resources/DataImportPageObject.py @@ -33,6 +33,7 @@ def click(self,btn_name): def begin_data_import_process_and_verify_status(self,batch,status): """On the DI page, clicks the Begin Data Import Process button and waits for specified status to display """ + self.selenium.unselect_frame() self.npsp.wait_for_locator("frame","accessibility title") self.npsp.select_frame_and_click_element("accessibility title","button","Begin Data Import Process") self.npsp.wait_for_batch_to_process(batch,status) diff --git a/robot/Cumulus/resources/GiftEntryPageObject.py b/robot/Cumulus/resources/GiftEntryPageObject.py index 97fce621963..ed9299ed1d2 100644 --- a/robot/Cumulus/resources/GiftEntryPageObject.py +++ b/robot/Cumulus/resources/GiftEntryPageObject.py @@ -55,7 +55,9 @@ def click_gift_entry_button(self,title): locator=npsp_lex_locators["gift_entry"]["button"].format(title) self.selenium.wait_until_page_contains_element(locator) self.salesforce.scroll_element_into_view(locator) - self.selenium.click_element(locator) + # self.selenium.click_element(locator) + element = self.selenium.driver.find_element_by_xpath(locator) + self.selenium.driver.execute_script('arguments[0].click()', element) def select_template_action(self,name,action): diff --git a/robot/Cumulus/resources/LevelsPageObject.py b/robot/Cumulus/resources/LevelsPageObject.py index f587dab2d3d..c71d30b2899 100644 --- a/robot/Cumulus/resources/LevelsPageObject.py +++ b/robot/Cumulus/resources/LevelsPageObject.py @@ -30,6 +30,7 @@ def _is_current_page(self): self.selenium.wait_until_location_contains("/list",timeout=60, message="Records list view did not load in 1 min") self.selenium.location_should_contain("Level__c",message="Current page is not Level List view") + @capture_screenshot_on_error def navigate_to_level_page(self,mode): """ Navigate to create level or edit level mode from the list page based on the mode specified @@ -39,12 +40,13 @@ def navigate_to_level_page(self,mode): self.npsp.click_special_object_button("New") if mode.lower() == "edit": - drop_down = npsp_lex_locators['opportunities_dropdown'].format(1) + drop_down = npsp_lex_locators['locate_dropdown'].format(1) self.selenium.set_focus_to_element(drop_down) self.selenium.wait_until_element_is_visible(drop_down) self.selenium.click_element(drop_down) self.selenium.wait_until_page_contains("Edit") - self.selenium.click_link("Edit") + edit_button = npsp_lex_locators['levels']['action_button'].format("Edit") + self.selenium.click_element(edit_button) self.npsp.wait_for_locator('frame','accessibility title') self.npsp.choose_frame('accessibility title') diff --git a/robot/Cumulus/resources/ManageHouseHoldPageObject.py b/robot/Cumulus/resources/ManageHouseHoldPageObject.py index 1ff7594ed83..5fe426476b6 100644 --- a/robot/Cumulus/resources/ManageHouseHoldPageObject.py +++ b/robot/Cumulus/resources/ManageHouseHoldPageObject.py @@ -32,8 +32,8 @@ def change_address_using(self, option, **kwargs): Supported option is (Enter A new Address) """ if option.lower() == "enter a new address": - locator=npsp_lex_locators['button-title'].format("Enter a new address") - self.selenium.click_button(locator) + locator=npsp_lex_locators['button-text-span'].format("Enter a new address") + self.selenium.click_element(locator) self.npsp.populate_modal_form(**kwargs) self.selenium.click_button("Set Address") self.selenium.click_button("Save") @@ -55,13 +55,18 @@ def add_contact(self, option, value): lookup_ele=npsp_lex_locators['household_lookup_dropdown_menu'] self.selenium.wait_until_element_is_visible(lookup_ele) - if option.lower() in ("new", "existing"): - new_contact_locator=npsp_lex_locators['manage_hh_page']['add_contact_option'].format("New Contact") - new_contact_btn=npsp_lex_locators['button-title'].format("New Contact") - self.selenium.wait_until_element_is_visible(new_contact_locator) + new_contact_locator=npsp_lex_locators['manage_hh_page']['add_contact_option'].format("New Contact") + new_contact_btn=npsp_lex_locators['button-text'].format("New Contact") + self.selenium.wait_until_element_is_visible(new_contact_locator) + + if option.lower() in ("new"): self.selenium.click_element(new_contact_locator) self.selenium.wait_until_element_is_visible(new_contact_btn) self.selenium.click_button(new_contact_btn) + elif option.lower() in ("existing"): + button_title = "Add {}".format(value) + add_contact_locator=npsp_lex_locators['button-title'].format(button_title) + self.selenium.click_element(add_contact_locator) else: print("Invalid option") @@ -74,13 +79,13 @@ def validate_and_select_checkbox(self,contact,option): Select the option for name display settings for each of the contact in the household provided options (Household Name/ Formal Greeting/Informal Greeting) """ - self.npsp.choose_frame("accessibility title") + self.npsp.choose_frame("Manage Household") loc=self.npsp.validate_checkboxes(contact,option) self.selenium.double_click_element(loc) self.selenium.unselect_frame() def save_changes_made_for_manage_household(self): - self.npsp.choose_frame("accessibility title") + self.npsp.choose_frame("Manage Household") self.selenium.click_button("Save") self.selenium.unselect_frame() diff --git a/robot/Cumulus/resources/NPSP.py b/robot/Cumulus/resources/NPSP.py index 53e4e7b7c91..08af1b588c9 100644 --- a/robot/Cumulus/resources/NPSP.py +++ b/robot/Cumulus/resources/NPSP.py @@ -35,8 +35,11 @@ from locators_55 import npsp_lex_locators as locators_55 from locators_54 import npsp_lex_locators as locators_54 from locators_53 import npsp_lex_locators as locators_53 +from locators_64 import npsp_lex_locators as locators_64 locators_by_api_version = { + 65.0: locators_64, # winter '26 + 64.0: locators_64, # summer '25 55.0: locators_55, # summer '22 54.0: locators_54, # spring '22 53.0: locators_53 # winter '22 @@ -241,7 +244,7 @@ def select_row(self, value): for index, element in enumerate(list_ele): if element.text == value: drop_down = npsp_lex_locators['locate_dropdown'].format(index + 1) - self.selenium.get_webelement(drop_down).click() + self.selenium.driver.find_element_by_xpath(drop_down).click() self.selenium.wait_until_page_contains("Delete") def select_related_row(self, value): @@ -325,6 +328,9 @@ def verify_related_list_items(self,list_name,value): """Verifies a specified related list has specified value(doesn't work if the list is in table format)""" self.salesforce.load_related_list(list_name) locator=npsp_lex_locators['related_list_items'].format(list_name,value) + # header_locator=npsp_lex_locators['related_list_header'].format(list_name) + # self.selenium.page_should_contain_element(header_locator) + # locator=npsp_lex_locators['related_list_items_no_header'].format(value) self.selenium.page_should_contain_element(locator) def click_span_button(self,title): @@ -382,6 +388,9 @@ def verify_address_details(self,field,value,**kwargs): locator= npsp_lex_locators['detail_page']['address'].format(field) street, city, country = self.selenium.get_webelements(locator) + self.builtin.log(f"Element street: {street.text}") + self.builtin.log(f"Element city: {city.text}") + self.builtin.log(f"Element country: {country.text}") status = None for key, value in kwargs.items(): @@ -396,21 +405,21 @@ def verify_address_details(self,field,value,**kwargs): def validate_checkboxes(self,name,checkbox_title): """validates all 3 checkboxes for contact on manage hh page and returns locator for the checkbox thats required""" - locator=npsp_lex_locators['manage_hh_page']['mhh_checkbox'].format(name,"fauxCBInformal") + locator=npsp_lex_locators['manage_hh_page']['mhh_checkbox'].format(name,"Informal Greeting") self.selenium.page_should_contain_element(locator) - locator=npsp_lex_locators['manage_hh_page']['mhh_checkbox'].format(name,"fauxCBFormal") + locator=npsp_lex_locators['manage_hh_page']['mhh_checkbox'].format(name,"Formal Greeting") self.selenium.page_should_contain_element(locator) - locator=npsp_lex_locators['manage_hh_page']['mhh_checkbox'].format(name,"fauxCBExName") + locator=npsp_lex_locators['manage_hh_page']['mhh_checkbox'].format(name,"Household Name") self.selenium.page_should_contain_element(locator) if checkbox_title == "Informal Greeting": - locator=npsp_lex_locators['manage_hh_page']['mhh_checkbox'].format(name,"fauxCBInformal") + locator=npsp_lex_locators['manage_hh_page']['mhh_checkbox'].format(name,"Informal Greeting") elif checkbox_title == "Formal Greeting": - locator=npsp_lex_locators['manage_hh_page']['mhh_checkbox'].format(name,"fauxCBFormal") + locator=npsp_lex_locators['manage_hh_page']['mhh_checkbox'].format(name,"Formal Greeting") elif checkbox_title.capitalize() == "Household Name": - locator=npsp_lex_locators['manage_hh_page']['mhh_checkbox'].format(name,"fauxCBExName") + locator=npsp_lex_locators['manage_hh_page']['mhh_checkbox'].format(name,"Household Name") return locator def check_field_value(self, title, value): @@ -763,6 +772,7 @@ def choose_frame(self, value): frames = self.selenium.get_webelements(locator) self.selenium.capture_page_screenshot() print(f'list of frames {frames}') + self.selenium.unselect_frame() for frame in frames: print(f'inside for loop for {frame}') self.selenium.capture_page_screenshot() @@ -1160,8 +1170,8 @@ def click_wrapper_related_list_button(self,heading,button_title): def change_view_to(self,view_name): """Selects a different view for the object records in listing page""" locator=npsp_lex_locators['object_dd'] - view=npsp_lex_locators['link'].format(view_name,view_name) - self.selenium.wait_until_page_contains("List Views") + view=npsp_lex_locators['gift_entry']['lookup-option'].format(view_name) + # self.selenium.wait_until_page_contains("List Views") self.selenium.wait_until_element_is_visible(locator,30) try: self.selenium.get_webelement(locator).click() @@ -1169,8 +1179,10 @@ def change_view_to(self,view_name): self.selenium.execute_javascript("window.scrollBy(0,100)") ele = self.selenium.driver.find_element_by_xpath(locator) self.selenium.driver.execute_script('arguments[0].click()', ele) - element = self.selenium.driver.find_element_by_xpath(view) - self.selenium.driver.execute_script('arguments[0].click()', element) + self.selenium.wait_until_element_is_visible(view,10) + self.selenium.get_webelement(view).click() + # element = self.selenium.driver.find_element_by_xpath(view) + # self.selenium.driver.execute_script('arguments[0].click()', element) self.selenium.wait_until_page_contains(view_name) @capture_screenshot_on_error @@ -1278,6 +1290,9 @@ def scroll_button_into_view_and_click_using_js(self, value): self.npsp.click_button_with_value(value) time.sleep(1) + def get_next_year(self): + return datetime.now().year + 1 + def setupdata(self, name, contact_data=None, opportunity_data=None, account_data=None, payment_data=None, engagement_data=None, recurringdonation_data=None, gau_data=None): """ Creates an Account if account setup data is passed @@ -1632,8 +1647,8 @@ def click_show_more_actions_button(self,title): self.selenium.click_element(locator) time.sleep(1) self.selenium.wait_until_page_contains(title) - link_locator=npsp_lex_locators['custom_objects']['actions-link'].format(title,title) - self.selenium.click_link(link_locator) + link_locator=npsp_lex_locators['custom_objects']['option'].format(title) + self.selenium.click_element(link_locator) def get_url_formatted_object_name(self,name): """Returns a map with BaseURl and the namespace formatted object name""" diff --git a/robot/Cumulus/resources/NPSP.robot b/robot/Cumulus/resources/NPSP.robot index 4b643878aac..dbcac612840 100644 --- a/robot/Cumulus/resources/NPSP.robot +++ b/robot/Cumulus/resources/NPSP.robot @@ -34,7 +34,7 @@ API Create Contact ... LastName=${last_name} ... &{fields} &{contact} = Salesforce Get Contact ${contact_id} - [return] &{contact} + RETURN &{contact} API Modify Contact [Documentation] This keyword is used to update an existing contact by passing contact id and apifieldname and value. @@ -50,7 +50,7 @@ API Modify Contact ... select=Id,FirstName,LastName,Email ... Id=${contact_id} &{contact} = Get From List ${records} 0 - [return] &{contact} + RETURN &{contact} API Modify Recurring Donation [Documentation] This keyword is used to update an existing recurring donation record by passing id and @@ -67,7 +67,7 @@ API Modify Recurring Donation ... select=${ns}StartDate__c,npe03__Amount__c ... Id=${rd_id} &{rd} = Get From List ${records} 0 - [return] &{rd} + RETURN &{rd} API Create Campaign [Documentation] If no arguments are passed, this keyword will create a new campaign with just Name @@ -81,7 +81,7 @@ API Create Campaign ... Name=${name} ... &{fields} &{campaign} = Salesforce Get Campaign ${campaign_id} - [return] &{campaign} + RETURN &{campaign} API Create Opportunity [Documentation] Creates opportunity of specified type for specified account. Opportunity details can be passed as key, value pairs @@ -105,7 +105,7 @@ API Create Opportunity ... npe01__Do_Not_Automatically_Create_Payment__c=true ... &{fields} &{opportunity} = Salesforce Get Opportunity ${opp_id} - [return] &{opportunity} + RETURN &{opportunity} API Create Organization Account [Documentation] If no arguments are passed, this keyword will create an account of type organization with just Name @@ -121,7 +121,7 @@ API Create Organization Account ... RecordTypeId=${rt_id} ... &{fields} &{account} = Salesforce Get Account ${account_id} - [return] &{account} + RETURN &{account} API Create Primary Affiliation [Documentation] Creates a primary affiliation for a contact with specified account @@ -168,7 +168,7 @@ API Create Relationship ... npe4__Status__c=Current ... &{fields} &{relation} = Salesforce Get npe4__Relationship__c ${rel_id} - [return] &{relation} + RETURN &{relation} API Create Recurring Donation [Documentation] Creates a recurring donation with specified fields.This keyword returns the recurring donation dictonary when called @@ -180,7 +180,7 @@ API Create Recurring Donation ${recurring_id} = Salesforce Insert npe03__Recurring_Donation__c ... &{fields} &{recurringdonation} = Salesforce Get npe03__Recurring_Donation__c ${recurring_id} - [return] &{recurringdonation} + RETURN &{recurringdonation} API Create Payment [Documentation] Creates a payment record for the specified opportunity record with given parameters passed @@ -189,7 +189,7 @@ API Create Payment ... npe01__Opportunity__c=${opportunity} ... &{fields} &{payment} = Salesforce Get npe01__OppPayment__c ${pay_id} - [return] &{payment} + RETURN &{payment} API Query Installment [Documentation] Queries for record on opportunity object using recurring donation id, installment and other specified fields @@ -205,7 +205,7 @@ API Query Installment ... npe03__Recurring_Donation__c=${id} ... ${ns}Recurring_Donation_Installment_Name__c=${installment} ... &{fields} - [return] @{object} + RETURN @{object} API Create GAU [Documentation] If no arguments are passed, this keyword will create a GAU with Name @@ -220,7 +220,7 @@ API Create GAU ... Name=${name} ... &{fields} &{gau} = Salesforce Get ${ns}General_Accounting_Unit__c ${gau_id} - [return] &{gau} + RETURN &{gau} API Create GAU Allocation [Documentation] Creates GAU allocations for a specified opportunity. Pass either Amount or Percentage for Allocation @@ -236,7 +236,7 @@ API Create GAU Allocation ... ${ns}Opportunity__c=${opp_id} ... &{fields} &{gau_alloc} = Salesforce Get ${ns}Allocation__c ${all_id} - [return] &{gau_alloc} + RETURN &{gau_alloc} API Modify Allocations Setting [Documentation] Can be used to modify either Default Allocations or Payment Allocations. @@ -251,7 +251,7 @@ API Modify Allocations Setting Salesforce Update ${ns}Allocations_Settings__c ${setting}[Id] ... &{fields} &{alloc_setting} = Salesforce Get ${ns}Allocations_Settings__c ${setting}[Id] - [return] &{alloc_setting} + RETURN &{alloc_setting} API Create DataImportBatch [Documentation] Creates a batch gift entry batch with specified key,value pairs and return the batch record when keyword is called. @@ -265,7 +265,7 @@ API Create DataImportBatch ... Name=${name} ... &{fields} &{batch} = Salesforce Get ${ns}DataImportBatch__c ${batch_id} - [return] &{batch} + RETURN &{batch} API Create DataImport [Documentation] Creates a data import with specified key,value pairs and return the data import record when keyword is called. @@ -277,7 +277,7 @@ API Create DataImport ${dataimport_id} = Salesforce Insert ${ns}DataImport__c ... &{fields} &{data_import} = Salesforce Get ${ns}DataImport__c ${dataimport_id} - [return] &{data_import} + RETURN &{data_import} API Query Opportunity For Recurring Donation [Arguments] ${id} &{fields} @@ -286,7 +286,7 @@ API Query Opportunity For Recurring Donation ... select=Id ... npe03__Recurring_Donation__c=${id} ... &{fields} - [return] @{object} + RETURN @{object} # Validate Batch Process When CRLP Unchecked # [Documentation] Validates that all the Rollup Donations Batch processes complete successfully when CRLPs is disabled @@ -481,7 +481,7 @@ API Query Recurrring Donation Settings For RD2 Enablement @{record} = Salesforce Query npe03__Recurring_Donations_Settings__c ... select=${ns}IsRecurringDonations2Enabled__c &{rd2_enabled} = Get From List ${record} 0 - [return] ${rd2_enabled}[${ns}IsRecurringDonations2Enabled__c] + RETURN ${rd2_enabled}[${ns}IsRecurringDonations2Enabled__c] Enable RD2 [Documentation] Checks if Rd2 settings are already enabled and then run the scripts to enable RD2 @@ -514,7 +514,7 @@ API Get Id ... select=Id ... &{fields} &{Id} = Get From List ${records} 0 - [return] ${Id}[Id] + RETURN ${Id}[Id] Enable Gift Entry [Documentation] This keyword enables advanced mapping(prerequisite) and gift entry if not already enabled. @@ -531,7 +531,7 @@ API Query Record ... &{fields} &{Id} = Get From List ${records} 0 &{myrecord} = Salesforce Get ${object_name} ${Id}[Id] - [return] &{myrecord} + RETURN &{myrecord} API Check And Enable Gift Entry [Documentation] Checks through API if Advanced Mapping and Gift Entry are already enabled. If yes then does nothing. @@ -561,7 +561,7 @@ API Create Lead ${lead_id} = Salesforce Insert Lead ... &{fields} &{lead} = Salesforce Get Lead ${lead_id} - [return] &{lead} + RETURN &{lead} Create Gift Entry Batch [Documentation] Creates a new gift entry batch using the template specified and with given name diff --git a/robot/Cumulus/resources/NPSPSettingsPageObject.py b/robot/Cumulus/resources/NPSPSettingsPageObject.py index 2d19edd3204..18e8db3d298 100644 --- a/robot/Cumulus/resources/NPSPSettingsPageObject.py +++ b/robot/Cumulus/resources/NPSPSettingsPageObject.py @@ -19,6 +19,7 @@ def _go_to_page(self, filter_name=None): url = url_template.format(root=self.cumulusci.org.lightning_base_url, object=object_name) self.selenium.go_to(url) self.salesforce.wait_until_loading_is_complete() + self.selenium.unselect_frame() self.npsp.wait_for_locator("frame","accessibility title") self.npsp.choose_frame("accessibility title") @@ -151,6 +152,7 @@ def verify_advanced_mapping_is_not_enabled(self): def enable_advanced_mapping_if_not_enabled(self): """Checks if advanced mapping is Enabled and enables if not enabled""" locator=npsp_lex_locators['id'].format("navigateAdvancedMapping") + self.selenium.unselect_frame() if self.npsp.check_if_element_exists(locator): ele=self.selenium.get_webelement(locator) classname=ele.get_attribute("class") diff --git a/robot/Cumulus/resources/RecurringDonationsPageObject.py b/robot/Cumulus/resources/RecurringDonationsPageObject.py index b691c2d3e1c..24404fa46ab 100644 --- a/robot/Cumulus/resources/RecurringDonationsPageObject.py +++ b/robot/Cumulus/resources/RecurringDonationsPageObject.py @@ -18,7 +18,7 @@ class RDListingPage(BaseNPSPPage, ListingPage): @capture_screenshot_on_error def wait_for_rd2_modal(self): """Based on the button name (Cancel) or (Save) on the modal footer, selects and clicks on the respective button""" - btnlocator = npsp_lex_locators["button-with-text"].format("Save") + btnlocator = npsp_lex_locators["button-text"].format("Save") self.builtin.sleep(2,"Wait for the page to load fully") self.salesforce.scroll_element_into_view(btnlocator) self.selenium.wait_until_page_contains_element(btnlocator,timeout=60,error="Recurring Donations Modal window did not open") @@ -27,7 +27,7 @@ def wait_for_rd2_modal(self): @capture_screenshot_on_error def click_rd2_modal_button(self, name): """Based on the button name (Cancel) or (Save) on the modal footer, selects and clicks on the respective button""" - btnlocator = npsp_lex_locators["button-with-text"].format(name) + btnlocator = npsp_lex_locators["button-text"].format(name) self.builtin.sleep(2,"Wait for the elevate message to appear on the modal") self.selenium.wait_until_element_is_visible(btnlocator,60) self.salesforce.scroll_element_into_view(btnlocator) @@ -136,7 +136,7 @@ def edit_recurring_donation_status(self, **kwargs): self.selenium.wait_until_element_is_visible(edit_button,60) self.selenium.click_element(locator) time.sleep(3) - btnlocator = npsp_lex_locators["button-with-text"].format("Save") + btnlocator = npsp_lex_locators["button-text"].format("Save") self.selenium.wait_until_element_is_visible(btnlocator,60) self._populate_edit_status_values(**kwargs) self.salesforce.scroll_element_into_view(btnlocator) @@ -178,46 +178,9 @@ def pause_recurring_donation(self, type=None): self.npsp._loop_is_text_present("Pause") self.selenium.click_element(locator) if type != "Closed": - btnlocator = npsp_lex_locators["button-with-text"].format("Save") + btnlocator = npsp_lex_locators["button-text"].format("Save") self.selenium.wait_until_element_is_visible(btnlocator,60) - @capture_screenshot_on_error - def populate_pause_modal(self,**kwargs): - """ Populate the values in the pause recurring donation modal - based on the key value pair options in the kwargs passed as parameter - | Populate Pause Modal - | ... Paused Reason=Card Expired - | ... Date=${date} """ - for key, value in kwargs.items(): - if key in ("Paused Reason"): - locator = npsp_lex_locators["erd"]["modal_dropdown_selector"].format(key) - selection_value = npsp_lex_locators["erd"]["modal_selection_value"].format(value) - if self.npsp.check_if_element_exists(locator): - self.selenium.set_focus_to_element(locator) - self.selenium.wait_until_element_is_visible(locator) - self.salesforce.scroll_element_into_view(locator) - self.salesforce._jsclick(locator) - self.selenium.wait_until_element_is_visible(selection_value) - self.selenium.click_element(selection_value) - else: - self.builtin.log(f"Element {key} not present") - elif key in ("Date"): - for v in value: - checkbox = npsp_lex_locators["erd"]["pause_date_checkbox"].format(v) - time.sleep(1) - if (checkbox.is_selected() == False): - self.selenium.click_element(checkbox) - else: - self.builtin.log("This checkbox is already in the expected status", "WARN") - else: - raise Exception("Key not supported expected keys or ") - - btnlocator = npsp_lex_locators["button-with-text"].format("Save") - self.salesforce.scroll_element_into_view(btnlocator) - self.selenium.click_element(btnlocator) - self.salesforce.wait_until_modal_is_closed() - - @capture_screenshot_on_error def populate_pause_modal(self,**kwargs): """ Populate the values in the pause recurring donation modal @@ -246,7 +209,7 @@ def populate_pause_modal(self,**kwargs): self.selenium.click_element(checkbox) if "Validate" in key: self.validate_message_text(value) - btnlocator = npsp_lex_locators["button-with-text"].format("Save") + btnlocator = npsp_lex_locators["button-text"].format("Save") self.salesforce.scroll_element_into_view(btnlocator) self.selenium.click_element(btnlocator) self.salesforce.wait_until_modal_is_closed() diff --git a/robot/Cumulus/resources/locators_64.py b/robot/Cumulus/resources/locators_64.py new file mode 100644 index 00000000000..f3bed1d7134 --- /dev/null +++ b/robot/Cumulus/resources/locators_64.py @@ -0,0 +1,377 @@ +"""Locators for summer '25""" + +npsp_lex_locators={ + 'breadcrumb': "//li[contains(@class, 'slds-breadcrumb__item')]/span[text()='{}']", + 'spl-breadcrumb':"//div[@class= 'slds-media__body']/p[text()='{}']", + 'breadcrumb-link':"//a[@title='{}' and contains(@class,'BreadCrumbItem')]", + 'obj-header':"//h1//*[text()='{}']", + 'button-title':"//button[@title='{}']", + 'button-text':'//button[text()="{}"]', + 'button-text-span':'//button/span[text()="{}"]', + 'button-with-text':'//button[contains(text(),"{}")]', + 'dropdown_spinner': 'css: div#divLoading', + 'placeholder': "//*[contains(@placeholder,'{}')]", + 'datatable':"//*[contains(@data-qa-locator,'{}')]//tbody/tr[./th//*[text()='{}']]/td[@data-label='{}']", + 'app_launcher':{ + 'select-option':'//span/mark[text()="{}"]', + }, + 'object_dd':'//lst-list-view-picker', + 'lookup-option':'//li//lightning-base-combobox-item[@data-value="{}"]', + 'main-header':{ + "header_text": "//h1/div/span", + "header_text_spl": "//h1//lightning-formatted-text", + }, + "record": { + 'button':"//lightning-button/button[.='{}']", + 'select_value':"//li/a[text()='{}']", + 'select_dropdown':"//a[@class='select']", + 'footer':"//div[@class='footer active' or contains(@class,'footer-visible')]", + 'ltdatepicker':"//td[not(contains(@class,'slds-disabled-text'))]/*[text()='{}']", + 'lt_date_picker':"//label[./*[text()='{}']]/following-sibling::div//*[contains(@class,'input')]", + 'month_pick':"//div[@class='dateBar']//a[@title='{}']", + 'activity-button':'//button[contains(@class,"{}")]', + 'dd_edit_option': '//div[contains(@class,"branding-actions")]/ul/li/a[@title="{}"]', + 'edit_button':'//*[@title="{}"]', + 'edit_form': 'css: div.forcePageBlockItemEdit', + 'flexipage_edit_form': 'css: force-record-layout-item.slds-is-editing', + 'list':"//div[contains(@class,'forcePageBlockSectionRow')]/div[contains(@class,'forcePageBlockItem')]/div[contains(@class,'slds-hint-parent')]/div[@class='slds-form-element__control']/div[.//span[text()='{}']][//div[contains(@class,'uiMenu')]//a[@class='select']]", + 'rdlist':"//label[text()='{}']/following-sibling::div//div[contains(@class,'slds-dropdown-trigger') and @role='combobox']", + 'flexipage-list':'//lightning-combobox//label[text()="{}"]/ancestor::div[1]//button[contains(@class,"slds-combobox__input")]', + 'dropdown':"//div[@class='select-options']/ul[@class='scrollable']/li[@class='uiMenuItem uiRadioMenuItem']/a[contains(text(),'{}')]", + 'related': { + 'button':"//article[contains(@class, 'slds-card slds-card_boundary')][.//img][.//span[@title='{}']]//*[text()='{}']", + 'check_occurrence':'//h2/a/span[@title="{}"]/following-sibling::span[@title="{}"]', + 'drop-down':'//div[contains(@class, "slds-card")]/header[.//span[@title="{}"]]/parent::*/div/div/div/a[contains(@class, "slds-button")]', + 'title':'//div/h2//a[./span[text()="{}"]]', + 'viewall':'//article[contains(@class, "slds-card slds-card_boundary")][.//span[@title="{}"]]//a[.//span[@class="view-all-label"]]', + 'item':"//article[contains(@class, 'slds-card_boundary')][.//img][.//span[@title='{}']]//h3//a//span", + 'field_value': '//a[text()="{}"]/ancestor::article//div[contains(@class, "slds-item_detail")]//*[text()="{}"]', + 'link':"//article[contains(@class, 'slds-card slds-card_boundary')][.//span[@title='{}']]//table/tbody/tr[.//td//*[text()='{}']]/th//a", + 'dd-link':'//a[@name="{}"]', + 'allocations':"//article[contains(@class, 'slds-card slds-card_boundary')][.//table[@aria-label='{}']]//tbody/tr[.//td//*[text()='{}']]/td//*[text()='{}']", + "popup_trigger": "//article[.//span[@title='{}']]//tr[.//*[text()='{}']]//div[contains(@class,'slds-truncate')]//button[./span[text()='Show Actions']]", + }, + }, + "popup-link":"//div[contains(@class, 'uiPopupTarget')][contains(@class, 'visible')]//a[@title='{}']", + "alert": "//span[contains(@class,'toastMessage')]/a/div", + "alert-text":"//span[contains(@class,'toastMessage')]", + 'batch_status':'//div[contains(@class,"slds-tile__title")][.//*[text()="{}"]]/div[contains(@class,"slds-col")]//span[text()="{}"]', + 'popup': "//div[contains(@class, 'uiPopupTarget')][contains(@class, 'visible')]", + 'flexipage-popup':"//div[contains(@class, 'slds-is-open')][contains(@class, 'slds-combobox')]", + 'newflexi-popup':"//div[contains(@class,'modal-body')]//*[contains(@class,'slds-combobox')]", + 'test':'/html/body/div[6]/table/tbody/tr[23]/td[1]/a', + "toast-msg":"//span[@class='toastMessage slds-text-heading--small forceActionsText']", + "toast-close":"//button[contains(@class,'toastClose')]", + 'frame_new':'//iframe[contains(@name, "{}") or contains(@title, "{}")]', + 'frame':'//iframe[@title= "{}"]', + 'frame_by_name': "//iframe[contains(@name, '${}')]", + 'id':'//*[contains(@id,"{}")]', + 'button':'//input[contains(@value,"{}")]', + 'link':'//a[.//span[text()="{}" or contains(text(),"{}")]]', + 'more_actions_link':"//button[contains(@class,'slds-button_icon-border-filled') and @aria-haspopup='true']", + 'link-text':'//a[contains(text(),"{}")]', + 'link-title':'//a[@title="{}"]', + 'lightning-button':'//lightning-button/button[contains(text(),"{}")]', + 'link-contains':'//button[.//span[contains(text(),"{}")]]', + 'label':'//label[text()="{}"]', + 'checkbox':{ + 'model-checkbox':'//div[contains(@class,"uiInputCheckbox")]/label/span[text()="{}"]/../following-sibling::input[@type="checkbox"]', + 'details-checkbox':'//label[@class="slds-checkbox__label"][./span[text()="{}"]]/following-sibling::div//input', + 'table_checkbox':'//tbody/tr[./td[2]/a[text()="{}"]]/td/input[@type="checkbox"]', + 'id':'//input[@type="checkbox" and contains(@id,"{}")]', + }, + 'tabs':{ + 'tab': "//div[@class='uiTabBar']/ul[@class='tabs__nav']/li[contains(@class,'uiTabItem')]/a[@class='tabHeader']/span[contains(text(), '{}')]", + 'spl-tab':"//div[@class='slds-tabs_default']//ul[@class='slds-tabs_default__nav']/li[contains(@class,'slds-tabs_default__item')]/a[text()= '{}']", + }, + 'desktop_rendered': 'css: div.desktop.container.oneOne.oneAppLayoutHost[data-aura-rendered-by]', + 'loading_box': 'css: div.auraLoadingBox.oneLoadingBox', + 'contacts_actions_dropdown_menu': 'css: a.slds-grid--align-center[aria-expanded="true"]', + 'household_lookup_dropdown_menu': '//div[contains(@class, "slds-show")]', + 'spinner': 'css: div.slds-spinner', + 'Delete_opportunity_modal_button': 'css: div.forceModalActionContainer button.uiButton--brand', + 'modal_field':"//div[contains(@class, 'lookupInput')][./label[contains(text(), '{}')]]/div//span[@class='lookupInput']/input", + 'name':'//tbody/tr/th/span//a//span', + 'select_name':'//tbody//a[text()= "{}"]', + 'opportunities_dropdown':"css:a.slds-button.slds-button--icon-border-filled", + 'locate_dropdown':'//tbody/tr[{}]//lst-list-view-row-level-action//button', + 'locating_delete_dropdown':'//tbody//a[text()= "{}"]/../../following-sibling::td/span//div/a/lightning-icon', + 'related_name':'//tbody/tr/td/a[contains(@class,"forceOutputLookup")]', + 'rel_loc_dd':'//tbody/tr[{}]/td[4]//lightning-primitive-icon', + 'delete_icon':'//*[contains(@class,"slds-form-element")][./label[text()="{}"]]//input[@placeholder="{}"]/parent::div/parent::div/following-sibling::div/button', + 'delete_icon_record':'//label[contains(text() ,"{}")]/following::input[@placeholder = "{}"]/following-sibling::div/child::button[@title="Clear Selection"]', + 'aff_list':'//div[@role="tablist"]/following::div[@class = "container forceRelatedListSingleContainer"][7]/article/div[@class="slds-card__body"]/div/div/div/div/div/div/div/table/tbody/tr/td[1]', + 'aff_status':'//table[contains(@class,"slds-table")]/tbody//td//a//span[text()="{}"]/ancestor::tr//td[@data-label="Relationship Explanation"]', + 'relationship_status':'//lightning-formatted-text[contains(text(),"is")]', + 'aff_id':'//table[contains(@class,"slds-table")]/tbody//td//a//span[text()="{}"]', + 'click_aff_id':'//table[contains(@class,"forceRecordLayout")]/tbody/tr/th/div/a[text()="{}"]', + 'confirm': { + 'check_value':'//div[contains(@class, "forcePageBlockItem") or contains(@class, "slds-form-element_stacked")][.//span[text()="{}"]]//following-sibling::div[.//span[contains(@class, "test-id__field-value")]]//*[text()="{}"]', + 'check_text_value':'//div[contains(@class, "slds-form-element__label")][.//span[text()="{}"]]//following-sibling::div[.//span[contains(@class, "test-id__field-value")]]/descendant::lightning-formatted-text', + 'check_status':'//div[contains(@class, "slds-form-element__label")][.//span[text()="{}"]]//following-sibling::div[.//span[contains(@class, "test-id__field-value")]]/descendant::lightning-formatted-text[text()="{}"]', + 'check_name':'//div[contains(@class, "slds-form-element__label")][.//span[text()="{}"]]//following-sibling::div[.//span[contains(@class, "test-id__field-value")]]/descendant::lightning-formatted-name[text()="{}"]', + 'check_phone':'//div[contains(@class, "slds-form-element__label")][.//span[text()="{}"]]//following-sibling::div[.//span[contains(@class, "test-id__field-value")]]/descendant::lightning-formatted-phone/a[text()="{}"]', + 'check_address':'//div[contains(@class, "slds-form-element__label")][.//span[text()="{}"]]//following-sibling::div[.//span[contains(@class, "test-id__field-value")]]/descendant::lightning-formatted-address/a/div[text()="{}"]', + 'check_numbers':'//div[contains(@class, "slds-form-element__label")][.//span[text()="{}"]]//following-sibling::div[.//span[contains(@class, "test-id__field-value")]]/descendant::lightning-formatted-number[text()="{}"]', + 'check_email':'//div[contains(@class, "slds-form-element__label")][.//span[text()="{}"]]//following-sibling::div[.//span[contains(@class, "test-id__field-value")]]/descendant::lightning-formatted-email/a[text()="{}"]', + 'check_lookup':'//div[contains(@class, "slds-form-element__label")][.//span[text()="{}"]]//following-sibling::div[.//span[contains(@class, "test-id__field-value")]]/descendant::force-lookup//a//span[text()="{}"]', + }, + 'check_field':'//div[contains(@class, "forcePageBlockItem")][.//span[text()="{}"]]//following-sibling::div[.//span[contains(@class, "test-id__field-value")]]/span/div//a', + 'check_field_spl':'//div[contains(@class, "slds-form-element__label")][.//span[text()="{}"]]//following-sibling::div[.//span[contains(@class, "test-id__field-value")]]//a', + 'account_list':'//tbody/tr/th[.//span]/descendant::span[text()="{}"]', + 'dd_options':'//*[@id="p3"]/option[text()="{}"]', + 'related_list_items':'//article[contains(@class,"slds-card_boundary")][.//a[contains(@class, "slds-card")]/span[text() = "{}"]]//div[contains(@class, "listDisplays")]//*[text()="{}"]', + 'related_list_header':'//article[contains(@class,"slds-card_boundary")]//h1[text() = "{}"]', + 'related_list_items_no_header':'//div[contains(@class, "listDisplays")]//*[text()="{}"]', + 'span_button':'//span[text()="{}"]', + 'modalspan_button':'//div[contains(@class,"modal-body")]//span[text()="{}"]', + 'related_drop_down':"//li[contains(@class, 'forceRecordLayout')]//a[contains(text(), '{}')]/ancestor::h3[contains(@class, 'primaryField')]/following-sibling::div//a[@role='button']", + 'span':"//span[@title='{}']", + 'header_field_value':'//*[contains(@class, "slds-page-header__detail")][.//*[@title="{}"]]//*[text()="{}"]', + 'header_datepicker':'//li[contains(@class, "slds-page-header__detail")][.//p[contains(@class, "slds-text-heading--label")][@title="{}"]]//*[@class="uiOutputDate"]', + 'select_one_record':"//tbody/tr[1]/th/span/a", + 'click_search':'//div[@class="slds-form-element"][./label[text()="{}"]]/div/span/span/input[contains(@id,"inputX")]', + 'field': "//div[contains(@class, 'uiInput')][.//label[contains(@class, 'uiLabel')][.//span[text()='{}']]]//input", + 'field_lookup_value': "//a[@role='option'][.//div[@title='{}']]", + 'field-value':"//div[contains(@class,'slds-form-element')][./label[text()='{}']]/div/span", + 'header':'//h1//lightning-formatted-text[text()="{}"]', + 'check_related_list_item': '//article[.//span[text() = "{}"]]/descendant::tbody//th//a//span[text()="{}"]', + 'detail_page': { + 'section_header':'//h3//span[text()="{}"]', + 'address':'//h3[contains(@class, "slds-section__title")][.//span[contains(text(),"Address")]]/../..//div[contains(@class, "test-id")]/span[text()= "{}"]/../following-sibling::div//a//div[contains(@class, "slds")]', + 'field':'//h3[contains(@class, "slds-section__title")][.//span[text()="{}"]]/../..//div[contains(@class, "test-id")]/span[text()= "{}"]/../following-sibling::div//span[text()="{}"]', + 'field-value':{ + 'verify_field_value1':'//div[contains(@class, "forcePageBlockItem")]/div/div//span[text()="{}"]/../../div[2]/span/span[text() = "{}"]', + 'verify_field_value2':'//force-record-layout-item//div[./span[text()="{}"]]/following-sibling::div//lightning-formatted-text[text() = "{}"]', + 'verify_field_value3':'//records-record-layout-item//div[./span[text()="{}"]]/following-sibling::div//lightning-formatted-text[text() = "{}"]' + }, + 'edit_mode':{ + 'section_header':'//div[contains(@class,"forcePageBlockSectionEdit")]/h3//span[text()="{}"]', + }, + }, + 'contact_merge':{ + 'select_contact_checkbox':'//tr[@class="searchResultRow"][{}]//label[@class="slds-checkbox"]', + 'merge_modal_button':'//div[contains(@class,"slds-modal__footer")]//input[@value="Merge"]', + 'merge_page_radio':'//label[@class="slds-radio"]//span[contains(text(),"{}")]/ancestor::label', + }, + 'manage_hh_page':{ + 'address_link':'//h4[text()="{}"]', + 'address':'//div[contains(@class, "uiInput")][.//label[contains(@class, "uiLabel")]/span[text()="{}"]]/', + 'mhh_checkbox':'//*[@id="SortCanvas"]/li//a[text()="{}"]/ancestor::div[contains(@class, "slds-card__header")]/following-sibling::div[contains(@class,"slds-card__body")]//form//div//label/span[text()="{}"]', + 'button':'//*[text()="{}"]', + 'more_actions_btn': "//lightning-button-menu/button", + 'add_contact_option':'//li//span[text()="{}"]', + 'lookup':'//div[./span[text()="{}"]]//input', + }, + 'opportunity':{ + 'contact_role':'//div[contains(@class,"listItemBody")][./h3//a[text()="{}"]]//parent::h3/following-sibling::ul/li/div[contains(@class,"forceListRecordItem")]/div[@title="Role:"]/following-sibling::div/span[text()="{}"]', + }, + 'object':{ + 'record':'//tbody//a[text()= "{}"]', + 'field':"//lightning-textarea[.//label[text()='{}']]//textarea", + 'button': "//div[contains(@class,'windowViewMode')]//ul[contains(@class,'forceActionsContainer')][contains(@class,'oneActionsRibbon')]//a[@title='{}']", + 'radio_button':"//div[contains(@class,'changeRecordTypeRightColumn')]/div/label[@class='slds-radio']/div[.//span[text()='{}']]/preceding::div[1]/span[@class='slds-radio--faux']", + 'field-value':'//tbody/tr[./th//a[text()="{}"]]/td[.//span[text()="{}"]]', + }, + 'engagement_plan':{ + 'input_box':'//fieldset[./legend[text()="{}"]]//input[@aria-label="{}"]', + 'dropdown':'//div[contains(@class,"slds-p-top_small")]/label[text()="{}"]/following-sibling::div/select', + 'checkbox':'//div[contains(@class,"slds-p-top_small")]/label[@class="slds-checkbox"][./span/following-sibling::{}[text()="{}"]/]', + 'button':'//div[contains(@class,"slds-button-group")][.//span[text()="toTask {}"]]/button[contains(text(),"{}")]', + 'check_eng_plan':'//h2/a/span[@title="{}"]//ancestor::div[contains(@class, "slds-card__header slds-grid")]/following-sibling::div//tbody/tr/th/div/a', + 'dd':'//h2/a/span[@title="{}"]//ancestor::div[contains(@class,"slds-card__header slds-grid")]/following-sibling::div//tbody/tr/th/div/a/ancestor::th/following-sibling::td//lightning-primitive-icon', + 'tasks':'//div[contains(@class,"slds-section__content")]//a[text()="{}"]', + }, + 'levels':{ + 'id':'//input[contains(@id,"{}")]', + 'select':'//select[contains(@id,"{}")]', + 'action_button':'//a[contains(@class,"highlightButton")][@title="{}"]', + }, + 'custom_objects':{ + 'actions-link':'//a[@title="{}" or @name="{}"]', + 'option':'//a//span[text()="{}"]' + }, + 'payments':{ + 'date_loc':"//*[@id='pmtTable']/tbody/tr/td[3]/div//input", + 'no_payments':'//tbody/tr[./th//a[contains(@title,"PMT")]]/td[2]', + 'pays':'//tbody/tr[./th//a[contains(@title,"PMT")]]/td[.//span[text()="{}"]]', + 'pay_amount':'//tbody/tr[{}]/td[3]/span/span[text()="{}"]', + 'check_occurrence':'//h2/a/span[@title="{}"]/following-sibling::span', + 'text':'//*[@id="j_id0:vfForm:j_id76:util_formfield:inputx:util_inputfield:inputX"]', + 'field-value':"//div[contains(@class,'slds-form-element')][./span[text()='{}']]/following-sibling::div", + 'allocations':"//article[contains(@class, 'slds-card slds-card_boundary')][.//span[@title='{}']]//tbody/tr[./td//a[text()='{}']]/th", + 'loc1':"//tbody/tr/td[2]/span/span", + 'loc2':"//tbody/tr/td[3]/span/span", + }, + 'gaus':{ + 'input_field':'//div[@class="slds-form-element"][./label[text()="{}"]]/div/input', + }, + 'npsp_settings':{ + 'main_menu':'//div[@class="slds-tree__branch slds-tree__item"][.//a[text()="{}"]]', + 'donations_link':'//div/a[contains(text(),"{}") and not(contains(text(),"Recurring Donations"))]', + 'main_menu_link':'//div/a[contains(text(),"{}")]', + 'panel_sub_link':'//ul/li[contains(@class,"slds-is-selected")]/a[text()="{}"]', + 'field_value':"//div[@class='slds-form-element'][./label[contains(text(),'{}')]]/div/span", + 'side_panel':'//div[@id="{}"]//child::button[contains(@class,"chevronright")]', + 'list':"//div[@class='slds-form-element']/label[text()='{}']/following-sibling::div/select", + 'multi_list':'//div[contains(@class,"slds-form_horizontal")]/div[@class="slds-form-element"][./label[text()="{}"]]/div//select', + 'list_val':'//div[@class="slds-form-element"]/label[text()="{}"]/following-sibling::div/span[text()="{}"]', + 'status':'//div[contains(@class,"slds-tile__title")][.//span[text()="{}"]]/div[contains(@class,"slds-col")]//span[text()="{}"]', + 'button':'//form[.//h1[contains(text(),"{}")]]//input[contains(@value,"{}")]', + 'completed':'//span[contains(@class, \'slds-theme_success\')]', + 'batch-button':'//div[@id="{}"]//child::input[@value="{}"]', + 'checkbox':'//label[./span[text()="{}"]]/descendant::span[@class="slds-checkbox_faux"]', + 'erd_status_mapping_header':"//div/h1[contains(text(),'{}')]", + 'erd_state_status_mapping':"//tr[@data-row-key-value='{}']//lightning-primitive-cell-factory[@data-label='State']//lightning-base-formatted-text", + 'table_dropdown':"//tbody/tr[./th//*[text()='{}']]/td//button", + 'page_error':'//div[.//span[text()="{}"]]/slot//li[text()="{}"]', + 'field_error':'//tr[./td[@data-label="Field API Name"]//*[text()="{}"]]/td//button[contains(@class,"error")]' + }, + 'data_imports':{ + 'status':'//div[contains(@class,"slds-tile__title")][./p[text()="BDI_DataImport_BATCH"]]/div[contains(@class,"slds-col")]/span[text()="{}"]', + 'checkbox':'//tr[./th//a[@title="{}"]]/td//span[@class="slds-checkbox--faux"]', + 'actions_dd':'//button[@aria-expanded="true"][.//span[contains(text(),"more actions")]]', + 'check_status':'//div[contains(@class, "field-label-container")][.//span[text()="{}"]]//following-sibling::div[.//span[contains(@class, "test-id__field-value")]]/span//lightning-formatted-text', + }, + 'bge':{ + 'checkbox':'//label/span[text()="{}"]//parent::label/span[@class="slds-checkbox_faux"]', + 'field-duellist':'//label[text()="{}"]/following-sibling::lightning-dual-listbox//div[contains(@class,"slds-dueling-list__column")][./span[text()="{}"]]//div[contains(@class,"slds-dueling-list__options")]/ul/li//span[text()="{}"]', + 'duellist':'//h3[./span[text()="{}"]]/following-sibling::div//div[contains(@class,"slds-dueling-list__column")][./span[text()="{}"]]//div[contains(@class,"slds-dueling-list__options")]/ul/li//span[text()="{}"]', + 'duellist2':'//div/div[text()="{}"]/following-sibling::div//div[contains(@class,"slds-dueling-list__column")][./span[text()="{}"]]//div[contains(@class,"slds-dueling-list__options")]/ul/li//span[text()="{}"]', + 'field-select-button':'//label[text()="{}"]/following-sibling::lightning-dual-listbox//div[contains(@class,"slds-dueling-list__column")]//button[@title="{}"]', + 'select-button':'//h3[./span[text()="{}"]]/following-sibling::div//div[contains(@class,"slds-dueling-list__column")]//button[@title="{}"]', + 'select-button2':'//div/div[text()="{}"]/following-sibling::div//div[contains(@class,"slds-dueling-list__column")]//button[@title="{}"]', + 'title':'//p[text()="{}"]/following-sibling::h1', + 'field-input':'//label[text()="{}"]/following-sibling::div/input', + 'field-text':'//label[text()="{}"]/following-sibling::div/textarea', + 'button':'//div[contains(@class,"active")]/descendant::button[text()="{}"]', + 'month':"//div[@class='slds-align-middle']//button[@title='{}']", + 'date':"//div[contains(@class,'slds-datepicker')]//table[@class='slds-datepicker__month']//span[text()='{}']", + 'card-header':'//article[./div[@class="slds-card__body"]//lightning-formatted-text[text()="{}"]]//header', + 'edit_button':'//td[@data-label="{}"]//button', + 'edit_field':'//lightning-primitive-datatable-iedit-panel//input', + 'count':'//div[contains(@class,"BGE_DataImportBatchEntry")]//tbody/tr', + 'value':'//td[@data-label="{}"]//a', + 'name':'//div[contains(@class,"BGE_DataImportBatchEntry")]//tbody/tr/th//a', + 'locate_dropdown':'//div[contains(@class,"BGE_DataImportBatchEntry")]//tbody/tr[{}]/td[6]//div//button[./span[text()="Show actions"]]/lightning-primitive-icon', + 'gift-amount':'//div[./label[text()="{}"]]', + 'modal-link':'//tbody/tr/td/a[text()="{}"]', + 'datepicker_open':"//div[contains(@class,'slds-is-open')][./label[contains(text(),'{}')]]", + }, + 'bge-lists':{ + 'list1':"//div[./label[text()='{}']]/div//select", + 'list2':"//div[contains(@class,'slds-grid')]/div[contains(@class,'slds-text-align_left')]/span[text()='{}']/../following-sibling::div//select", + 'list3':"//div[./label/span[text()='{}']]/div//select", + + }, + 'bge-duellist-btn':{ + 'select-button':'//h3[./span[text()="{}"]]/following-sibling::div//div[contains(@class,"slds-dueling-list__column")]//button[@title="{}"]', + 'select-button2':'//div/div[text()="{}"]/following-sibling::div//div[contains(@class,"slds-dueling-list__column")]//button[@title="{}"]', + 'field-select-button':'//label[text()="{}"]/following-sibling::lightning-dual-listbox//div[contains(@class,"slds-dueling-list__column")]//button[@title="{}"]', + }, + + 'object_manager':{ + 'button':'//input[@title="{}"]', + 'input':'//input[@id="{}"]', + 'select_related':'//select[@id = "{}"]', + 'select_related_option':'//select[@id = "DomainEnumOrId"]/option[@value="{}"]', + 'search_result': '//tbody/tr/td/a/span[contains(text(),"{}")]', + 'formula_txtarea': '//textarea[@id = "{}"]', + 'object_result': '//th/a[text()="{}"]', + 'field_result': '//td/a/span[text()="{}"]', + 'new_picklist_btn': '//td[@class="pbButton"]/input[@title="{}"]', + 'picklist_txtarea': '//textarea[@title = "{}"]', + 'field_dropdown':'//tr[./td/a/span[text()="{}"]]/td//div[contains(@class,"slds-dropdown-trigger")]/a', + }, + 'custom_settings':{ + 'subtree':'//a/mark[text()="{}"]', + 'link':"//table[@class='list']/tbody/tr[./th/a[text()='{}']]/td/a[text()='{}']", + 'cbx_status':'//table[@class="detailList"]/tbody/tr/th[./span[text()="{}"]]/following-sibling::td//img[@title="{}"]', + }, + 'adv_mappings':{ + 'dropdown':"//tr[./th//*[text()='{}']]/td[.//span[text()='Show actions']]//button", + 'modal_open':'//div[contains(@class,"slds-backdrop_open")]', + 'field_mapping':'//input[@name="{}"]', + 'combobox':'//div[contains(@class,"slds-listbox") and @role="listbox"]', + 'footer-btn':"//footer[@class='slds-modal__footer']/button[text()='{}']", + 'field-label':'//lightning-primitive-cell-factory//*[text()="{}"]', + 'field_dd_option':'//div[contains(@class,"slds-input-has-icon")][./input[@name="{}"]]/following-sibling::div//span[@title="{}"]', + }, + 'modal-form':{ + 'label':'//label[text()="{}"]', + }, + # Customizable rollups related element locators + 'crlps':{ + 'select_locator': "//select[@name ='{}']", + 'success_toast': "//div[@class='{}']", + 'active_setting_record': "//td[@data-label='Active']/following::tr/th//span/div//lightning-button/button[text()='{}']", + 'rollup_progress_notification': "//div/h2[contains(text(),'{}')]", + 'rollup_options':"//tr[./th//button[text()='{}']]/td//button", + 'modal-button': '//footer/button[text()="Save"]', + }, + 'gift_entry':{ + 'id':'//*[contains(@data-qa-locator,"{}")]', + 'button':'//*[contains(@data-qa-locator,"{}")]/button', + 'field_input':'//*[contains(@data-qa-locator,"{}")]//child::{}', + 'field_span':'//*[contains(@data-qa-locator,"{}")]//child::span[text()="{}"]', + 'actions_dropdown':'//tbody/tr[./th//a[text()="{}"]]/td//button', + 'form_object_dropdown':'//*[@data-qa-locator="{}"]//button', + 'object_field_checkbox':'//*[@data-object-mapping-label="{}" and contains(@data-qa-locator,"{}")]//child::input', + 'field_alert':"//*[contains(@data-qa-locator,'{}')]/div[@role='alert' and text()='{}']", + 'count':'//lightning-layout[.//span[text()="{}"]]//child::lightning-layout-item//strong[text()="{}"]', + 'duellist':'//div[contains(@class,"slds-dueling-list__column")][./span[text()="{}"]]//div[contains(@class,"slds-dueling-list__options")]/ul/li//span[text()="{}"]', + 'table':'//*[@data-qa-locator="datatable {}"]//tbody//lightning-primitive-cell-factory[@data-label="{}"][.//*[text()="{}"]]', + 'lookup-option':'//li/lightning-base-combobox-item[.//*[@title="{}"]]', + 'datatable_options_icon':"//*/lightning-primitive-cell-factory/span/div//a[contains(text(),'{}')]/following::lightning-primitive-cell-actions//button[@aria-expanded='false']/lightning-primitive-icon", + 'datatable_field_by_name':"//lightning-primitive-cell-factory/span/div//a[contains(text(),'{}')]/following::lightning-primitive-cell-factory[@data-label='{}'][.//*[text()='{}']]", + 'datatable-menu-item':"//lightning-menu-item/a/span[text()='{}']", + 'new-section-field-bundle':"//article[@data-qa-locator='form section New Section'][.//label[text()='{}']]", + 'alert':'//div[@role="alert" and contains(@class,"slds-theme_{}")][./span[text()="{}"]]/h2[text()="{}"]', + 'element_text':'//*[contains(@data-qa-locator,"{}") and text()="{}"]', + 'page_error':'//div[contains(@class,"pageLevelErrors")]', + 'picklist_values':'//*[contains(@data-qa-locator,"{}")]//child::lightning-base-combobox-item[@data-value="{}"]', + 'modal_field':'//div[@class="modal-body scrollable slds-modal__content slds-p-around--medium"]//*[contains(@data-qa-locator,"{}")]//child::{}', + 'modal_button':'//div[@class="modal-body scrollable slds-modal__content slds-p-around--medium"]//*[contains(@data-qa-locator,"{}")]/button', + 'modal_id':'//div[@class="modal-body scrollable slds-modal__content slds-p-around--medium"]//*[contains(@data-qa-locator,"{}")]', + 'modallookup-option':'//div[@class="modal-body scrollable slds-modal__content slds-p-around--medium"]//li/lightning-base-combobox-item[.//*[@title="{}"]]', + 'remove_lookup':'//div[@class="modal-body scrollable slds-modal__content slds-p-around--medium"]//*[contains(@data-qa-locator,"button Remove selected option Opportunity: Record Type")]', + 'click-dropkown-value':"//div[@class='modal-body scrollable slds-modal__content slds-p-around--medium']//*[contains(@class,'slds-combobox')]//span[text()='{}'']", + 'modal_lookup_button':'//div[contains(@class,"modal-body")]//*[contains(@data-qa-locator,"{}")]//child::button', + 'form_error':'//div[.//span[text()="{}"]]/div[text()="{}"]', + 'field_error':'//*[contains(@data-qa-locator,"{}")]/div[text()="{}"]', + 'temp_builder_labels':'//lightning-input[@class="slds-truncate slds-form-element"]//label', + 'ge_form_labels':'//label[@class="slds-form-element__label" or @class="slds-form-element__label slds-no-flex"]', + 'temp_builder_sections':'//h2[@class="slds-card__header-title"]', + 'ge_form_sections':'//span[contains(@title,"{}")]', + 'progress_bar':'//lightning-layout-item[.//span[text()="{}"]]//child::lightning-layout-item//*[text()="{}"]', + 'batch_error':'//div[@role="alert" and contains(@class,"slds-theme--error")]//div[text()="{}"]/following-sibling::span[text()="{}"]', + 'close_error':'//div[@role="alert" and contains(@class,"slds-theme--error")]//child::button', + 'perms_error':'//div[@class="slds-illustration slds-illustration_large"]', + 'template_required_checkbox':'//lightning-input[@data-qa-locator="checkbox Required {}"]', + 'success_toast':'//span[contains(text(),"{} was processed.")]', + 'collapse_header':'//span[contains(@title,"Gift Entry Form")]', + 'form_header':'//span[contains(text(),"{}")]' + }, + # Enhanced Recurring Donation (erd) related element locators + 'erd':{ + 'active_schedules_card': "//div[contains(@class, 'slds-media__body')]/h3[contains(@title,'{}')]", + 'modal_dropdown_selector': "//label[text()='{}']/ancestor::div[1]//div[contains(@class,'slds-dropdown-trigger')]", + 'modal_input_field': "//div[contains(@class,'active')]//label[text()='{}']/following-sibling::div/input", + 'modal_selection_value': "//lightning-base-combobox-item[@data-value='{}']", + 'installment_row' : "//table[contains(@class, 'slds-table_edit')]/tbody/tr", + 'text_message':'//span[contains(@class,"slds-text-color_error")]', + 'rd2_installed': "//c-progress-ring/following-sibling::lightning-formatted-text[text() = 'Enable Enhanced Recurring Donations']", + 'installment_date' : "//table[contains(@class, 'slds-table_edit')]/tbody/tr[{}]/th//span/div/lightning-formatted-date-time", + 'formatted_number':"//lightning-formatted-text[text() = '{}']/following::lightning-layout-item[contains(@class,'slds-dl_horizontal__detail')]/slot/lightning-formatted-number", + 'formatted_date':"//lightning-formatted-text[contains(text(),'{}')]/following::lightning-layout-item[contains(@class,'slds-dl_horizontal__detail')]/slot/lightning-formatted-date-time", + 'formatted_text':"//lightning-formatted-text[contains(text(),'{}')]/following::lightning-layout-item[contains(@class,'slds-dl_horizontal__detail')]/slot/lightning-formatted-text", + 'pause_date_checkbox':"//h2[contains(text(),'Pause')]/following::th//span/div/lightning-formatted-date-time[text()='{}']/ancestor::tr/td/descendant::label/span[contains(@class,'checkbox')]", + 'date_with_paused_txt':"//td//lightning-base-formatted-text[text()='Paused']/preceding::th//lightning-formatted-date-time[text()='{}']", + 'warning_message':'//lightning-formatted-rich-text/span[contains(text() ,"{}")]' + }, + +} + +extra_locators={ + 'related_list_items1':'//div[@class = "forceRelatedListContainer"][.//a[contains(@class, "slds-card")]]//span[text() = "Relationships"]/ancestor::div[contains(@class, "slds-card")]/following-sibling::div[contains(@class, "slds-card")]//tbody//td/span[text()="{}"]', +} \ No newline at end of file diff --git a/robot/Cumulus/tests/browser/2_batch_data_imports/bdi_reprocess_failed_DI.robot b/robot/Cumulus/tests/browser/2_batch_data_imports/bdi_reprocess_failed_DI.robot index bcb84ce09ce..64b5e13373e 100644 --- a/robot/Cumulus/tests/browser/2_batch_data_imports/bdi_reprocess_failed_DI.robot +++ b/robot/Cumulus/tests/browser/2_batch_data_imports/bdi_reprocess_failed_DI.robot @@ -33,7 +33,7 @@ Create Data Import Record ... ${ns}Donation_Date__c=${date} ... ${ns}Donation_Donor__c=Contact1 ... ${org_ns}CO2_currency__c=500 - [return] &{data_import} + RETURN &{data_import} Create Data Import with GAU Details &{data_import} = API Create DataImport @@ -43,7 +43,7 @@ Create Data Import with GAU Details ... ${ns}Donation_Date__c=${date} ... ${ns}Donation_Donor__c=Contact1 ... ${ns}GAU_Allocation_1_Percent__c=50 - [return] &{data_import} + RETURN &{data_import} *** Test Cases *** Verify Donation Creation Fails on Incorrect Data and Reprocess diff --git a/robot/Cumulus/tests/browser/2_batch_data_imports/bdi_with_custom_object.robot b/robot/Cumulus/tests/browser/2_batch_data_imports/bdi_with_custom_object.robot index fa2e00d2af2..6dc1de7250b 100644 --- a/robot/Cumulus/tests/browser/2_batch_data_imports/bdi_with_custom_object.robot +++ b/robot/Cumulus/tests/browser/2_batch_data_imports/bdi_with_custom_object.robot @@ -43,7 +43,7 @@ Create Data Import Record ... ${org_ns}CO1_Text__c=Robot Automation ... ${org_ns}CO1_textarea__c=This is custom object data created via Automation ... ${org_ns}CO1_url__c=robot.#23@xyz.com - [return] &{data_import} + RETURN &{data_import} *** Test Cases *** diff --git a/robot/Cumulus/tests/browser/affiliations/remove_primary_affiliation.robot b/robot/Cumulus/tests/browser/affiliations/remove_primary_affiliation.robot index a808271c869..cc722ee4a72 100644 --- a/robot/Cumulus/tests/browser/affiliations/remove_primary_affiliation.robot +++ b/robot/Cumulus/tests/browser/affiliations/remove_primary_affiliation.robot @@ -36,7 +36,7 @@ Remove Primary Affiliation for Contact Go To Page Details Contact object_id=${contact1}[Id] Select Tab Related Click Related Item Popup Link Organization Affiliations ${account1}[Name] Delete - Wait For Modal New Affiliation expected_heading=Delete Affiliation + Wait For Modal New Affiliation Click Modal Button Delete Wait Until Modal Is Closed Go To Page Details Account object_id=${account1}[Id] diff --git a/robot/Cumulus/tests/browser/contacts_accounts/add_existingcontact_household.robot b/robot/Cumulus/tests/browser/contacts_accounts/add_existingcontact_household.robot index a50fcbefe82..46aee8bafa7 100644 --- a/robot/Cumulus/tests/browser/contacts_accounts/add_existingcontact_household.robot +++ b/robot/Cumulus/tests/browser/contacts_accounts/add_existingcontact_household.robot @@ -26,7 +26,7 @@ Add Existing Contact to Existing Household [Documentation] Create 2 contacts with API which inturn creates 2 household accounts. ... Open contact2 record and change the account name to contact1 account ... verify that both the contacts are now showing under contact1 account - [tags] feature:Contacts and Accounts unit + [tags] feature:Contacts and Accounts unstable Go To Page Details Contact object_id=${contact2}[Id] Edit Record Wait For Modal New Contact expected_heading=Edit ${contact2}[FirstName] ${contact2}[LastName] diff --git a/robot/Cumulus/tests/browser/contacts_accounts/add_newcontact_household.robot b/robot/Cumulus/tests/browser/contacts_accounts/add_newcontact_household.robot index bb57fcc58ab..f6121a4ffc5 100644 --- a/robot/Cumulus/tests/browser/contacts_accounts/add_newcontact_household.robot +++ b/robot/Cumulus/tests/browser/contacts_accounts/add_newcontact_household.robot @@ -44,7 +44,7 @@ Add New related Contact to Household With Different LastName Click Modal Button Save Wait Until Modal Is Closed Go To Page Listing Contact - Click Link link= ${first_name} ${last_name} + Click Link ${first_name} ${last_name} Current Page Should Be Details Contact ${contact_id2} = Save Current Record ID For Deletion Contact &{contact2} Verify Record Is Created In Database Contact ${contact_id2} diff --git a/robot/Cumulus/tests/browser/contacts_accounts/create_household.robot b/robot/Cumulus/tests/browser/contacts_accounts/create_household.robot index 2ea9bead8d3..fa4fd8c08a5 100644 --- a/robot/Cumulus/tests/browser/contacts_accounts/create_household.robot +++ b/robot/Cumulus/tests/browser/contacts_accounts/create_household.robot @@ -41,7 +41,7 @@ Create Household With Name Only ... Last Name=${last_name} Click Modal Button Save Wait Until Modal Is Closed - Current Page Should Be Details Contact + # Current Page Should Be Details Contact #Verify contact is created and shows under recently viewed ${contact_id} = Save Current Record ID For Deletion Contact @@ -89,11 +89,11 @@ Create Household With additional details &{contact2} Verify Record Is Created In Database Contact ${contact_id2} Store Session Record Account ${contact2}[AccountId] Header Field Value Account Name ${last_name2} Household - Page Should Contain 50 Fremont Street + # Page Should Contain 50 Fremont Street Go To Page Listing Contact Verify Record ${first_name2} ${last_name2} Verify Record ${first_name1} ${last_name1} - Click Link ${first_name1} ${last_name1} + Click Link With Spantext ${first_name1} ${last_name1} Current Page Should Be Details Contact ${contact_id1} = Save Current Record ID For Deletion Contact &{contact1} Verify Record Is Created In Database Contact ${contact_id1} diff --git a/robot/Cumulus/tests/browser/contacts_accounts/create_organization.robot b/robot/Cumulus/tests/browser/contacts_accounts/create_organization.robot index a0fcea0cd28..16af2694e20 100644 --- a/robot/Cumulus/tests/browser/contacts_accounts/create_organization.robot +++ b/robot/Cumulus/tests/browser/contacts_accounts/create_organization.robot @@ -38,7 +38,7 @@ Create Organization Foundation #Verify Account is only displayed in expected views Go To Page Listing Account Verify Record ${account_name} - Change View To Organization Accounts - Verify Record ${account_name} - Change View To Household Accounts - Wait Until Page Does Not Contain ${account_name} + # Change View To Organization Accounts + # Verify Record ${account_name} + # Change View To Household Accounts + # Wait Until Page Does Not Contain ${account_name} diff --git a/robot/Cumulus/tests/browser/contacts_accounts/deletebehaviors_household.robot b/robot/Cumulus/tests/browser/contacts_accounts/deletebehaviors_household.robot index 62242df16b2..f185b0045c5 100644 --- a/robot/Cumulus/tests/browser/contacts_accounts/deletebehaviors_household.robot +++ b/robot/Cumulus/tests/browser/contacts_accounts/deletebehaviors_household.robot @@ -23,7 +23,7 @@ Delete Contact with Closed Won Opportunity from Household [Documentation] Create a contact and an opportunity for the contact in closed won stage via API. ... On trying to delete the contact verify that a error is thrown [tags] feature:Contacts and Accounts unit - Go To Page Listing Contact + Go To Page Listing Contact Select Row ${Contact}[FirstName] ${Contact}[LastName] Click Link title=Delete Click Delete Account Button diff --git a/robot/Cumulus/tests/browser/contacts_accounts/merge_contacts.robot b/robot/Cumulus/tests/browser/contacts_accounts/merge_contacts.robot new file mode 100644 index 00000000000..926d99d19cf --- /dev/null +++ b/robot/Cumulus/tests/browser/contacts_accounts/merge_contacts.robot @@ -0,0 +1,45 @@ +*** Settings *** + +Resource robot/Cumulus/resources/NPSP.robot +Library cumulusci.robotframework.PageObjects +... robot/Cumulus/resources/ContactPageObject.py +... robot/Cumulus/resources/AccountPageObject.py +... robot/Cumulus/resources/NPSP.py +Suite Setup Run keywords +... Open Test Browser +... Setup Test Data +Suite Teardown Capture Screenshot and Delete Records and Close Browser + +*** Keywords *** +Setup Test Data + ${first_name} = Generate Random String + Set suite variable ${first_name} + ${first_name2} = Generate Random String + Set suite variable ${first_name2} + ${last_name} = Generate Random String + Set suite variable ${last_name} + &{contact1} = API Create Contact Email=${EMAIL1} LastName=${last_name} FirstName=${first_name} + Set suite variable &{contact1} + &{contact2} = API Create Contact Email=${EMAIL2} LastName=${last_name} FirstName=${first_name2} + Set suite variable &{contact2} + +*** Variables *** +${EMAIL1} user1@example.com +${EMAIL2} user2@example.com + +*** Test Cases *** + +Merge Two Contacts with Same LastName + [Documentation] Create two contacts using the backend API. Navigate to the + ... Contact Merge page and merge the contacts + [tags] feature:Contacts And Accounts unit unstable + + Load Page Object Custom ContactMerge + Navigate To Contact Merge Page + Click Search Contacts Button ${last_name} + Select Contact Checkbox 1 + Select Contact Checkbox 2 + Click Next Button + Click Radio Button ${first_name} + Click Merge Button + Navigate To And Validate Field Value Name contains ${first_name} ${last_name} diff --git a/robot/Cumulus/tests/browser/crlps/last_soft_credit_opportunity.robot b/robot/Cumulus/tests/browser/crlps/last_soft_credit_opportunity.robot index 62a21b56d3b..e3eea428f4f 100644 --- a/robot/Cumulus/tests/browser/crlps/last_soft_credit_opportunity.robot +++ b/robot/Cumulus/tests/browser/crlps/last_soft_credit_opportunity.robot @@ -32,7 +32,7 @@ Create Crlp For Automated Soft Credit ... Enable CRLP from settings, create a setting record. Create an opportunity associated with a contact that is not primary ... Run the relevant rollup batch job and ensure that rollups are happening and displayed on the opportunity page - [tags] feature:CRLP unstable api quadrant:q3 + [tags] feature:CRLP unstable api quadrant:q3 jenkins_debug # Create a custom lookup field requried for this particular testcase Create Customfield In Object Manager diff --git a/robot/Cumulus/tests/browser/crlps/total_gifts_3yrs_ago.robot b/robot/Cumulus/tests/browser/crlps/total_gifts_3yrs_ago.robot index c54fc8dee3e..913ea5eecd6 100644 --- a/robot/Cumulus/tests/browser/crlps/total_gifts_3yrs_ago.robot +++ b/robot/Cumulus/tests/browser/crlps/total_gifts_3yrs_ago.robot @@ -23,7 +23,7 @@ Setup Test Data Calculate CRLPs for Total Gifts 3 Years Ago [Documentation] Create a New rollup for Total Gifts 3 years ago by cloning an existing rollup called Total Gifts Two Years Ago ... and create an opportunity for 3 ago from current date and verify the rollup value on newly created Total Gifts Three Years Ago field - [tags] feature:CRLP unstable api quadrant:q3 + [tags] feature:CRLP unstable api quadrant:q3 jenkins_debug # clone an existing rollup and create a new one and verify that its created Load Page Object Custom CustomRollupSettings diff --git a/robot/Cumulus/tests/browser/crlps/total_gifts_current_year.robot b/robot/Cumulus/tests/browser/crlps/total_gifts_current_year.robot index 035e5407194..fbba6d18b04 100644 --- a/robot/Cumulus/tests/browser/crlps/total_gifts_current_year.robot +++ b/robot/Cumulus/tests/browser/crlps/total_gifts_current_year.robot @@ -30,7 +30,7 @@ Setup Test Data Calculate CRLPs for Total Gifts On Multiple Opportunities [Documentation] This test case is aimed at validating that the customizable rollup "Total Gifts" is active by default when the CRLP setting is turned ... And verifies that the rollup is actually happening - [tags] feature:CRLP unstable api quadrant:q3 + [tags] feature:CRLP unstable api quadrant:q3 jenkins_debug Load Page Object Custom CustomRollupSettings diff --git a/robot/Cumulus/tests/browser/engagement_plans/add_engagement_plan_to_contact.robot b/robot/Cumulus/tests/browser/engagement_plans/add_engagement_plan_to_contact.robot index e8e7a2ef9f7..25b38ccac7c 100644 --- a/robot/Cumulus/tests/browser/engagement_plans/add_engagement_plan_to_contact.robot +++ b/robot/Cumulus/tests/browser/engagement_plans/add_engagement_plan_to_contact.robot @@ -56,7 +56,7 @@ Create a Contact and Add Engagement Plan Populate Lookup Field Engagement Plan Template Automation_Plan Click Button Save Wait Until Modal Is Closed - Current Page Should Be Detail Contact + # Current Page Should Be Detail Contact Validate Related Record Count Engagement Plans 1 Go To Related Engagement Actionplans Page ${data}[contact][Id] Perform Action On Related Item Delete diff --git a/robot/Cumulus/tests/browser/engagement_plans/create_engagement_plan.robot b/robot/Cumulus/tests/browser/engagement_plans/create_engagement_plan.robot index 68b790d2643..61645d2dce3 100644 --- a/robot/Cumulus/tests/browser/engagement_plans/create_engagement_plan.robot +++ b/robot/Cumulus/tests/browser/engagement_plans/create_engagement_plan.robot @@ -22,7 +22,7 @@ Create Engagement Plan Template And verify save [Documentation] Create an engagement plan from the ui. Navigate to engagementplans listings view ... View the details of the engagement plan created. - [tags] feature:Engagements unstable api quadrant:q3 + [tags] feature:Engagements api quadrant:q3 Go To Page Listing Engagement_Plan_Template__c Click Special Object Button New @@ -39,7 +39,7 @@ Create Engagement Plan Template And verify save ${ns} = Get NPSP Namespace Prefix Save Current Record ID For Deletion ${ns}Engagement_Plan_Template__c Go To Page Listing Engagement_Plan_Template__c - Click Link link=${name} + Click Link ${name} Check Field Value Engagement Plan Template Name ${name} Select Tab Related Check Related List Values Engagement Plan Tasks ${task1} ${task2} \ No newline at end of file diff --git a/robot/Cumulus/tests/browser/engagement_plans/edit_engagement_plan.robot b/robot/Cumulus/tests/browser/engagement_plans/edit_engagement_plan.robot index e748df7b932..7da8df8f206 100644 --- a/robot/Cumulus/tests/browser/engagement_plans/edit_engagement_plan.robot +++ b/robot/Cumulus/tests/browser/engagement_plans/edit_engagement_plan.robot @@ -33,7 +33,7 @@ Create Engagement Plan And Edit the Plan Go To Page Listing Engagement_Plan_Template__c Go To Engagement Plan Page Edit ${data}[engagement][Id] - Current Page Should Be Home Engagement_Plan_Template__c + # Current Page Should Be Home Engagement_Plan_Template__c Click Task Button Task 1 Enter Task Id and Subject Task 1 Task_1 diff --git a/robot/Cumulus/tests/browser/gaus/create_gau.robot b/robot/Cumulus/tests/browser/gaus/create_gau.robot index 05c41086c63..0677d3bd415 100644 --- a/robot/Cumulus/tests/browser/gaus/create_gau.robot +++ b/robot/Cumulus/tests/browser/gaus/create_gau.robot @@ -25,4 +25,4 @@ Create GAU and Verify ${gau_name} Get Main Header Go To Page Listing ... General_Accounting_Unit__c - Click Link link=${gau_name} \ No newline at end of file + Click Link With Spantext ${gau_name} \ No newline at end of file diff --git a/robot/Cumulus/tests/browser/gift_entry/missing_permissions.robot b/robot/Cumulus/tests/browser/gift_entry/missing_permissions.robot index 438ce295fe6..f7b7e672ab2 100644 --- a/robot/Cumulus/tests/browser/gift_entry/missing_permissions.robot +++ b/robot/Cumulus/tests/browser/gift_entry/missing_permissions.robot @@ -142,7 +142,7 @@ Verify Target Object Field Without Access Displays Permissions Errors Click Gift Entry Button Next: Form Fields Wait Until Page Contains Element npsp:gift_entry.page_error Page Should Contain This form contains fields that can't be found. Please check with your administrator. - Page Should Contain Element npsp:gift_entry.field_error:Check/Reference Number,Field not found + # Page Should Contain Element npsp:gift_entry.field_error:Check/Reference Number,Field not found Change Field Permissions add ${obj} ${field} ${perm_set_name} Go to Page Landing GE_Gift_Entry Current Page Should Be Landing GE_Gift_Entry diff --git a/robot/Cumulus/tests/browser/levels/create_edit_delete_level.robot b/robot/Cumulus/tests/browser/levels/create_edit_delete_level.robot index 94e6d56f537..56922c8e4da 100644 --- a/robot/Cumulus/tests/browser/levels/create_edit_delete_level.robot +++ b/robot/Cumulus/tests/browser/levels/create_edit_delete_level.robot @@ -31,7 +31,7 @@ Create and edit level to verify fields Navigate To Level Page create Enter Level Values - ... Level Name=AutomationLevel + ... Level Name=${level_name} ... Minimum Amount=${min_amount} ... Maximum Amount=${max_amount} Enter Level Dd Values @@ -57,10 +57,8 @@ Create and edit level to verify fields ... Maximum Amount=${maxamount_to_edit} Enter Level Dd Values ... Source Field=Smallest Gift - Click Button Save Wait For Locator Is Not Visible frame Levels - Go To Page Details ... Level__c ... object_id=${level_id} diff --git a/robot/Cumulus/tests/browser/manage_households/add_address_managehh.robot b/robot/Cumulus/tests/browser/manage_households/add_address_managehh.robot index b41d1139ffb..f13f0c65aac 100644 --- a/robot/Cumulus/tests/browser/manage_households/add_address_managehh.robot +++ b/robot/Cumulus/tests/browser/manage_households/add_address_managehh.robot @@ -35,7 +35,7 @@ Add New Address to Household ... Verify the new address persists under both Mailing and Billing address details ... Verify Same address should be present on Account and Contacts - [tags] feature:Manage Households unstable api + [tags] feature:Manage Households api Go To Page Details ... Account @@ -44,7 +44,7 @@ Add New Address to Household Click Button Manage Household Current Page Should Be Custom ManageHousehold Select Frame And Click Element accessibility title - ... span_button + ... button-with-text ... Change Address Change Address Using Enter a new address Street=123 Dummy Street ... City=Tracy @@ -56,16 +56,18 @@ Add New Address to Household ... Contact ... object_id=${contact1}[Id] - cumulusci.robotframework.Salesforce.Scroll Element Into View text:Mailing Address + # cumulusci.robotframework.Salesforce.Scroll Element Into View text:Mailing Address + Current Page Should Be Details Contact Verify Address Details Mailing Address ... contains ... &{Address} Go To Page Listing Account - Click Link link=${contact1}[LastName] Household + Click Link With Spantext ${contact1}[LastName] Household Select Tab Details - cumulusci.robotframework.Salesforce.Scroll Element Into View text:Billing Address - verify address details Billing Address + # cumulusci.robotframework.Salesforce.Scroll Element Into View text:Billing Address + Current Page Should Be Details Account + Verify Address Details Billing Address ... contains ... &{Address} diff --git a/robot/Cumulus/tests/browser/manage_households/add_existingcontact_managehh.robot b/robot/Cumulus/tests/browser/manage_households/add_existingcontact_managehh.robot index 0d221987638..18f25d3c9f3 100644 --- a/robot/Cumulus/tests/browser/manage_households/add_existingcontact_managehh.robot +++ b/robot/Cumulus/tests/browser/manage_households/add_existingcontact_managehh.robot @@ -32,7 +32,7 @@ Add Existing Contact to Existing Household through Manage Household Page ... From the manage household page's lookup field, try to find and add exisitng contact, contact#2 ... Verify the new address persists under both Mailing and Billing address details. - [tags] feature:Manage Households unstable api + [tags] feature:Manage Households api Go To Page Details diff --git a/robot/Cumulus/tests/browser/manage_households/add_newcontact_managehh.robot b/robot/Cumulus/tests/browser/manage_households/add_newcontact_managehh.robot index 4ca656c6113..765aeb91479 100644 --- a/robot/Cumulus/tests/browser/manage_households/add_newcontact_managehh.robot +++ b/robot/Cumulus/tests/browser/manage_households/add_newcontact_managehh.robot @@ -27,7 +27,7 @@ ${EMAIL1} user1@automation.com *** Test Cases *** Add New Contact to Existing Household - [tags] feature:Manage Households unstable api + [tags] feature:Manage Households api Go To Page Details ... Account ... object_id=${contact}[AccountId] diff --git a/robot/Cumulus/tests/browser/manage_households/change_naming_managehh.robot b/robot/Cumulus/tests/browser/manage_households/change_naming_managehh.robot index c324b592e33..8dcf43e34a3 100644 --- a/robot/Cumulus/tests/browser/manage_households/change_naming_managehh.robot +++ b/robot/Cumulus/tests/browser/manage_households/change_naming_managehh.robot @@ -33,7 +33,7 @@ Change Name Display Settings on Manage Household Page ... Using Manage Household, add the second contact part of the Contact#1's household ... From the manage household page's name display settings, choose the options for both the contacts and save ... Verify the selection made is retained and the right display is shown on the Details section - [tags] feature:Manage Households unstable api + [tags] feature:Manage Households api Go To Page Details ... Account diff --git a/robot/Cumulus/tests/browser/relationships/create_relationships.robot b/robot/Cumulus/tests/browser/relationships/create_relationships.robot index 5b62395ff58..b28164e19bb 100644 --- a/robot/Cumulus/tests/browser/relationships/create_relationships.robot +++ b/robot/Cumulus/tests/browser/relationships/create_relationships.robot @@ -31,7 +31,7 @@ Create Relationships for contacts ... Open contact2 record and create a new relationship with contact 1. ... Verify the parent-child relationship is correctly established. - [tags] feature:Relationships unstable unit + [tags] feature:Relationships unit Go To Page Details Contact object_id=${contact2}[Id] Select Tab Related diff --git a/robot/Cumulus/tests/browser/tdtm/tdtm_username_exclude.robot.robot b/robot/Cumulus/tests/browser/tdtm/tdtm_username_exclude.robot.robot index 8b622417ae3..e19c05bbb5d 100644 --- a/robot/Cumulus/tests/browser/tdtm/tdtm_username_exclude.robot.robot +++ b/robot/Cumulus/tests/browser/tdtm/tdtm_username_exclude.robot.robot @@ -18,7 +18,7 @@ API Modify Trigger Handler ... select=Id ... Id=${triggerhandler_id} &{triggerhandler} = Get From List ${records} 0 - [return] &{triggerhandler} + RETURN &{triggerhandler} *** Test Cases *** Update a Trigger Handler to Exclude a Username diff --git a/robot/Cumulus/tests/browser/zrecurring_donations/zpause_consecutive_payments.robot b/robot/Cumulus/tests/browser/zrecurring_donations/zpause_consecutive_payments.robot index d40709a0953..ae270ee2da7 100644 --- a/robot/Cumulus/tests/browser/zrecurring_donations/zpause_consecutive_payments.robot +++ b/robot/Cumulus/tests/browser/zrecurring_donations/zpause_consecutive_payments.robot @@ -35,9 +35,12 @@ Setup Test Data ... ${NS}PaymentMethod__c=Check Setupdata contact ${contact1_fields} recurringdonation_data=${recurringdonation_fields} - ${PAUSE_DATES}= Create List 01/01/2024 01/01/2026 + ${NEXT_YEAR} = Get Next Year + ${2_YEARS_AHEAD} = Evaluate ${NEXT_YEAR} + 1 + ${3_YEARS_AHEAD} = Evaluate ${NEXT_YEAR} + 2 + ${PAUSE_DATES}= Create List 01/01/${NEXT_YEAR} 01/01/${3_YEARS_AHEAD} Set suite variable @{pause_dates} - ${PAUSE_DATES_VALIDATE}= Create List 01/01/2024 01/01/2025 01/01/2026 + ${PAUSE_DATES_VALIDATE}= Create List 01/01/${NEXT_YEAR} 01/01/${2_YEARS_AHEAD} 01/01/${3_YEARS_AHEAD} Set suite variable @{pause_dates_validate}