diff --git a/web/pgadmin/feature_tests/browser_tool_bar_test.py b/web/pgadmin/feature_tests/browser_tool_bar_test.py index 28fcb4068..a05278a1b 100644 --- a/web/pgadmin/feature_tests/browser_tool_bar_test.py +++ b/web/pgadmin/feature_tests/browser_tool_bar_test.py @@ -14,6 +14,7 @@ import random from regression.python_test_utils import test_utils from regression.feature_utils.locators import BrowserToolBarLocators from regression.feature_utils.base_feature_test import BaseFeatureTest +from regression.feature_utils.tree_area_locators import TreeAreaLocators from selenium.webdriver.common.by import By @@ -69,14 +70,18 @@ class BrowserToolBarFeatureTest(BaseFeatureTest): (By.CSS_SELECTOR, BrowserToolBarLocators.query_tool_panel_css)) def test_view_data_tool_button(self): - self.page.select_tree_item(self.test_db) + self.page.click_a_tree_node( + self.test_db, + TreeAreaLocators.sub_nodes_of_databases_node(self.server['name'])) self.page.toggle_open_schema_node( self.server['name'], self.server['db_password'], self.test_db, 'public') self.page.toggle_open_tables_node( self.server['name'], self.server['db_password'], self.test_db, 'public') - self.page.select_tree_item(self.test_table_name) + self.page.click_a_tree_node( + self.test_table_name, + TreeAreaLocators.sub_nodes_of_tables_node) self.page.retry_click( (By.CSS_SELECTOR, diff --git a/web/pgadmin/feature_tests/pg_datatype_validation_test.py b/web/pgadmin/feature_tests/pg_datatype_validation_test.py index eb93be7cf..c4d368df1 100644 --- a/web/pgadmin/feature_tests/pg_datatype_validation_test.py +++ b/web/pgadmin/feature_tests/pg_datatype_validation_test.py @@ -21,6 +21,7 @@ from regression.python_test_utils import test_utils from regression.feature_utils.base_feature_test import BaseFeatureTest from regression.feature_utils.locators import NavMenuLocators, \ QueryToolLocators +from regression.feature_utils.tree_area_locators import TreeAreaLocators CURRENT_PATH = os.path.dirname(os.path.realpath(__file__)) @@ -156,7 +157,9 @@ class PGDataypeFeatureTest(BaseFeatureTest): def _check_datatype(self): # Slick grid does not render all the column if viewport is not enough # wide. So execute test as batch of queries. - self.page.select_tree_item(self.test_db) + self.page.click_a_tree_node( + self.test_db, + TreeAreaLocators.sub_nodes_of_databases_node(self.server['name'])) self.page.open_query_tool() self._create_enum_type() for batch in config_data: 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 8659dd0e0..cc2e89b59 100644 --- a/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py +++ b/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py @@ -55,14 +55,12 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest): self.server['sslmode'] ) test_utils.drop_database(connection, self.database_name) - test_utils.create_database(self.server, self.database_name) + test_gui_helper.close_bgprocess_popup(self) self.page.add_server(self.server) self.wait = WebDriverWait(self.page.driver, 20) - test_gui_helper.close_bgprocess_popup(self) - def runTest(self): self.page.expand_database_node( self.server['name'], diff --git a/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py b/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py index b50c2b6fa..728323b49 100644 --- a/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py +++ b/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py @@ -18,6 +18,7 @@ from regression.feature_utils.base_feature_test import BaseFeatureTest from regression.python_test_utils import test_utils from regression.python_test_utils import test_gui_helper from regression.feature_utils.locators import NavMenuLocators +from regression.feature_utils.tree_area_locators import TreeAreaLocators class PGUtilitiesMaintenanceFeatureTest(BaseFeatureTest): @@ -71,9 +72,9 @@ class PGUtilitiesMaintenanceFeatureTest(BaseFeatureTest): test_utils.create_database(self.server, self.database_name) test_utils.create_table(self.server, self.database_name, self.table_name) + test_gui_helper.close_bgprocess_popup(self) self.page.add_server(self.server) self.wait = WebDriverWait(self.page.driver, 20) - test_gui_helper.close_bgprocess_popup(self) def runTest(self): self._open_maintenance_dialogue() @@ -100,7 +101,9 @@ class PGUtilitiesMaintenanceFeatureTest(BaseFeatureTest): self.page.toggle_open_tables_node(self.server['name'], self.server['db_password'], self.database_name, 'public') - self.page.select_tree_item(self.table_name) + self.page.click_a_tree_node( + self.table_name, + TreeAreaLocators.sub_nodes_of_tables_node) self.page.retry_click( (By.LINK_TEXT, diff --git a/web/pgadmin/feature_tests/query_tool_tests.py b/web/pgadmin/feature_tests/query_tool_tests.py index 413811dc2..3bcc5e8e4 100644 --- a/web/pgadmin/feature_tests/query_tool_tests.py +++ b/web/pgadmin/feature_tests/query_tool_tests.py @@ -207,7 +207,6 @@ SELECT generate_series(1, {}) as id1, 'dummy' as id2""".format( ElementClickInterceptedException): count += 1 pass - print(count) self._check_ondemand_result(row_id_to_find) print("OK.", file=sys.stderr) @@ -244,6 +243,7 @@ SELECT generate_series(1, {}) as id1, 'dummy' as id2""".format( def _check_ondemand_result(self, row_id_to_find): # scroll to bottom to bring last row of next chunk in viewport. scroll = 10 + status = False while scroll: canvas_ele = self.page.find_by_css_selector('.grid-canvas') scrolling_height = canvas_ele.size['height'] @@ -255,14 +255,18 @@ SELECT generate_series(1, {}) as id1, 'dummy' as id2""".format( # Table height takes some time to update, for which their is no # particular way time.sleep(2) - if canvas_ele.size['height'] == scrolling_height: + if canvas_ele.size['height'] == scrolling_height and \ + self.page.check_if_element_exist_by_xpath( + QueryToolLocators.output_column_data_xpath.format( + row_id_to_find)): + status = True break else: scroll -= 1 - self.assertTrue(self.page.check_if_element_exist_by_xpath( - QueryToolLocators.output_column_data_xpath.format(row_id_to_find) - )) + self.assertTrue( + status, "Element is not loaded to the rows id: " + "{}".format(row_id_to_find)) def _query_tool_explain_with_verbose_and_cost(self): query = """-- Explain query with verbose and cost @@ -372,11 +376,7 @@ CREATE TABLE public.{}();""".format(table_name) -- 3. ROLLBACK transaction. -- 4. Check if table is *NOT* created. ROLLBACK;""" - self.page.fill_codemirror_area_with(query) - self.page.find_by_css_selector( - QueryToolLocators.btn_execute_query_css).click() - - self.page.wait_for_query_tool_loading_indicator_to_disappear() + self.page.execute_query(query) self.page.click_tab('Messages') self.assertTrue(self.page.check_if_element_exist_by_xpath( QueryToolLocators.sql_editor_message.format('ROLLBACK')), @@ -389,11 +389,8 @@ ROLLBACK;""" -- 4. Check if table is *NOT* created. SELECT relname FROM pg_class WHERE relkind IN ('r','s','t') and relnamespace = 2200::oid;""" - self.page.fill_codemirror_area_with(query) - self.page.find_by_css_selector( - QueryToolLocators.btn_execute_query_css).click() - self.page.wait_for_query_tool_loading_indicator_to_disappear() + self.page.execute_query(query) self.page.click_tab('Data Output') canvas = self.wait.until(EC.presence_of_element_located( (By.CSS_SELECTOR, QueryToolLocators.query_output_canvas_css))) @@ -411,11 +408,7 @@ SELECT relname FROM pg_class -- 3. ROLLBACK transaction. -- 4. Check if table is *NOT* created. ROLLBACK;""" - self.page.fill_codemirror_area_with(query) - self.page.find_by_css_selector( - QueryToolLocators.btn_execute_query_css).click() - - self.page.wait_for_query_tool_loading_indicator_to_disappear() + self.page.execute_query(query) def _query_tool_auto_commit_enabled(self): query = """-- 1. Enable auto commit. @@ -481,10 +474,8 @@ ROLLBACK;""" -- 5. Check if table is created event after ROLLBACK. SELECT relname FROM pg_class WHERE relkind IN ('r','s','t') and relnamespace = 2200::oid;""" - self.page.fill_codemirror_area_with(query) - self.page.find_by_css_selector( - QueryToolLocators.btn_execute_query_css).click() + self.page.execute_query(query) self.page.click_tab('Data Output') self.page.wait_for_query_tool_loading_indicator_to_disappear() diff --git a/web/pgadmin/feature_tests/table_ddl_feature_test.py b/web/pgadmin/feature_tests/table_ddl_feature_test.py index 26f231ef9..7430ca95c 100644 --- a/web/pgadmin/feature_tests/table_ddl_feature_test.py +++ b/web/pgadmin/feature_tests/table_ddl_feature_test.py @@ -12,6 +12,7 @@ import random 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 class TableDdlFeatureTest(BaseFeatureTest): @@ -38,7 +39,9 @@ class TableDdlFeatureTest(BaseFeatureTest): self.page.toggle_open_tables_node( self.server['name'], self.server['db_password'], self.test_db, 'public') - self.page.select_tree_item(self.test_table_name) + self.page.click_a_tree_node( + self.test_table_name, + TreeAreaLocators.sub_nodes_of_tables_node) self.page.click_tab("SQL") # Wait till data is displayed in SQL Tab diff --git a/web/pgadmin/feature_tests/view_data_dml_queries.py b/web/pgadmin/feature_tests/view_data_dml_queries.py index 6ea8d506c..02a449971 100644 --- a/web/pgadmin/feature_tests/view_data_dml_queries.py +++ b/web/pgadmin/feature_tests/view_data_dml_queries.py @@ -21,6 +21,7 @@ from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait from regression.feature_utils.locators import QueryToolLocators, \ NavMenuLocators +from regression.feature_utils.tree_area_locators import TreeAreaLocators CURRENT_PATH = os.path.dirname(os.path.realpath(__file__)) @@ -167,7 +168,9 @@ CREATE TABLE public.nonintpkey config_data = config_data_json[config_key] def _perform_test_for_table(self, table_name): - self.page.select_tree_item(table_name) + self.page.click_a_tree_node( + table_name, + TreeAreaLocators.sub_nodes_of_tables_node) # Open Object -> View/Edit data self._view_data_grid(table_name) @@ -354,7 +357,11 @@ CREATE TABLE public.nonintpkey # scroll browser back to the left # to reset position so other assertions can succeed - for idx in reversed(list(config_check_data.keys())): + list_item = list(config_check_data.keys()) + for item in range(0, len(list_item)): + list_item[item] = int(list_item[item]) + list_item.sort(reverse=True) + for idx in list_item: time.sleep(0.4) element = result_row.find_element_by_class_name("r" + str(idx)) self.page.driver.execute_script( diff --git a/web/pgadmin/feature_tests/xss_checks_panels_and_query_tool_test.py b/web/pgadmin/feature_tests/xss_checks_panels_and_query_tool_test.py index aed1f36f1..15aad7be9 100644 --- a/web/pgadmin/feature_tests/xss_checks_panels_and_query_tool_test.py +++ b/web/pgadmin/feature_tests/xss_checks_panels_and_query_tool_test.py @@ -16,6 +16,7 @@ from regression.feature_utils.base_feature_test import BaseFeatureTest from selenium.webdriver import ActionChains from selenium.common.exceptions import StaleElementReferenceException from regression.feature_utils.locators import QueryToolLocators +from regression.feature_utils.tree_area_locators import TreeAreaLocators class CheckForXssFeatureTest(BaseFeatureTest): @@ -100,7 +101,9 @@ class CheckForXssFeatureTest(BaseFeatureTest): self.page.toggle_open_tables_node(self.server['name'], self.server['db_password'], self.test_db, 'public') - self.page.select_tree_item(self.test_table_name) + self.page.click_a_tree_node( + self.test_table_name, + TreeAreaLocators.sub_nodes_of_tables_node) def _check_xss_in_browser_tree(self): print( diff --git a/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py b/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py index b42d3f12d..6af1af82e 100644 --- a/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py +++ b/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py @@ -14,6 +14,7 @@ from selenium.webdriver import ActionChains from selenium.common.exceptions import TimeoutException from regression.python_test_utils import test_utils from regression.feature_utils.base_feature_test import BaseFeatureTest +from regression.feature_utils.tree_area_locators import TreeAreaLocators from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By @@ -65,7 +66,9 @@ class CheckDebuggerForXssFeatureTest(BaseFeatureTest): self.server['db_password'], self.test_db, 'public') self.page.toggle_open_function_node() - self.page.select_tree_item(self.function_name + "()") + self.page.click_a_tree_node( + self.function_name + "()", + TreeAreaLocators.sub_nodes_of_functions_node) def _debug_function(self): 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 ac1e25fcd..a1735b152 100644 --- a/web/regression/feature_utils/pgadmin_page.py +++ b/web/regression/feature_utils/pgadmin_page.py @@ -245,6 +245,36 @@ class PgadminPage: if attempts == 0: raise Exception(e) + def click_a_tree_node(self, element_name, list_of_element): + """It will click a tree node eg. server, schema, table name etc + will take server name and list of element where this node lies""" + operation_status = False + elements = list_of_element = self.find_by_xpath_list( + list_of_element) + if len(elements) > 0: + index_of_element = self.get_index_of_element( + elements, element_name) + if index_of_element >= 0: + self.driver.execute_script( + "arguments[0].scrollIntoView()", + list_of_element[index_of_element]) + self.wait_for_elements_to_appear( + self.driver, list_of_element[index_of_element]) + time.sleep(1) + self.driver.execute_script( + "arguments[0].click()", + list_of_element[index_of_element]) + operation_status = True + else: + print("{ERROR} - The required element with name: " + str( + element_name) + + " is not found in function click_a_tree_node, " + "so click operation is not performed") + else: + print("{ERROR} - The element list passed to function " + "click_a_tree_node seems empty") + return operation_status + def toggle_open_servers_group(self): """This will open Servers group to display underlying nodes""" is_expanded = False diff --git a/web/regression/feature_utils/tree_area_locators.py b/web/regression/feature_utils/tree_area_locators.py index 0b98e7547..3c4e8e5d4 100644 --- a/web/regression/feature_utils/tree_area_locators.py +++ b/web/regression/feature_utils/tree_area_locators.py @@ -48,6 +48,11 @@ class TreeAreaLocators(): "contains(text(),'Tables')]]]]]]]]]]/" \ "following-sibling::ul/li/div//div/span[2]/span[2]" + sub_nodes_of_functions_node = \ + "//div[div[div[div[div[div[div[div[span[span[" \ + "contains(text(),'Functions')]]]]]]]]]]/" \ + "following-sibling::ul/li/div//div/span[2]/span[2]" + @staticmethod def sub_nodes_of_a_server_node(server_name): xpath = "//div[div[div[span[span[contains(text(),'%s')]]]]]/" \ diff --git a/web/regression/python_test_utils/test_gui_helper.py b/web/regression/python_test_utils/test_gui_helper.py index 7515ee158..aaa9707b7 100644 --- a/web/regression/python_test_utils/test_gui_helper.py +++ b/web/regression/python_test_utils/test_gui_helper.py @@ -45,7 +45,7 @@ def close_bgprocess_popup(tester): def close_process_watcher(tester): - attempt = 5 + attempt = 10 while attempt > 0: close_btn = tester.page.find_by_xpath( NavMenuLocators.process_watcher_close_button_xpath) diff --git a/web/regression/python_test_utils/test_utils.py b/web/regression/python_test_utils/test_utils.py index 2e8a0eb8c..56d5cb0f9 100644 --- a/web/regression/python_test_utils/test_utils.py +++ b/web/regression/python_test_utils/test_utils.py @@ -820,6 +820,7 @@ def reset_layout_db(user_id=None): '("Browser/Layout", "SQLEditor/Layout", "Debugger/Layout")' ' AND USER_ID=?', user_id ) + cur.execute('DELETE FROM process') conn.commit() conn.close() break