Hi Hackers, Please find the attached for some feature test cases fixes.
1. pg_datatype_validation_test.py 2. pg_utilities_backup_restore_test.py 3. test_copy_sql_to_query_tool.py 4. browser_tool_bar_test.py 5. keyboard_shortcut_test.py -- Thanks & Regards, Pradip Parkale Software Engineer | EnterpriseDB Corporation
diff --git a/web/pgadmin/feature_tests/browser_tool_bar_test.py b/web/pgadmin/feature_tests/browser_tool_bar_test.py index 0ce749b65..a068e0160 100644 --- a/web/pgadmin/feature_tests/browser_tool_bar_test.py +++ b/web/pgadmin/feature_tests/browser_tool_bar_test.py @@ -90,7 +90,7 @@ class BrowserToolBarFeatureTest(BaseFeatureTest): self.assertTrue(self.page.retry_click( (By.CSS_SELECTOR, BrowserToolBarLocators.filter_data_button_css), - (By.CSS_SELECTOR, BrowserToolBarLocators.filter_alertify_box_css)), + (By.XPATH, BrowserToolBarLocators.filter_alertify_box_css)), 'Filter dialogue did not open on clicking filter button.') self.page.click_modal('Close', True) self.page.close_query_tool(prompt=False) diff --git a/web/pgadmin/feature_tests/keyboard_shortcut_test.py b/web/pgadmin/feature_tests/keyboard_shortcut_test.py index 397fd4cd7..38834fda2 100644 --- a/web/pgadmin/feature_tests/keyboard_shortcut_test.py +++ b/web/pgadmin/feature_tests/keyboard_shortcut_test.py @@ -93,12 +93,8 @@ class KeyboardShortcutFeatureTest(BaseFeatureTest): NavMenuLocators.preference_menu_item_css) pref_menu_item.click() - browser_node = self.page.find_by_xpath( + self.page.find_by_xpath( NavMenuLocators.specified_preference_tree_node.format('Browser')) - if self.page.find_by_xpath( - NavMenuLocators.specified_pref_node_exp_status. - format('Browser')).get_attribute('aria-expanded') == 'false': - ActionChains(self.driver).double_click(browser_node).perform() display_node = self.page.find_by_xpath( NavMenuLocators.specified_sub_node_of_pref_tree_node.format( @@ -116,7 +112,7 @@ class KeyboardShortcutFeatureTest(BaseFeatureTest): else: attempt -= 1 - maximize_button = self.page.find_by_css_selector( + maximize_button = self.page.find_by_xpath( NavMenuLocators.maximize_pref_dialogue_css) maximize_button.click() @@ -128,18 +124,17 @@ class KeyboardShortcutFeatureTest(BaseFeatureTest): for s in self.new_shortcuts: key = self.new_shortcuts[s]['shortcut'][2] locator = self.new_shortcuts[s]['locator'] - file_menu = self.page.find_by_xpath( - "//div[contains(@class,'pgadmin-control-group') " - "and contains(.,'" + locator + "')]" - ) + file_menu = \ + self.page.find_by_xpath("//div[label[text()='{}']]" + "/following-sibling::div//div/" + "input".format(locator)) - field = file_menu.find_element(By.NAME, 'key') - field.click() - field.send_keys(key) + file_menu.click() + file_menu.send_keys(key) - # save and close the preference dialog. - self.page.click_modal('Save') + maximize_button = self.page.find_by_xpath( + NavMenuLocators.maximize_pref_dialogue_css) + maximize_button.click() - self.page.wait_for_element_to_disappear( - lambda driver: driver.find_element(By.CSS_SELECTOR, ".ajs-modal") - ) + # save and close the preference dialog. + self.page.click_modal('Save', True) diff --git a/web/pgadmin/feature_tests/pg_datatype_validation_test.py b/web/pgadmin/feature_tests/pg_datatype_validation_test.py index ce1d498a4..9b91cdf21 100644 --- a/web/pgadmin/feature_tests/pg_datatype_validation_test.py +++ b/web/pgadmin/feature_tests/pg_datatype_validation_test.py @@ -111,7 +111,7 @@ class PGDataypeFeatureTest(BaseFeatureTest): (By.XPATH, NavMenuLocators.show_system_objects_pref_label_xpath)) ) - maximize_button = self.page.find_by_css_selector( + maximize_button = self.page.find_by_xpath( NavMenuLocators.maximize_pref_dialogue_css) maximize_button.click() @@ -125,30 +125,32 @@ class PGDataypeFeatureTest(BaseFeatureTest): get_attribute('aria-expanded') == 'false': ActionChains(self.driver).double_click(sql_editor).perform() - option_node = self.page.find_by_xpath( - NavMenuLocators.specified_sub_node_of_pref_tree_node.format( - specified_preference_tree_node_name, 'Editor')) + option_node = \ + self.page.find_by_xpath("//*[@id='treeContainer']" + "//div//span[text()='Editor']") option_node.click() - self.page.set_switch_box_status( - NavMenuLocators.insert_bracket_pair_switch_btn, 'No') + switch_box_element = self.page.find_by_xpath( + NavMenuLocators.insert_bracket_pair_switch_btn) - # save and close the preference dialog. - self.page.click_modal('Save') + switch_box_element.click() - self.page.wait_for_element_to_disappear( - lambda driver: driver.find_element(By.CSS_SELECTOR, ".ajs-modal") - ) + maximize_button = self.page.find_by_xpath( + NavMenuLocators.maximize_pref_dialogue_css) + maximize_button.click() time.sleep(0.5) + # save and close the preference dialog. + self.page.click_modal('Save', react_dialog=True) + def _create_enum_type(self): query = """CREATE TYPE public.rainbow AS ENUM ('red', 'orange', 'yellow','green','blue','purple'); """ self.page.fill_codemirror_area_with(query) - execute_query = self.page.find_by_css_selector( - QueryToolLocators.btn_execute_query_css) - execute_query.click() + time.sleep(0.5) + self.page.find_by_css_selector( + QueryToolLocators.btn_execute_query_css).click() self.page.clear_query_tool() def runTest(self): @@ -160,7 +162,7 @@ class PGDataypeFeatureTest(BaseFeatureTest): # Check data types self._check_datatype() - self.page.close_query_tool() + self.page.close_query_tool(False) def after(self): self.page.remove_server(self.server) @@ -184,13 +186,13 @@ class PGDataypeFeatureTest(BaseFeatureTest): # wait for the visibility of the grid to appear wait.until(EC.visibility_of_element_located( (By.XPATH, - "//*[contains(@class,'column-type')]" + "//*[contains(@class,'makeStyles-columnName')]" ) )) wait.until(EC.visibility_of_element_located( (By.XPATH, - "//*[contains(@class,'column-type') and " - "contains(.,'{}')]".format(batch['datatype'][0]) + "//*[contains(@class,'makeStyles-columnName') " + "and //span[text()='{}']]".format(batch['datatype'][0]) ) )) diff --git a/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py b/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py index 5810f68df..474645940 100644 --- a/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py +++ b/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py @@ -216,8 +216,8 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest): take_bckup.click() if self.page.wait_for_element_to_disappear( lambda driver: driver.find_element( - By.NAME, - NavMenuLocators.backup_filename_txt_box_name)): + By.XPATH, + "//*[@id='0']/div[contains(text(),'Backup')]")): click = False except Exception: retry -= 1 @@ -282,7 +282,7 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest): (By.XPATH, NavMenuLocators.show_system_objects_pref_label_xpath)) ) - maximize_button = self.page.find_by_css_selector( + maximize_button = self.page.find_by_xpath( NavMenuLocators.maximize_pref_dialogue_css) maximize_button.click() @@ -309,27 +309,44 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest): return None server_version = get_server_version_string() server_types = default_binary_path.keys() + path_already_set = True for serv in server_types: if serv == 'pg' and server_version is not None: - path_input = self.page.find_by_xpath( - "//td[span[text()='PostgreSQL {0}']]" - "/following-sibling::td//input".format(server_version)) - self.page.clear_edit_box(path_input) - path_input.click() - path_input.send_keys(default_binary_path['pg']) + path_input = \ + self.page.find_by_xpath( + "//div[span[text()='PostgreSQL {}']]" + "/following-sibling::div//div/input".format( + server_version)) + exiting_path = path_input.get_property("value") + if exiting_path != default_binary_path['pg']: + path_already_set = False + self.page.clear_edit_box(path_input) + path_input.click() + path_input.send_keys(default_binary_path['pg']) elif serv == 'ppas' and server_version is not None: - path_input = self.page.find_by_xpath( - "//td[span[text()='EDB Advanced Server {0}']]" - "/following-sibling::td//input".format(server_version)) - self.page.clear_edit_box(path_input) - path_input.click() - path_input.send_keys(default_binary_path['ppas']) + + if exiting_path != default_binary_path['pg']: + path_already_set = False + path_input = self.page.find_by_xpath( + "//div[span[text()='EDB Advanced Server {}']]" + "/following-sibling::div//div/input".format( + server_version)) + self.page.clear_edit_box(path_input) + path_input.click() + path_input.send_keys(default_binary_path['ppas']) else: print('Binary path Key is Incorrect or ' 'server version is None.') + maximize_button = self.page.find_by_xpath( + NavMenuLocators.maximize_pref_dialogue_css) + maximize_button.click() + # save and close the preference dialog. - self.page.click_modal('Save') + if path_already_set: + self.page.click_modal('Cancel', True) + else: + self.page.click_modal('Save', True) self.page.wait_for_element_to_disappear( lambda driver: driver.find_element(By.CSS_SELECTOR, ".ajs-modal") diff --git a/web/pgadmin/feature_tests/test_copy_sql_to_query_tool.py b/web/pgadmin/feature_tests/test_copy_sql_to_query_tool.py index 98a1b5b84..83bf0e93f 100644 --- a/web/pgadmin/feature_tests/test_copy_sql_to_query_tool.py +++ b/web/pgadmin/feature_tests/test_copy_sql_to_query_tool.py @@ -9,7 +9,6 @@ import random import time - from regression.feature_utils.base_feature_test import BaseFeatureTest from regression.python_test_utils import test_utils from regression.feature_utils.tree_area_locators import TreeAreaLocators @@ -109,28 +108,28 @@ class CopySQLFeatureTest(BaseFeatureTest): wait = WebDriverWait(self.page.driver, 10) - browser_node = self.page.find_by_xpath( - NavMenuLocators.specified_preference_tree_node.format('Browser')) - if self.page.find_by_xpath( - NavMenuLocators.specified_pref_node_exp_status. - format('Browser')).get_attribute('aria-expanded') == 'false': - ActionChains(self.driver).double_click(browser_node).perform() - self.page.retry_click( - (By.XPATH, NavMenuLocators.specified_sub_node_of_pref_tree_node. + (By.XPATH, + NavMenuLocators.specified_sub_node_of_pref_tree_node. format('Browser', 'Display')), - (By.XPATH, NavMenuLocators.show_system_objects_pref_label_xpath)) + (By.XPATH, + NavMenuLocators.show_system_objects_pref_label_xpath)) # Wait till the preference dialogue box is displayed by checking the # visibility of Show System Object label wait.until(EC.presence_of_element_located( (By.XPATH, NavMenuLocators.show_system_objects_pref_label_xpath)) ) + maximize_button = self.page.find_by_xpath( + NavMenuLocators.maximize_pref_dialogue_css) + maximize_button.click() specified_preference_tree_node_name = 'Query Tool' sql_editor = self.page.find_by_xpath( NavMenuLocators.specified_preference_tree_node.format( specified_preference_tree_node_name)) + print(sql_editor) + sql_editor.click() if self.page.find_by_xpath( NavMenuLocators.specified_pref_node_exp_status. format(specified_preference_tree_node_name)).get_attribute( @@ -138,12 +137,23 @@ class CopySQLFeatureTest(BaseFeatureTest): ActionChains(self.driver).double_click(sql_editor).perform() option_node = self.page.find_by_xpath( - NavMenuLocators.specified_sub_node_of_pref_tree_node.format( - specified_preference_tree_node_name, 'Options')) + "//*[@id='treeContainer']//div//span[text()=" + "'Results grid']//preceding::span[text()='Options']") + print(option_node) + # self.page.check_if_element_exists_with_scroll(option_node) + self.page.driver.execute_script("arguments[0].scrollIntoView(false)", + option_node) option_node.click() - self.page.set_switch_box_status( - NavMenuLocators.copy_sql_to_query_tool_switch_btn, 'Yes') + switch_box_element = \ + self.page.find_by_xpath(NavMenuLocators. + copy_sql_to_query_tool_switch_btn) + + switch_box_element.click() + + maximize_button = self.page.find_by_xpath( + NavMenuLocators.maximize_pref_dialogue_css) + maximize_button.click() # save and close the preference dialog. - self.page.click_modal('Save') + self.page.click_modal('Save', react_dialog=True) diff --git a/web/regression/feature_utils/locators.py b/web/regression/feature_utils/locators.py index b5f7dba7c..db0c0ae4f 100644 --- a/web/regression/feature_utils/locators.py +++ b/web/regression/feature_utils/locators.py @@ -24,7 +24,8 @@ class BrowserToolBarLocators(): filter_data_button_css = \ ".wcFrameButton[title='Filtered Rows']:not(.disabled)" - filter_alertify_box_css = ".wcPanelTab.wcPanelTabActive.wcNotMoveable" + filter_alertify_box_css = "//*[@id='0']/div[contains(text()," \ + "'Data Filter')]" class NavMenuLocators: @@ -51,34 +52,30 @@ class NavMenuLocators: show_system_objects_pref_label_xpath = \ "//label[contains(text(), 'Show system objects?')]" - maximize_pref_dialogue_css = ".ajs-dialog.pg-el-container .ajs-maximize" + maximize_pref_dialogue_css = "//div[text()='Preferences']" \ + "//following::div//span[1]" specified_pref_node_exp_status = \ - "//div[div[span[span[(@class='aciTreeText')and " \ - "(text()='{0} ' or text()='{0}')]]]]" + "//*[@id='treeContainer']//div//span[text()='{0}']" specified_preference_tree_node = \ - "//div//span[(@class='aciTreeText')and " \ - "(text()='{0} ' or text()='{0}')]" + "//*[@id='treeContainer']//div//span[text()='{0}']" \ specified_sub_node_of_pref_tree_node = \ - "//span[text()='{0}']//following::span[text()='{1}']" - + "//*[@id='treeContainer']//div//span[text()='{1}']" insert_bracket_pair_switch_btn = \ - "//div[span[normalize-space(text())='Insert bracket pairs?']]" \ - "//div[contains(@class,'toggle btn')]" + "//label[text()='Insert bracket pairs?']//following::div[1]//span" copy_sql_to_query_tool_switch_btn = \ - "//div[span[normalize-space(text())=" \ - "'Copy SQL from main window to query tool?']]" \ - "//div[contains(@class,'toggle btn')]" + "//label[text()='Copy SQL from main window to query tool?']" \ + "//following::div[1]//span" backup_filename_txt_box_name = "file" restore_file_name_txt_box_name = "file" backup_btn_xpath = \ - "//button[ contains(.,'Backup')]" + "//button/span[text()='Backup']" bcg_process_status_alertifier_css = \ ".ajs-message.ajs-bg-bgprocess.ajs-visible" diff --git a/web/regression/feature_utils/pgadmin_page.py b/web/regression/feature_utils/pgadmin_page.py index d9d53c446..c1d1b3064 100644 --- a/web/regression/feature_utils/pgadmin_page.py +++ b/web/regression/feature_utils/pgadmin_page.py @@ -87,9 +87,8 @@ class PgadminPage: # In case of react dialog we use different xpath if react_dialog: - modal_button = self.find_by_css_selector( - ".react-draggable button[data-label='{0}']" - .format(button_text)) + modal_button = self.find_by_xpath( + "//span[text()='{}']".format(button_text)) else: modal_button = self.find_by_xpath( "//div[contains(@class, 'alertify') and "