From 683528b81c42195f4a1d03790a9ac4fe57809a96 Mon Sep 17 00:00:00 2001 From: Yogesh Mahajan Date: Tue, 12 Jul 2022 11:10:23 +0530 Subject: [PATCH] Fixed feature tests. --- .../pg_datatype_validation_test.py | 114 ++++++----- .../feature_tests/query_tool_journey_test.py | 45 +++-- web/pgadmin/feature_tests/test_data.json | 6 +- .../feature_tests/view_data_dml_queries.py | 185 +++++++++++------- web/regression/feature_utils/pgadmin_page.py | 22 ++- 5 files changed, 225 insertions(+), 147 deletions(-) diff --git a/web/pgadmin/feature_tests/pg_datatype_validation_test.py b/web/pgadmin/feature_tests/pg_datatype_validation_test.py index 5a49f7b91..f039bae75 100644 --- a/web/pgadmin/feature_tests/pg_datatype_validation_test.py +++ b/web/pgadmin/feature_tests/pg_datatype_validation_test.py @@ -81,67 +81,83 @@ class PGDataypeFeatureTest(BaseFeatureTest): connection.close() def _update_preferences(self): - file_menu = self.page.find_by_css_selector( - NavMenuLocators.file_menu_css) - file_menu.click() + retry = 2 + while retry > 0: + try: + file_menu = self.page.find_by_css_selector( + NavMenuLocators.file_menu_css) + file_menu.click() - self.page.retry_click( - (By.CSS_SELECTOR, NavMenuLocators.preference_menu_item_css), - (By.XPATH, NavMenuLocators.specified_preference_tree_node - .format('Browser')) - ) + self.page.retry_click( + (By.CSS_SELECTOR, + NavMenuLocators.preference_menu_item_css), + (By.XPATH, + NavMenuLocators.specified_preference_tree_node + .format('Browser')) + ) - wait = WebDriverWait(self.page.driver, 10) + 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() + 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. - format('Browser', 'Display')), - (By.XPATH, NavMenuLocators.show_system_objects_pref_label_xpath)) + self.page.retry_click( + (By.XPATH, NavMenuLocators. + specified_sub_node_of_pref_tree_node. + format('Browser', 'Display')), + (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)) - ) + # 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() + 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)) - if self.page.find_by_xpath( - NavMenuLocators.specified_pref_node_exp_status. - format(specified_preference_tree_node_name)).\ - get_attribute('aria-expanded') == 'false': - ActionChains(self.driver).double_click(sql_editor).perform() + 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)) + if self.page.find_by_xpath( + NavMenuLocators.specified_pref_node_exp_status. + format(specified_preference_tree_node_name)).\ + get_attribute('aria-expanded') == 'false': + ActionChains(self.driver).\ + double_click(sql_editor).perform() - option_node = \ - self.page.find_by_xpath("//*[@id='treeContainer']" - "//div//span[text()='Editor']") - option_node.click() + option_node = \ + self.page.find_by_xpath("//*[@id='treeContainer']" + "//div//span[text()='Editor']") + option_node.click() - switch_box_element = self.page.find_by_xpath( - NavMenuLocators.insert_bracket_pair_switch_btn) + switch_box_element = self.page.find_by_xpath( + NavMenuLocators.insert_bracket_pair_switch_btn) - switch_box_element.click() + switch_box_element.click() - maximize_button = self.page.find_by_xpath( - NavMenuLocators.maximize_pref_dialogue_css) - maximize_button.click() - time.sleep(0.5) + 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) + # save and close the preference dialog. + self.page.click_modal('Save', react_dialog=True) + break + except Exception: + retry -= 1 def _create_enum_type(self): query = """CREATE TYPE public.rainbow AS ENUM ('red', 'orange', diff --git a/web/pgadmin/feature_tests/query_tool_journey_test.py b/web/pgadmin/feature_tests/query_tool_journey_test.py index 36521a086..2f907bd01 100644 --- a/web/pgadmin/feature_tests/query_tool_journey_test.py +++ b/web/pgadmin/feature_tests/query_tool_journey_test.py @@ -452,32 +452,37 @@ class QueryToolJourneyTest(BaseFeatureTest): # first column is rownum enumerated_should_be_editable = enumerate(cols_should_be_editable, 2) - import time - time.sleep(0.5) for column_index, should_be_editable in enumerated_should_be_editable: is_editable = self._check_cell_editable(column_index) self.assertEqual(is_editable, should_be_editable) def _check_cell_editable(self, cell_index): """Checks if a cell in the first row of the resultset is editable""" - cell_el = self.page.find_by_css_selector( - QueryToolLocators.output_row_col.format(2, cell_index)) - - # Get existing value - cell_value = int(cell_el.text) - new_value = cell_value + 1 - # Try to update value - cell_el.click() - ActionChains(self.driver).double_click(cell_el).perform() - ActionChains(self.driver).send_keys(new_value). \ - send_keys(Keys.ENTER).perform() - time.sleep(0.5) - # Check if the value was updated - # Finding element again to avoid stale element reference exception - cell_el = self.page.\ - find_by_css_selector(QueryToolLocators. - output_row_col.format(2, cell_index)) - return int(cell_el.text) == new_value + retry = 2 + while retry > 0: + try: + cell_el = self.page.find_by_css_selector( + QueryToolLocators.output_row_col.format(2, cell_index)) + # Get existing value + cell_value = int(cell_el.text) + new_value = cell_value + 1 + # Try to update value + ActionChains(self.driver).double_click(cell_el).perform() + ActionChains(self.driver).send_keys(new_value).perform() + ActionChains(self.driver).send_keys(Keys.TAB).perform() + time.sleep(0.5) + # Check if the value was updated + # Finding element again to avoid stale element + # reference exception + cell_el = self.page. \ + find_by_css_selector(QueryToolLocators. + output_row_col.format(2, cell_index)) + return int(cell_el.text) == new_value + except Exception as e: + print('Exception while reading cell value', file=sys.stderr) + retry -= 1 + if retry == 0: + raise Exception(e) def _check_can_add_row(self): return self.page.check_if_element_exist_by_xpath( diff --git a/web/pgadmin/feature_tests/test_data.json b/web/pgadmin/feature_tests/test_data.json index bdbc428e7..0723d772c 100644 --- a/web/pgadmin/feature_tests/test_data.json +++ b/web/pgadmin/feature_tests/test_data.json @@ -1,7 +1,7 @@ { "comment": { "sample_test_case": { - "colno": ["value to set", "value to verfiy", "data type"] + "colno": ["value to set", "value to verify", "data type"] } }, "table_insert_update_cases": { @@ -16,9 +16,9 @@ "8": ["", "[null]", "text"], "9": ["", "[51, 52]", "json"], "10": ["[61,62]", "[61,62]", "json"], - "11": ["", "true", "bool"], + "11": ["true", "true", "bool"], "12": ["", "[null]", "bool"], - "13": ["", "false", "bool"], + "13": ["false", "false", "bool"], "14": ["", "[null]", "text[]"], "15": ["{}", "{}", "text[]"], "16": ["{data,NULL,'',\"\"}", "{data,NULL,'',\"\"}", "text[]"], diff --git a/web/pgadmin/feature_tests/view_data_dml_queries.py b/web/pgadmin/feature_tests/view_data_dml_queries.py index 1c288664d..19ed5bc21 100644 --- a/web/pgadmin/feature_tests/view_data_dml_queries.py +++ b/web/pgadmin/feature_tests/view_data_dml_queries.py @@ -9,6 +9,7 @@ import json import os +import sys import time import traceback @@ -161,9 +162,6 @@ CREATE TABLE public.nonintpkey config_data = config_data_json[config_key] def _perform_test_for_table(self, table_name, config_data_local): - # self.page.click_a_tree_node( - # table_name, - # TreeAreaLocators.sub_nodes_of_tables_node) table_node = self.page.check_if_element_exists_with_scroll( TreeAreaLocators.table_node(table_name)) table_node.click() @@ -220,76 +218,129 @@ CREATE TABLE public.nonintpkey Returns: None """ - self.wait.until(EC.visibility_of_element_located( - (By.XPATH, xpath)), CheckForViewDataTest.TIMEOUT_STRING - ) - cell_el = self.page.find_by_xpath(xpath) - self.page.driver.execute_script("arguments[0].scrollIntoView(false)", - cell_el) - cell_el.click() - ActionChains(self.driver).move_to_element(cell_el).double_click( - cell_el - ).perform() - cell_type = data[2] - value = data[0] + retry = 2 + while retry > 0: + self.wait.until(EC.visibility_of_element_located( + (By.XPATH, xpath)), CheckForViewDataTest.TIMEOUT_STRING + ) + cell_el = self.page.find_by_xpath(xpath) + self.page.driver.execute_script( + "arguments[0].scrollIntoView(false)", cell_el) + ActionChains(self.driver).move_to_element(cell_el).\ + double_click(cell_el).perform() + cell_type = data[2] + value = data[0] - if cell_type in ['int', 'int[]']: + if cell_type in ['int', 'int[]'] and \ + self._update_numeric_cell(cell_el, value): + break + elif cell_type in ['text', 'text[]', 'boolean[]'] and \ + self._update_text_cell(cell_el, value): + break + elif cell_type in ['json', 'jsonb'] and \ + self._update_json_cell(cell_el, value): + retry = 0 + elif cell_type in ['bool'] and \ + self._update_boolean_cell(cell_el, value): + retry = 0 + else: + print('Unable to update cell in try ' + str(retry), + file=sys.stderr) + retry -= 1 + + def _update_numeric_cell(self, cell_el, value): + try: if value == 'clear': cell_el.find_element(By.CSS_SELECTOR, 'input').clear() else: ActionChains(self.driver).send_keys(value). \ - send_keys(Keys.ENTER).perform() - elif cell_type in ['text', 'text[]', 'boolean[]']: - retry = 2 - text_area_ele = None - while retry > 0: - try: - text_area_ele = WebDriverWait(self.driver, 2).until( - EC.visibility_of_element_located( - (By.CSS_SELECTOR, - QueryToolLocators.row_editor_text_area_css))) - retry = 0 - except Exception: - ActionChains(self.driver).move_to_element(cell_el).\ - double_click(cell_el).perform() - retry -= 1 - self.assertIsNotNone(text_area_ele, 'Text editor did not open.') - text_area_ele.clear() - text_area_ele.click() - text_area_ele.send_keys(value) - # Click on editor's Save button - self.page.find_by_css_selector( - QueryToolLocators.text_editor_ok_btn_css).click() - elif cell_type in ['json', 'jsonb']: - platform = 'mac' - if "platform" in self.driver.capabilities: - platform = (self.driver.capabilities["platform"]).lower() - elif "platformName" in self.driver.capabilities: - platform = (self.driver.capabilities["platformName"]).lower() - if 'mac' in platform: - key_to_press = Keys.COMMAND - else: - key_to_press = Keys.CONTROL - actions = ActionChains(self.driver) - # actions.move_to_element(jsoneditor_area_ele).click().perform() - actions.key_down(key_to_press).send_keys('a').key_up(key_to_press)\ - .send_keys(Keys.DELETE).perform() - actions.send_keys(value) .perform() - # Click on editor's Save button - self.page.find_by_css_selector( - QueryToolLocators.text_editor_ok_btn_css).click() + send_keys(Keys.TAB).perform() + return True + except Exception: + print('Exception occurred while updating int cell', + file=sys.stderr) + return False + + def _update_text_cell(self, cell_el, value): + retry = 2 + while retry > 0: + try: + text_area_ele = WebDriverWait(self.driver, 2).until( + EC.visibility_of_element_located( + (By.CSS_SELECTOR, + QueryToolLocators.row_editor_text_area_css))) + text_area_ele.clear() + text_area_ele.click() + text_area_ele.send_keys(value) + # Click on editor's Save button + self.page.find_by_css_selector( + QueryToolLocators.text_editor_ok_btn_css).click() + return True + except Exception: + print('Exception occurred while updating text cell', + file=sys.stderr) + ActionChains(self.driver).move_to_element(cell_el). \ + double_click(cell_el).perform() + retry -= 1 + return False + + def _update_json_cell(self, cell_el, value): + platform = 'mac' + if "platform" in self.driver.capabilities: + platform = (self.driver.capabilities["platform"]).lower() + elif "platformName" in self.driver.capabilities: + platform = (self.driver.capabilities["platformName"]).lower() + if 'mac' in platform: + key_to_press = Keys.COMMAND else: - # Boolean editor test for to True click - checkbox_el = self.page.find_by_css_selector( - QueryToolLocators.row_editor_checkbox_css) - if data[1] == 'true': - checkbox_el.click() - # Boolean editor test for to False click - elif data[1] == 'false': - # Sets true - checkbox_el.click() - # Sets false - ActionChains(self.driver).click(checkbox_el).perform() + key_to_press = Keys.CONTROL + retry = 2 + while retry > 0: + try: + WebDriverWait(self.driver, 2).until( + EC.visibility_of_element_located( + (By.CSS_SELECTOR, + QueryToolLocators.json_editor_text_area_css))) + actions = ActionChains(self.driver) + actions.key_down(key_to_press).send_keys('a').\ + key_up(key_to_press).send_keys(Keys.DELETE).perform() + actions.send_keys(value).perform() + # Click on editor's Save button + self.page.find_by_css_selector( + QueryToolLocators.text_editor_ok_btn_css).click() + return True + except Exception: + print('Exception occurred while updating json cell', + file=sys.stderr) + ActionChains(self.driver).move_to_element(cell_el). \ + double_click(cell_el).perform() + retry -= 1 + return False + + def _update_boolean_cell(self, cell_el, value): + # Boolean editor test for to True click + retry = 2 + while retry > 0: + try: + checkbox_el = self.page.find_by_css_selector( + QueryToolLocators.row_editor_checkbox_css) + if value == 'true': + checkbox_el.click() + # Boolean editor test for to False click + elif value == 'false': + # Sets true + checkbox_el.click() + # Sets false + ActionChains(self.driver).click(checkbox_el).perform() + ActionChains(self.driver).send_keys(Keys.TAB).perform() + return True + except Exception: + print('Exception occurred while updating boolean cell', + file=sys.stderr) + ActionChains(self.driver).move_to_element(cell_el). \ + double_click(cell_el).perform() + retry -= 1 + return False def _view_data_grid(self, table_name): self.page.driver.find_element(By.LINK_TEXT, "Object").click() diff --git a/web/regression/feature_utils/pgadmin_page.py b/web/regression/feature_utils/pgadmin_page.py index 8a0e15955..11c9a49cf 100644 --- a/web/regression/feature_utils/pgadmin_page.py +++ b/web/regression/feature_utils/pgadmin_page.py @@ -354,14 +354,18 @@ class PgadminPage: """ retry = 2 while retry > 0: - webdriver.ActionChains(self.driver).double_click( - tree_node_web_element).perform() - if self.check_if_element_exist_by_xpath(tree_node_exp_check_xpath): - return True - elif retry == 1: - return False - else: - time.sleep(1) + try: + webdriver.ActionChains(self.driver).double_click( + tree_node_web_element).perform() + if self.check_if_element_exist_by_xpath( + tree_node_exp_check_xpath): + return True + elif retry == 1: + return False + else: + time.sleep(1) + retry -= 1 + except Exception: retry -= 1 def expand_server_group_node(self, server_group_name): @@ -418,6 +422,8 @@ class PgadminPage: self.js_executor_scrollintoview_arg, server_node) if self.check_if_element_exist_by_xpath( server_node_exp_status_xpath, 2): + # sleep for a while to expand tree completely + time.sleep(0.4) server_expanded = True else: server_expanded = self.click_expand_server_node(