public inbox for [email protected]help / color / mirror / Atom feed
Feature Test Fix - React porting 12+ messages / 2 participants [nested] [flat]
* Feature Test Fix - React porting @ 2021-11-09 09:17 Yogesh Mahajan <[email protected]> 0 siblings, 1 reply; 12+ messages in thread From: Yogesh Mahajan @ 2021-11-09 09:17 UTC (permalink / raw) To: pgadmin-hackers Hi, Please find the attached patch which fixes feature tests broken due to react porting changes. Thanks, Yogesh Mahajan EnterpriseDB Attachments: [application/octet-stream] Feature_Test_Fix_React_Porting_v1.patch (107.0K, 3-Feature_Test_Fix_React_Porting_v1.patch) download | inline diff: diff --git a/web/pgadmin/feature_tests/browser_tool_bar_test.py b/web/pgadmin/feature_tests/browser_tool_bar_test.py index a4544daf1..88ad7b889 100644 --- a/web/pgadmin/feature_tests/browser_tool_bar_test.py +++ b/web/pgadmin/feature_tests/browser_tool_bar_test.py @@ -47,7 +47,7 @@ class BrowserToolBarFeatureTest(BaseFeatureTest): file=sys.stderr, end="") self.test_view_data_tool_button() print("OK.", file=sys.stderr) - # + # Check for filtered rows button print("\nFiltered Rows ToolBar Button ", file=sys.stderr, end="") @@ -60,28 +60,24 @@ class BrowserToolBarFeatureTest(BaseFeatureTest): self.test_table_name) def test_query_tool_button(self): - self.page.expand_database_node( - self.server['name'], - self.server['db_password'], self.test_db) + self.page.expand_database_node("Servers", self.server['name'], + self.server['db_password'], + self.test_db) self.assertTrue(self.page.retry_click( (By.CSS_SELECTOR, BrowserToolBarLocators.open_query_tool_button_css), (By.CSS_SELECTOR, BrowserToolBarLocators.query_tool_panel_css)), 'Query tool did not open on clicking Query Tool button.') + self.page.close_query_tool(prompt=False) def test_view_data_tool_button(self): - 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.click_a_tree_node( - self.test_table_name, - TreeAreaLocators.sub_nodes_of_tables_node) + self.page.expand_tables_node("Servers", self.server['name'], + self.server['db_password'], self.test_db, + "public") + + table_node = self.page.check_if_element_exists_with_scroll( + TreeAreaLocators.table_node(self.test_table_name)) + table_node.click() self.assertTrue(self.page.retry_click( (By.CSS_SELECTOR, diff --git a/web/pgadmin/feature_tests/copy_selected_query_results_feature_test.py b/web/pgadmin/feature_tests/copy_selected_query_results_feature_test.py index 8e2caa5dd..619b9af3a 100644 --- a/web/pgadmin/feature_tests/copy_selected_query_results_feature_test.py +++ b/web/pgadmin/feature_tests/copy_selected_query_results_feature_test.py @@ -8,6 +8,7 @@ ########################################################################## import random +import time from selenium.webdriver import ActionChains from selenium.webdriver.common.keys import Keys @@ -37,9 +38,9 @@ class CopySelectedQueryResultsFeatureTest(BaseFeatureTest): self.server, self.test_db, self.test_table_name) def runTest(self): - self.page.expand_database_node( - self.server['name'], - self.server['db_password'], self.test_db) + self.page.expand_database_node("Servers", self.server['name'], + self.server['db_password'], + self.test_db) self.page.open_query_tool() self.page.fill_codemirror_area_with( @@ -60,7 +61,7 @@ class CopySelectedQueryResultsFeatureTest(BaseFeatureTest): def paste_values_to_scratch_pad(self): self.page.driver.switch_to.default_content() - self.page.driver.switch_to_frame( + self.page.driver.switch_to.frame( self.page.driver.find_element_by_tag_name("iframe")) scratch_pad_ele = self.page.find_by_css_selector( QueryToolLocators.scratch_pad_css) diff --git a/web/pgadmin/feature_tests/file_manager_test.py b/web/pgadmin/feature_tests/file_manager_test.py index ac9f25c9f..58561449b 100644 --- a/web/pgadmin/feature_tests/file_manager_test.py +++ b/web/pgadmin/feature_tests/file_manager_test.py @@ -67,9 +67,9 @@ class CheckFileManagerFeatureTest(BaseFeatureTest): print("OK.", file=sys.stderr) def _navigate_to_query_tool(self): - self.page.expand_database_node( - self.server['name'], - self.server['db_password'], self.test_db) + self.page.expand_database_node("Server", self.server['name'], + self.server['db_password'], + self.test_db) self.page.open_query_tool() def _create_new_file(self): diff --git a/web/pgadmin/feature_tests/keyboard_shortcut_test.py b/web/pgadmin/feature_tests/keyboard_shortcut_test.py index 06965d7af..de99818a1 100644 --- a/web/pgadmin/feature_tests/keyboard_shortcut_test.py +++ b/web/pgadmin/feature_tests/keyboard_shortcut_test.py @@ -133,7 +133,7 @@ class KeyboardShortcutFeatureTest(BaseFeatureTest): "and contains(.,'" + locator + "')]" ) - field = file_menu.find_element_by_name('key') + field = file_menu.find_element(By.NAME, 'key') field.click() field.send_keys(key) @@ -141,5 +141,5 @@ class KeyboardShortcutFeatureTest(BaseFeatureTest): self.page.click_modal('Save') self.page.wait_for_element_to_disappear( - lambda driver: driver.find_element_by_css_selector(".ajs-modal") + lambda driver: driver.find_element(By.CSS_SELECTOR, ".ajs-modal") ) diff --git a/web/pgadmin/feature_tests/pg_datatype_validation_test.py b/web/pgadmin/feature_tests/pg_datatype_validation_test.py index da0e8b683..cbc43a1e0 100644 --- a/web/pgadmin/feature_tests/pg_datatype_validation_test.py +++ b/web/pgadmin/feature_tests/pg_datatype_validation_test.py @@ -154,7 +154,9 @@ class PGDataypeFeatureTest(BaseFeatureTest): def runTest(self): self.page.wait_for_spinner_to_disappear() self.page.add_server(self.server) - self._schema_node_expandable() + self.page.expand_database_node("Server", self.server['name'], + self.server['db_password'], + self.test_db) # Check data types self._check_datatype() @@ -163,17 +165,15 @@ class PGDataypeFeatureTest(BaseFeatureTest): def after(self): self.page.remove_server(self.server) + # TODO - To be remove def _schema_node_expandable(self): - self.page.expand_database_node( - self.server['name'], - self.server['db_password'], self.test_db) + self.page.expand_database_node("Server", self.server['name'], + self.server['db_password'], + self.test_db) 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.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 78c2d85b5..9a8650bb2 100644 --- a/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py +++ b/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py @@ -67,9 +67,9 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest): self.wait = WebDriverWait(self.page.driver, 20) def runTest(self): - self.page.expand_database_node( - self.server['name'], - self.server['db_password'], self.database_name) + self.page.expand_database_node("Server", self.server['name'], + self.server['db_password'], + self.database_name) # Backup self.initiate_backup() diff --git a/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py b/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py index f9594a47d..344e6b2c4 100644 --- a/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py +++ b/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py @@ -91,29 +91,25 @@ class PGUtilitiesMaintenanceFeatureTest(BaseFeatureTest): self.verify_command() def _open_maintenance_dialogue(self): - self.page.expand_database_node( - self.server['name'], - self.server['db_password'], self.database_name) if self.test_level == 'table': - self.page.toggle_open_schema_node(self.server['name'], - self.server['db_password'], - self.database_name, 'public') - self.page.toggle_open_tables_node(self.server['name'], - self.server['db_password'], - self.database_name, 'public') - retry = 5 + self.page.expand_tables_node("Server", self.server['name'], + self.server['db_password'], + self.database_name, 'public') + + table_node = self.page.check_if_element_exists_with_scroll( + TreeAreaLocators.table_node(self.table_name)) + status = False - while retry > 0: - status = self.page.click_a_tree_node( - self.table_name, - TreeAreaLocators.sub_nodes_of_tables_node) - if status: - break - else: - retry -= 1 - self.assertTrue(status, "Table name {} is not selected".format( - self.table_name)) + if table_node: + status = True + self.assertTrue(status, "Table name {} is not visible/selected". + format(self.table_name)) + table_node.click() + else: + self.page.expand_database_node("Server", self.server['name'], + self.server['db_password'], + self.database_name) self.page.retry_click( (By.LINK_TEXT, NavMenuLocators.tools_menu_link_text), diff --git a/web/pgadmin/feature_tests/query_tool_auto_complete_tests.py b/web/pgadmin/feature_tests/query_tool_auto_complete_tests.py index d384ebfc0..9e354fe34 100644 --- a/web/pgadmin/feature_tests/query_tool_auto_complete_tests.py +++ b/web/pgadmin/feature_tests/query_tool_auto_complete_tests.py @@ -12,6 +12,7 @@ import random from selenium.webdriver import ActionChains from selenium.webdriver.common.keys import Keys +from selenium.webdriver.common.by import By from regression.python_test_utils import test_utils from regression.feature_utils.base_feature_test import BaseFeatureTest from regression.feature_utils.locators import QueryToolLocators @@ -55,9 +56,9 @@ class QueryToolAutoCompleteFeatureTest(BaseFeatureTest): test_utils.create_table(self.server, self.test_db, self.second_table_name) - self.page.expand_database_node( - self.server['name'], - self.server['db_password'], self.test_db) + self.page.expand_database_node("Server", self.server['name'], + self.server['db_password'], + self.test_db) self.page.open_query_tool() self.page.wait_for_spinner_to_disappear() @@ -171,7 +172,7 @@ class QueryToolAutoCompleteFeatureTest(BaseFeatureTest): Keys.CONTROL).send_keys(Keys.SPACE).key_up( Keys.CONTROL).perform() if self.page.check_if_element_exist_by_xpath( - QueryToolLocators.code_mirror_hint_box_xpath, 20): + QueryToolLocators.code_mirror_hint_box_xpath, 15): hint_displayed = True break else: @@ -184,8 +185,8 @@ class QueryToolAutoCompleteFeatureTest(BaseFeatureTest): else: # if no IntelliSense is present it means there is only one option # so check if required string is present in codeMirror - code_mirror = self.driver.find_elements_by_xpath( - QueryToolLocators.code_mirror_data_xpath) + code_mirror = self.driver.find_elements( + By.XPATH, QueryToolLocators.code_mirror_data_xpath) for data in code_mirror: code_mirror_text = data.text print("Single entry..........") diff --git a/web/pgadmin/feature_tests/query_tool_journey_test.py b/web/pgadmin/feature_tests/query_tool_journey_test.py index 4ec636302..c0e7f442c 100644 --- a/web/pgadmin/feature_tests/query_tool_journey_test.py +++ b/web/pgadmin/feature_tests/query_tool_journey_test.py @@ -12,6 +12,7 @@ import random from selenium.webdriver import ActionChains from selenium.webdriver.common.keys import Keys +from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from regression.python_test_utils import test_utils from regression.feature_utils.base_feature_test import BaseFeatureTest @@ -94,7 +95,7 @@ class QueryToolJourneyTest(BaseFeatureTest): def _test_copies_rows(self): self.page.driver.switch_to.default_content() - self.page.driver.switch_to_frame( + self.page.driver.switch_to.frame( self.page.driver.find_element_by_tag_name("iframe")) select_row = self.page.find_by_xpath( @@ -106,7 +107,7 @@ class QueryToolJourneyTest(BaseFeatureTest): copy_row.click() self.page.driver.switch_to.default_content() - self.page.driver.switch_to_frame( + self.page.driver.switch_to.frame( self.page.driver.find_element_by_tag_name("iframe")) scratch_pad_ele = self.page.find_by_css_selector( @@ -121,7 +122,7 @@ class QueryToolJourneyTest(BaseFeatureTest): def _test_copies_columns(self): self.page.driver.switch_to.default_content() - self.page.driver.switch_to_frame( + self.page.driver.switch_to.frame( self.page.driver.find_element_by_tag_name("iframe")) column_header = self.page.find_by_css_selector( @@ -133,7 +134,7 @@ class QueryToolJourneyTest(BaseFeatureTest): copy_btn.click() self.page.driver.switch_to.default_content() - self.page.driver.switch_to_frame( + self.page.driver.switch_to.frame( self.page.driver.find_element_by_tag_name("iframe")) scratch_pad_ele = self.page.find_by_css_selector( @@ -169,13 +170,13 @@ class QueryToolJourneyTest(BaseFeatureTest): failed_history_detail_pane.text ) self.page.wait_for_elements( - lambda driver: driver.find_elements_by_css_selector( - QueryToolLocators.query_history_entries)) + lambda driver: driver.find_elements( + By.CSS_SELECTOR, QueryToolLocators.query_history_entries)) # get the query history rows and click the previous query row which # was executed and verify it - history_rows = self.driver.find_elements_by_css_selector( - QueryToolLocators.query_history_entries) + history_rows = self.driver.find_elements( + By.CSS_SELECTOR, QueryToolLocators.query_history_entries) history_rows[1].click() selected_history_entry = self.page.find_by_css_selector( @@ -209,8 +210,8 @@ class QueryToolJourneyTest(BaseFeatureTest): self.page.click_tab(self.query_history_tab_name) query_list = self.page.wait_for_elements( - lambda driver: driver.find_elements_by_css_selector( - QueryToolLocators.query_history_entries)) + lambda driver: driver.find_elements( + By.CSS_SELECTOR, QueryToolLocators.query_history_entries)) self.assertTrue(17, len(query_list)) @@ -420,9 +421,9 @@ class QueryToolJourneyTest(BaseFeatureTest): self.page.click_modal('Yes') def _navigate_to_query_tool(self): - self.page.expand_database_node( - self.server['name'], - self.server['db_password'], self.test_db) + self.page.expand_database_node("Server", self.server['name'], + self.server['db_password'], + self.test_db) self.page.open_query_tool() self.page.wait_for_spinner_to_disappear() diff --git a/web/pgadmin/feature_tests/query_tool_tests.py b/web/pgadmin/feature_tests/query_tool_tests.py index 8cdb164d4..1de2686de 100644 --- a/web/pgadmin/feature_tests/query_tool_tests.py +++ b/web/pgadmin/feature_tests/query_tool_tests.py @@ -36,9 +36,9 @@ class QueryToolFeatureTest(BaseFeatureTest): def before(self): self.page.wait_for_spinner_to_disappear() self.page.add_server(self.server) - self.page.expand_database_node( - self.server['name'], - self.server['db_password'], self.test_db) + self.page.expand_database_node("Server", self.server['name'], + self.server['db_password'], + self.test_db) self.page.open_query_tool() self.page.wait_for_spinner_to_disappear() self._reset_options() @@ -128,7 +128,7 @@ class QueryToolFeatureTest(BaseFeatureTest): QueryToolLocators.btn_explain_buffers, QueryToolLocators.btn_explain_timing): btn = self.page.find_by_css_selector(op) - check = btn.find_element_by_tag_name('i') + check = btn.find_element(By.TAG_NAME, 'i') if 'visibility-hidden' not in check.get_attribute('class'): btn.click() @@ -286,10 +286,10 @@ SELECT generate_series(1, 1000) as id order by id desc""" ) # Search for 'Output' word in result (verbose option) - canvas.find_element_by_xpath("//*[contains(string(), 'Output')]") + canvas.find_element(By.XPATH, "//*[contains(string(), 'Output')]") # Search for 'Total Cost' word in result (cost option) - canvas.find_element_by_xpath("//*[contains(string(),'Total Cost')]") + canvas.find_element(By.XPATH, "//*[contains(string(),'Total Cost')]") def _query_tool_explain_analyze_with_buffers_and_timing(self): query = """-- Explain analyze query with buffers and timing @@ -382,8 +382,8 @@ SELECT relname FROM pg_catalog.pg_class canvas = self.wait.until(EC.presence_of_element_located( (By.CSS_SELECTOR, QueryToolLocators.query_output_canvas_css))) - el = canvas.find_elements_by_xpath( - QueryToolLocators.output_column_data_xpath.format(table_name)) + el = canvas.find_elements(By.XPATH, QueryToolLocators. + output_column_data_xpath.format(table_name)) assert len(el) == 0, "Table '{}' created with auto commit disabled " \ "and without any explicit commit.".format( @@ -699,7 +699,7 @@ SELECT 1, pg_sleep(300)""" QueryToolLocators.btn_explain_buffers, QueryToolLocators.btn_explain_timing): btn = self.page.find_by_css_selector(op) - check = btn.find_element_by_tag_name('i') + check = btn.find_element(By.TAG_NAME, 'i') if 'visibility-hidden' not in check.get_attribute('class'): btn.click() # click cost button @@ -720,7 +720,7 @@ SELECT 1, pg_sleep(300)""" (By.CSS_SELECTOR, QueryToolLocators.query_output_canvas_css)) ) # Search for 'Output' word in result (verbose option) - canvas.find_element_by_xpath("//*[contains(string(), 'JIT')]") + canvas.find_element(By.XPATH, "//*[contains(string(), 'JIT')]") self.page.clear_query_tool() @@ -732,7 +732,7 @@ class WaitForAnyElementWithText(object): def __call__(self, driver): try: - elements = EC._find_elements(driver, self.locator) + elements = driver.find_elements(*self.locator) for elem in elements: if self.text in elem.text: return True diff --git a/web/pgadmin/feature_tests/table_ddl_feature_test.py b/web/pgadmin/feature_tests/table_ddl_feature_test.py index d191019ca..bddab4df8 100644 --- a/web/pgadmin/feature_tests/table_ddl_feature_test.py +++ b/web/pgadmin/feature_tests/table_ddl_feature_test.py @@ -31,16 +31,13 @@ class TableDdlFeatureTest(BaseFeatureTest): self.test_table_name = "test_table" + str(random.randint(1000, 3000)) test_utils.create_table(self.server, self.test_db, self.test_table_name) + self.page.expand_tables_node("Server", self.server['name'], + self.server['db_password'], self.test_db, + 'public') + table_node = self.page.check_if_element_exists_with_scroll( + TreeAreaLocators.table_node(self.test_table_name)) + table_node.click() - self.page.expand_database_node( - self.server['name'], - self.server['db_password'], self.test_db) - self.page.toggle_open_tables_node( - self.server['name'], self.server['db_password'], - self.test_db, 'public') - 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/test_copy_sql_to_query_tool.py b/web/pgadmin/feature_tests/test_copy_sql_to_query_tool.py index a08532fa7..f4b6ded7f 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 @@ -73,7 +73,7 @@ class CopySQLFeatureTest(BaseFeatureTest): time.sleep(5) self.driver.switch_to.default_content() - self.driver.switch_to_frame( + self.driver.switch_to.frame( self.driver.find_element_by_tag_name("iframe")) code_mirror = self.driver.find_elements_by_xpath( @@ -89,16 +89,12 @@ class CopySQLFeatureTest(BaseFeatureTest): self.test_table_name = "test_table" + str(random.randint(1000, 3000)) test_utils.create_table(self.server, self.test_db, self.test_table_name) - - self.page.expand_database_node( - self.server['name'], - self.server['db_password'], self.test_db) - self.page.toggle_open_tables_node( - self.server['name'], self.server['db_password'], - self.test_db, 'public') - self.page.click_a_tree_node( - self.test_table_name, - TreeAreaLocators.sub_nodes_of_tables_node) + self.page.expand_tables_node("Server", self.server['name'], + self.server['db_password'], self.test_db, + 'public') + table_node = self.page.check_if_element_exists_with_scroll( + TreeAreaLocators.table_node(self.test_table_name)) + table_node.click() def _update_preferences_setting(self): file_menu = self.page.find_by_css_selector( diff --git a/web/pgadmin/feature_tests/view_data_dml_queries.py b/web/pgadmin/feature_tests/view_data_dml_queries.py index 93e20c130..24f04719e 100644 --- a/web/pgadmin/feature_tests/view_data_dml_queries.py +++ b/web/pgadmin/feature_tests/view_data_dml_queries.py @@ -121,13 +121,9 @@ CREATE TABLE public.nonintpkey def runTest(self): self.page.wait_for_spinner_to_disappear() self.page.add_server(self.server) - - self.page.expand_database_node( - self.server['name'], - self.server['db_password'], self.test_db) - self.page.toggle_open_tables_node(self.server['name'], - self.server['db_password'], - self.test_db, 'public') + self.page.expand_tables_node("Server", self.server['name'], + self.server['db_password'], self.test_db, + 'public') self._load_config_data('table_insert_update_cases') data_local = config_data @@ -169,12 +165,17 @@ 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) + # 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() + # Open Object -> View/Edit data self._view_data_grid(table_name) + time.sleep(3) self.page.wait_for_query_tool_loading_indicator_to_disappear() # Run test to insert a new row in table with default values self._add_row(config_data_local) @@ -237,7 +238,7 @@ CREATE TABLE public.nonintpkey if cell_type in ['int', 'int[]']: if value == 'clear': - cell_el.find_element_by_css_selector('input').clear() + cell_el.find_element(By.CSS_SELECTOR, 'input').clear() else: ActionChains(self.driver).send_keys(value). \ send_keys(Keys.ENTER).perform() @@ -273,13 +274,13 @@ CREATE TABLE public.nonintpkey else: # Boolean editor test for to True click if data[1] == 'true': - checkbox_el = cell_el.find_element_by_xpath( - ".//*[contains(@class, 'multi-checkbox')]") + checkbox_el = cell_el.find_element( + By.XPATH, ".//*[contains(@class, 'multi-checkbox')]") checkbox_el.click() # Boolean editor test for to False click elif data[1] == 'false': - checkbox_el = cell_el.find_element_by_xpath( - ".//*[contains(@class, 'multi-checkbox')]") + checkbox_el = cell_el.find_element( + By.XPATH, ".//*[contains(@class, 'multi-checkbox')]") # Sets true checkbox_el.click() # Sets false @@ -307,7 +308,7 @@ CREATE TABLE public.nonintpkey ), CheckForViewDataTest.TIMEOUT_STRING ) self.page.driver.switch_to.frame( - self.page.driver.find_element_by_tag_name('iframe') + self.page.driver.find_element(By.TAG_NAME, 'iframe') ) def _copy_paste_row(self, config_data_l): @@ -380,7 +381,7 @@ CREATE TABLE public.nonintpkey try: result_row = self.page.find_by_xpath(xpath) element = \ - result_row.find_element_by_class_name("r" + str(idx)) + result_row.find_element(By.CLASS_NAME, "r" + str(idx)) self.page.driver.execute_script( scroll_on_arg_for_js, element) break @@ -398,6 +399,6 @@ CREATE TABLE public.nonintpkey 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)) + element = result_row.find_element(By.CLASS_NAME, "r" + str(idx)) self.page.driver.execute_script( scroll_on_arg_for_js, element) 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 93971eb86..5cda88be7 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 @@ -9,12 +9,14 @@ import sys import random +import time from regression.python_test_utils import test_utils from regression.feature_utils.base_feature_test import BaseFeatureTest from selenium.webdriver import ActionChains from selenium.common.exceptions import StaleElementReferenceException, \ WebDriverException +from selenium.webdriver.common.by import By from regression.feature_utils.locators import QueryToolLocators from regression.feature_utils.tree_area_locators import TreeAreaLocators @@ -74,7 +76,6 @@ class CheckForXssFeatureTest(BaseFeatureTest): while retry > 0: try: self.page.refresh_page() - self.page.toggle_open_servers_group() self._tables_node_expandable() self._check_xss_in_dependents_tab() retry = 0 @@ -106,15 +107,13 @@ class CheckForXssFeatureTest(BaseFeatureTest): self.server, self.test_db, self.test_table_name) def _tables_node_expandable(self): - self.page.expand_database_node( - self.server['name'], - self.server['db_password'], self.test_db) - self.page.toggle_open_tables_node(self.server['name'], - self.server['db_password'], - self.test_db, 'public') - self.page.click_a_tree_node( - self.test_table_name, - TreeAreaLocators.sub_nodes_of_tables_node) + self.page.expand_tables_node("Server", self.server['name'], + self.server['db_password'], self.test_db, + 'public') + + table_node = self.page.check_if_element_exists_with_scroll( + TreeAreaLocators.table_node(self.test_table_name)) + table_node.click() def _check_xss_in_browser_tree(self): print( @@ -138,6 +137,12 @@ class CheckForXssFeatureTest(BaseFeatureTest): file=sys.stderr, end="" ) self.page.click_tab("SQL") + + # Wait till data is displayed in SQL Tab + self.assertTrue(self.page.check_if_element_exist_by_xpath( + "//*[contains(@class,'CodeMirror-lines') and " + "contains(.,'CREATE TABLE')]", 10), "No data displayed in SQL tab") + # Fetch the inner html & check for escaped characters source_code = self.page.find_by_xpath( "//*[contains(@class,'CodeMirror-lines') and " @@ -197,7 +202,7 @@ class CheckForXssFeatureTest(BaseFeatureTest): "contains(@style, 'top:0px')]" ) - cells = result_row.find_elements_by_tag_name('div') + cells = result_row.find_elements(By.TAG_NAME, 'div') # remove first element as it is row number. source_code = cells[1].get_attribute('innerHTML') @@ -239,8 +244,8 @@ class CheckForXssFeatureTest(BaseFeatureTest): while retry > 0: try: history_ele = self.driver \ - .find_element_by_css_selector( - ".query-detail .content-value") + .find_element(By.CSS_SELECTOR, + ".query-detail .content-value") source_code = history_ele.get_attribute('innerHTML') break except StaleElementReferenceException: @@ -279,7 +284,7 @@ class CheckForXssFeatureTest(BaseFeatureTest): ) self.page.find_by_css_selector(".slick-header-column") - cells = self.driver.\ + cells = self.driver. \ find_elements_by_css_selector(".slick-header-column") # remove first element as it is row number. 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 79ac785be..c04f1ad0f 100644 --- a/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py +++ b/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py @@ -58,16 +58,12 @@ class CheckDebuggerForXssFeatureTest(BaseFeatureTest): self.function_name) def _function_node_expandable(self): - self.page.expand_database_node( - self.server['name'], - self.server['db_password'], self.test_db) - self.page.toggle_open_schema_node(self.server['name'], - self.server['db_password'], - self.test_db, 'public') - self.page.toggle_open_function_node() - self.page.click_a_tree_node( - self.function_name + "()", - TreeAreaLocators.sub_nodes_of_functions_node) + self.page.expand_schema_child_node("Server", self.server['name'], + self.server['db_password'], + self.test_db, 'public', "Functions") + function_node = self.page.check_if_element_exists_with_scroll( + TreeAreaLocators.function_node(self.function_name + "()")) + function_node.click() def _debug_function(self): self.page.driver.find_element_by_link_text("Object").click() diff --git a/web/pgadmin/feature_tests/xss_checks_roles_control_test.py b/web/pgadmin/feature_tests/xss_checks_roles_control_test.py index 4aeecb4e0..d51632386 100644 --- a/web/pgadmin/feature_tests/xss_checks_roles_control_test.py +++ b/web/pgadmin/feature_tests/xss_checks_roles_control_test.py @@ -42,6 +42,8 @@ class CheckRoleMembershipControlFeatureTest(BaseFeatureTest): self.role) test_utils.create_role(self.server, "postgres", "<h1>test</h1>") + test_utils.grant_role(self.server, "postgres", + self.role, "<h1>test</h1>") self.wait = WebDriverWait(self.page.driver, 20) def runTest(self): @@ -58,11 +60,13 @@ class CheckRoleMembershipControlFeatureTest(BaseFeatureTest): "<h1>test</h1>") def _role_node_expandable(self, role): - self.page.expand_server_node( - self.server['name'], self.server['db_password']) - self.page.toggle_open_tree_item('Login/Group Roles') - self.page.click_a_tree_node( - role, TreeAreaLocators.sub_nodes_of_login_group_node) + self.page.expand_server_child_node("Server", self.server['name'], + self.server['db_password'], + 'Login/Group Roles') + + role_node = self.page.check_if_element_exists_with_scroll( + TreeAreaLocators.role_node(role)) + role_node.click() def _check_role_membership_control(self): self.page.driver.find_element_by_link_text( @@ -70,24 +74,22 @@ class CheckRoleMembershipControlFeatureTest(BaseFeatureTest): property_object = self.wait.until(EC.visibility_of_element_located( (By.CSS_SELECTOR, NavMenuLocators.properties_obj_css))) property_object.click() - WebDriverWait(self.page.driver, 4).until( + membership_tab = WebDriverWait(self.page.driver, 4).until( EC.presence_of_element_located(( - By.XPATH, "//a[normalize-space(text())='Membership']"))) - self.click_membership_tab() + By.XPATH, "//span[normalize-space(text())='Membership']"))) + membership_tab.click() + # Fetch the source code for our custom control source_code = self.page.find_by_xpath( - "//div[contains(@class,'rolmembership')]" - ).get_attribute('innerHTML') + "//span[contains(@class,'icon-')]/following-sibling::span" + ).text self._check_escaped_characters( source_code, '<h1>test</h1>', 'Role Membership Control' ) - self.page.find_by_xpath( - "//button[contains(@type, 'cancel') and " - "contains(.,'Cancel')]" - ).click() + self.page.find_by_xpath("//button/span[text()='Close']").click() def _check_escaped_characters(self, source_code, string_to_find, source): # For XSS we need to search against element's html code diff --git a/web/regression/feature_utils/locators.py b/web/regression/feature_utils/locators.py index 4c57f344b..3c728ca9c 100644 --- a/web/regression/feature_utils/locators.py +++ b/web/regression/feature_utils/locators.py @@ -249,8 +249,8 @@ class ConnectToServerDiv: password_field = "//input[@id='password']" ok_button = \ - "//div [@class='alertify ajs-modeless ajs-movable ajs-zoom']" \ - "//button[text()='OK']" + "//button[@class='ajs-button btn btn-primary fa fa-check " \ + "pg-alertify-button']" error_message = \ "//form[@id='frmPassword']/div/div//div[@class='alert-text']" @@ -258,3 +258,12 @@ class ConnectToServerDiv: cancel_button = \ "//div [@class='alertify ajs-modeless ajs-movable ajs-zoom']" \ "//button[text()='Cancel']" + + +class PropertyDialogueLocators: + # This will contain xpaths for elements in properties dialogue + server_dialogue_title = "//div[text()='Create - Server']" + + server_connection_tab = "//button/span[text()='Connection']" + + server_tab_save = "//button/span[text()='Save']" diff --git a/web/regression/feature_utils/pgadmin_page.py b/web/regression/feature_utils/pgadmin_page.py index c44f62358..e648bc625 100644 --- a/web/regression/feature_utils/pgadmin_page.py +++ b/web/regression/feature_utils/pgadmin_page.py @@ -20,7 +20,7 @@ from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from regression.feature_utils.locators import QueryToolLocators, \ - NavMenuLocators, ConnectToServerDiv + NavMenuLocators, ConnectToServerDiv, PropertyDialogueLocators from regression.feature_utils.tree_area_locators import TreeAreaLocators @@ -37,6 +37,7 @@ class PgadminPage: self.timeout = 30 self.app_start_timeout = 90 + # pgAdmin related methods def login_to_app(self, user_detail): if not (self.check_if_element_exist_by_xpath( '//a[@id="navbar-user"]', 1)): @@ -90,60 +91,61 @@ class PgadminPage: self.click_element(modal_button) def add_server(self, server_config): - self.find_by_xpath( - "//*[@class='aciTreeText' and contains(.,'Servers')]").click() - - if self.driver.name == 'firefox': - ActionChains(self.driver).context_click(self.find_by_xpath( - "//*[@class='aciTreeText' and contains(.,'Servers')]"))\ - .perform() - ActionChains(self.driver).move_to_element( - self.find_by_xpath("//li/span[text()='Create']")).perform() - self.find_by_xpath("//li/span[text()='Server...']").click() - else: - self.driver.find_element_by_link_text("Object").click() - ActionChains(self.driver).move_to_element( - self.driver.find_element_by_link_text("Create")).perform() - self.find_by_partial_link_text("Server...").click() + server_group_node = \ + self.find_by_xpath(TreeAreaLocators.server_group_node("Servers")) + ActionChains(self.driver).context_click(server_group_node).perform() + ActionChains(self.driver).move_to_element(self.find_by_xpath( + TreeAreaLocators.context_menu_element('Create'))).perform() + ActionChains(self.driver).move_to_element(self.find_by_xpath( + TreeAreaLocators.context_menu_element('Server...'))) \ + .click().perform() WebDriverWait(self.driver, 5).until(EC.visibility_of_element_located( - (By.XPATH, "//div[text()='Create - Server']"))) + (By.XPATH, PropertyDialogueLocators.server_dialogue_title))) # After server dialogue opens - self.fill_input_by_field_name("name", server_config['name'], - loose_focus=True) - self.find_by_partial_link_text("Connection").click() - self.fill_input_by_field_name("host", server_config['host']) - self.fill_input_by_field_name("port", server_config['port']) - self.fill_input_by_field_name("username", server_config['username']) - self.fill_input_by_field_name("password", server_config['db_password']) - WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable( - (By.CSS_SELECTOR, "button[type='save'].btn.btn-primary"))) - self.find_by_css_selector("button[type='save'].btn.btn-primary").\ - click() - - server_tree_xpath = \ - "//*[@id='tree']//*[.='" + server_config['name'] + "']" + self.fill_input_by_field_name( + "name", server_config['name'], input_keys=True) + self.find_by_xpath( + PropertyDialogueLocators.server_connection_tab).click() + self.fill_input_by_field_name( + "host", server_config['host'], input_keys=True) + self.fill_input_by_field_name( + "port", server_config['port'], input_keys=True) + self.fill_input_by_field_name( + "username", server_config['username'], input_keys=True) + self.fill_input_by_field_name( + "password", server_config['db_password'], input_keys=True) + + save_btn = WebDriverWait(self.driver, 5).until( + EC.element_to_be_clickable( + (By.XPATH, PropertyDialogueLocators.server_tab_save))) + save_btn.click() + + server_tree_xpath = TreeAreaLocators.server_node(server_config['name']) try: WebDriverWait(self.driver, 10).until( EC.visibility_of_element_located( (By.XPATH, server_tree_xpath))) except TimeoutException: - self.toggle_open_servers_group() + self.expand_server_group_node("Server") WebDriverWait(self.driver, 10).until( EC.visibility_of_element_located( (By.XPATH, server_tree_xpath))) def open_query_tool(self): - self.driver.find_element_by_link_text("Tools").click() - tools_menu = self.driver.find_element_by_id('mnu_tools') + self.driver.find_element(By.LINK_TEXT, "Tools").click() + tools_menu = self.driver.find_element(By.ID, 'mnu_tools') - query_tool = tools_menu.find_element_by_id('query_tool') + query_tool = tools_menu.find_element(By.ID, 'query_tool') self.enable_menu_item(query_tool, 10) self.find_by_partial_link_text("Query Tool").click() + self.wait_for_element_to_be_visible( + self.driver, "//div[@id='btn-conn-status']", 5) + def open_view_data(self, table_name): self.driver.find_element_by_link_text("Object").click() ActionChains( @@ -259,6 +261,7 @@ class PgadminPage: break else: retry -= 1 + if option == 'auto_commit': update_execute_option_setting( QueryToolLocators.btn_auto_commit_check_status, @@ -303,29 +306,33 @@ class PgadminPage: QueryToolLocators.btn_auto_rollback) def close_data_grid(self): - self.driver.switch_to_default_content() + self.driver.switch_to.default_content() xpath = "//*[@id='dockerContainer']/div/div[3]/div/div[2]/div[1]" self.click_element(self.find_by_xpath(xpath)) def remove_server(self, server_config): self.driver.switch_to.default_content() - server_to_remove = self.find_by_xpath( - "//*[@id='tree']//*[.='" + server_config['name'] + - "' and @class='aciTreeItem']") - self.driver.execute_script( - self.js_executor_scrollintoview_arg, server_to_remove) - self.click_element(server_to_remove) - object_menu_item = self.find_by_partial_link_text("Object") - self.click_element(object_menu_item) - delete_menu_item = self.find_by_partial_link_text("Remove Server") - self.click_element(delete_menu_item) - self.click_modal('Yes') - time.sleep(1) + server_to_remove = self.check_if_element_exists_with_scroll( + TreeAreaLocators.server_node(server_config['name'])) + if server_to_remove: + self.driver.execute_script( + self.js_executor_scrollintoview_arg, server_to_remove) + self.click_element(server_to_remove) + object_menu_item = self.find_by_partial_link_text("Object") + self.click_element(object_menu_item) + delete_menu_item = self.find_by_partial_link_text("Remove Server") + self.click_element(delete_menu_item) + self.click_modal('Yes') + time.sleep(1) + else: + print("%s Server is not removed", server_config['name'], + file=sys.stderr) + # TODO - Not used to be deleted def select_tree_item(self, tree_item_text): item = self.find_by_xpath( - "//*[@id='tree']//*[contains(text(), '" + tree_item_text + "')]" - "/parent::span[@class='aciTreeItem']") + "//*[@id='tree']//*[contains(text(), '" + tree_item_text + + "')]/parent::span[@class='aciTreeItem']") self.driver.execute_script(self.js_executor_scrollintoview_arg, item) # unexpected exception like element overlapping, click attempts more # than one time @@ -340,6 +347,7 @@ class PgadminPage: if attempts == 0: raise e + # TODO - Not used to be deleted 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""" @@ -368,333 +376,423 @@ class PgadminPage: "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 + def click_to_expand_tree_node(self, tree_node_web_element, + tree_node_exp_check_xpath): + """ + Method clicks passed webelement to expand specified tree node + :param tree_node_web_element: + :param tree_node_exp_check_xpath: + :return: True is tree_node_exp_check_xpath present in DOM else false + """ + 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 + else: + return False + + def expand_server_group_node(self, server_group_name): + """ + Expands specified server group + :param server_group_name: + :return: True is server group is expanded else false + """ + server_group_expanded = False self.wait_for_spinner_to_disappear() - if self.check_if_element_exist_by_xpath( - TreeAreaLocators.server_group_node): - if self.get_expansion_status_of_node( - TreeAreaLocators.server_group_node_exp_status): - is_expanded = True + server_group_node_xpath = \ + TreeAreaLocators.server_group_node(server_group_name) + server_group_node_exp_status_xpath = \ + TreeAreaLocators.server_group_node_exp_status(server_group_name) + server_group_node = self.check_if_element_exists_with_scroll( + server_group_node_xpath) + + if server_group_node: + if self.check_if_element_exist_by_xpath( + server_group_node_exp_status_xpath, 1): + server_group_expanded = True else: - webdriver.ActionChains(self.driver).double_click( - self.find_by_xpath( - TreeAreaLocators. - server_group_node)).perform() - if self.check_if_element_exist_by_xpath( - TreeAreaLocators.server_group_sub_nodes): - is_expanded = True + server_group_expanded = self.click_to_expand_tree_node( + server_group_node, server_group_node_exp_status_xpath) + if server_group_expanded: + server_group_expanded = True else: - print( - "(toggle_open_servers_group)The Server Group " - "node is clicked to expand but it is not expanded", - file=sys.stderr) + print("(expand_server_group_node)The Server Group node is " + "clicked to expand but it is not expanded", + file=sys.stderr) else: - print("The Server Group node is not visible", + print("(expand_server_group_node)The Server Group node not found", file=sys.stderr) - return is_expanded + return server_group_expanded - def expand_server_node(self, server_name, server_password): - """will expand a particular server node""" - server_node_expansion_status = False - if self.toggle_open_servers_group(): - if self.wait_for_elements_to_appear( - self.driver, - TreeAreaLocators.server_group_sub_nodes): - subnodes_of_servers = self.find_by_xpath_list( - TreeAreaLocators.server_group_sub_nodes) - subnodes_of_servers_expansion_status = \ - self.find_by_xpath_list( - TreeAreaLocators. - server_group_sub_nodes_exp_status) - index_of_server_node = self.get_index_of_element( - subnodes_of_servers, server_name) - - server_node_expansion_status = self.click_expand_server_node( - subnodes_of_servers_expansion_status, - index_of_server_node, - subnodes_of_servers, - server_name, - server_password) + def expand_server_node(self, server_group_name, server_name, + server_password): + """ + Method expands specified server node + :param server_group_name: containing server + :param server_name: + :param server_password: + :return: true if server node is expnaded else false + """ + server_expanded = False + server_node_xpath = TreeAreaLocators.server_node(server_name) + server_node_exp_status_xpath = \ + TreeAreaLocators.server_node_exp_status(server_name) + if self.expand_server_group_node(server_group_name): + server_node = \ + self.check_if_element_exists_with_scroll(server_node_xpath) + if server_node: + self.driver.execute_script( + self.js_executor_scrollintoview_arg, server_node) + if self.check_if_element_exist_by_xpath( + server_node_exp_status_xpath, 1): + server_expanded = True + else: + server_expanded = self.click_expand_server_node( + server_name, server_password, server_node) + if not server_expanded: + print("(expand_server_node)The Server node is not " + "expnaded", file=sys.stderr) + else: + print("(expand_server_node)The Server node not found", + file=sys.stderr) else: - print( - "(expand_server_node) The Servers node is" - " not expanded", - file=sys.stderr) - return server_node_expansion_status + print("The server group node is not expanded", file=sys.stderr) + return server_expanded - def click_expand_server_node(self, subnodes_of_servers_expansion_status, - index_of_server_node, subnodes_of_servers, - server_name, server_password): + def click_expand_server_node(self, server_name, server_password, + server_node): """ Method actually clicks on server node to expand - :param subnodes_of_servers_expansion_status: - :param index_of_server_node: - :param subnodes_of_servers: :param server_name: :param server_password: + :param server_node: :return: True is click action is successful & server node expanded """ server_node_expansion_status = False - if not self.check_server_is_connected( - index_of_server_node): - if self.click_and_connect_server( - subnodes_of_servers[index_of_server_node], - server_password): + if self.check_server_is_connected(server_name): + if self.check_if_element_exist_by_xpath( + TreeAreaLocators.server_node_exp_status(server_name), 1): server_node_expansion_status = True else: - print( - "(expand_server_node)The server node is " - "not expanded", - file=sys.stderr) - else: - if not self.get_expansion_status_of_node_element( - subnodes_of_servers_expansion_status[ - index_of_server_node]): + # if server is connected but not expanded webdriver.ActionChains(self.driver).double_click( - subnodes_of_servers[ - index_of_server_node]).perform() - if self.wait_for_elements_to_appear( - self.driver, TreeAreaLocators. - sub_nodes_of_a_server_node(server_name), - 30): + server_node).perform() + if self.check_if_element_exist_by_xpath( + TreeAreaLocators.server_node_exp_status(server_name)): server_node_expansion_status = True - else: + else: + if self.click_and_connect_server(server_name, server_password): server_node_expansion_status = True + else: + print("(expand_server_node)The server node is not expanded", + file=sys.stderr) return server_node_expansion_status - def expand_databases_node(self, server_name, server_password): - """will expand databases node under server node""" - databases_node_expanded = False - if self.expand_server_node(server_name, server_password): - if self.wait_for_elements_to_appear( - self.driver, - TreeAreaLocators.sub_nodes_of_a_server_node(server_name)): - subnodes_of_server_node = self.find_by_xpath_list( - TreeAreaLocators.sub_nodes_of_a_server_node(server_name)) - subnode_of_server_node_exp_status = self.find_by_xpath_list( - TreeAreaLocators.sub_nodes_of_a_server_node_exp_status( - server_name)) - index_of_databases_node = self.get_index_of_element( - subnodes_of_server_node, - "Databases") - time.sleep(2) - expansion_status = self.get_expansion_status_of_node_element( - subnode_of_server_node_exp_status[index_of_databases_node]) - if not expansion_status: - databases_node_expanded = \ - self.click_to_expand_databases_node( - subnodes_of_server_node, - index_of_databases_node, - server_name) - else: - databases_node_expanded = True - else: - print("The server/previous nodes not expanded", + def check_server_is_connected(self, server_name): + """ + This will check connected status of a server" + :param server_name: + :return: true if server is connected + """ + server_connected = False + try: + server_connection_status_element = self.find_by_xpath( + TreeAreaLocators.server_connection_status_element(server_name)) + server_class = server_connection_status_element.get_attribute( + 'class') + if server_class == 'icon-pg' or server_class == 'icon-ppas': + server_connected = True + except Exception as e: + print("There is some exception thrown in the function " + "check_server_is_connected and is: " + str(e), file=sys.stderr) - return databases_node_expanded + return server_connected - def click_to_expand_databases_node(self, subnodes_of_server_node, - index_of_databases_node, server_name): + def click_and_connect_server(self, server_name, password): """ - Method clicks on databases node of specified server to expand - :param subnodes_of_server_node: - :param index_of_databases_node: + Method will connect to server with password :param server_name: - :return: True if database node click is successful & expanded + :param password: + :return: """ - retry = 5 - databases_node_expanded = False - while retry > 0: - webdriver.ActionChains(self.driver).double_click( - subnodes_of_server_node[ - index_of_databases_node].find_element_by_xpath( - ".//*[@class='aciTreeItem']") - ).perform() - if self.wait_for_elements_to_appear( - self.driver, TreeAreaLocators. - sub_nodes_of_databases_node(server_name), 3): - databases_node_expanded = True - break - else: - retry -= 1 - return databases_node_expanded + server_connection_status = False + try: + server_node_ele = self.find_by_xpath( + TreeAreaLocators.server_node(server_name)) + webdriver.ActionChains(self.driver). \ + double_click(server_node_ele).perform() + if self.check_if_element_exist_by_xpath( + ConnectToServerDiv.ok_button): + field = self.find_by_xpath( + ConnectToServerDiv.password_field) + self.fill_input(field, password) + self.find_by_xpath(ConnectToServerDiv.ok_button).click() + self.wait_for_element_to_disappear( + lambda driver: driver.find_element_by_xpath( + ConnectToServerDiv.ok_button)) + if self.check_if_element_exist_by_xpath( + ConnectToServerDiv.error_message, 2): + print( + "While entering password in click_and_connect_server " + "function, error is occurred : " + str( + self.find_by_xpath( + ConnectToServerDiv.error_message).text), + file=sys.stderr) + else: + server_connection_status = True + except Exception as e: + print( + "There is some exception thrown click_and_connect_server " + "and is: " + str( + e), file=sys.stderr) + return server_connection_status - def click_to_expand_database_node(self, sub_nodes_of_databases_node, - index_of_required_db_node, - name_of_database): + def expand_databases_node(self, server_group_name, server_name, + server_password): + """ + Method expands Databases node of specfied server + :param server_group_name: + :param server_name: + :param server_password: + :return: """ - Method clicks on specified database name from expanded databases node - of server. - :param sub_nodes_of_databases_node: - :param index_of_required_db_node: - :param name_of_database: - :return: True if particular database click is successful & expanded + return self.expand_server_child_node(server_group_name, server_name, + server_password, "Databases") + + def expand_server_child_node(self, server_group_name, server_name, + server_password, server_child_node_name): """ - retry = 5 - db_node_expanded_status = False - self.driver.execute_script(self.js_executor_scrollintoview_arg, - sub_nodes_of_databases_node[ - index_of_required_db_node]) - while retry > 0: - webdriver.ActionChains(self.driver).double_click( - sub_nodes_of_databases_node[ - index_of_required_db_node]).perform() + Method expands specified server node's child + :param server_group_name: + :param server_name: + :param server_password: + :param server_child_node_name: to be expanded + :return: true is child node is expanded else false + """ + server_child_expanded = False + server_child_node_xpath = TreeAreaLocators. \ + server_child_node(server_name, server_child_node_name) + server_child_node_exp_status_xpath = TreeAreaLocators. \ + server_child_node_exp_status(server_name, server_child_node_name) + + if self.expand_server_node(server_group_name, server_name, + server_password): if self.check_if_element_exist_by_xpath( - "//div[@class='ajs-header'and text()='INTERNAL SERVER " - "ERROR']", 1): - try: - self.click_modal('OK') - except Exception: - pass - retry -= 1 + server_child_node_exp_status_xpath, 1): + server_child_expanded = True else: - break - if self.wait_for_elements_to_appear( - self.driver, TreeAreaLocators. - sub_nodes_of_database_node( - name_of_database)): - db_node_expanded_status = True - return db_node_expanded_status - - def expand_database_node(self, server_name, server_password, - name_of_database): - """will expand database node under databases node""" - db_node_expanded_status = False - if self.expand_databases_node(server_name, server_password): - sub_nodes_of_databases_node = self.find_by_xpath_list( - TreeAreaLocators.sub_nodes_of_databases_node(server_name)) - index_of_required_db_node = self.get_index_of_element( - sub_nodes_of_databases_node, - name_of_database) - expansion_status = self.get_expansion_status_of_node_element( - self.find_by_xpath_list( - TreeAreaLocators. - sub_nodes_of_databases_node_exp_status( - server_name))[ - index_of_required_db_node]) - if not expansion_status: - db_node_expanded_status = self.click_to_expand_database_node( - sub_nodes_of_databases_node, index_of_required_db_node, - name_of_database) - else: - db_node_expanded_status = True + child_node_ele = self.check_if_element_exists_with_scroll( + server_child_node_xpath) + server_child_expanded = self.click_to_expand_tree_node( + child_node_ele, server_child_node_exp_status_xpath) + if not server_child_expanded: + print("Child not is not expanded after clickng ", + file=sys.stderr) else: - print("The databases/previous nodes not expanded", - file=sys.stderr) - return db_node_expanded_status - - def toggle_open_schemas_node(self, server_name, server_password, - name_of_database): - """will expand schemas node under a db node""" - expansion_status = False - if self.expand_database_node(server_name, server_password, - name_of_database): - sub_nodes_db_node = self.find_by_xpath_list( - TreeAreaLocators.sub_nodes_of_database_node( - name_of_database)) - index_of_schemas_node = self.get_index_of_element( - sub_nodes_db_node, "Schemas") - expansion_status = self.get_expansion_status_of_node_element( - self.find_by_xpath_list( - TreeAreaLocators.sub_nodes_of_database_node_exp_status( - name_of_database))[ - index_of_schemas_node]) - if not expansion_status: + print("The server/previous nodes not expanded", file=sys.stderr) + return server_child_expanded + + def expand_database_node(self, server_group_name, server_name, + server_password, database_name): + """ + will expand database node under databases node" + :param server_group_name: + :param server_name: + :param server_password: + :param database_name: + :return: + """ + database_expanded = False + database_node_xpath = TreeAreaLocators.database_node(database_name) + database_node_exp_xpath = \ + TreeAreaLocators.database_node_exp_status(database_name) + + if self.expand_databases_node( + server_group_name, server_name, server_password): + database_node = \ + self.check_if_element_exists_with_scroll(database_node_xpath) + if database_node: self.driver.execute_script( - self.js_executor_scrollintoview_arg, - sub_nodes_db_node[index_of_schemas_node]) - webdriver.ActionChains(self.driver).double_click( - sub_nodes_db_node[index_of_schemas_node]).perform() - if self.wait_for_elements_to_appear( - self.driver, TreeAreaLocators. - sub_nodes_of_schemas_node(name_of_database)): - expansion_status = True + self.js_executor_scrollintoview_arg, database_node) + if self.check_if_element_exist_by_xpath( + database_node_exp_xpath, 1): + database_expanded = True + else: + database_expanded = self.click_to_expand_tree_node( + database_node, database_node_exp_xpath) else: - expansion_status = True + print("Database node not found - ", file=sys.stderr) else: - print( - "(expand_schemas_node) database/previous nodes " - "are not expanded", - file=sys.stderr) - return expansion_status - - def toggle_open_schema_node( - self, server_name, server_password, - name_of_database, name_of_schema_node): - """will expand schema node under schemas node""" - expansion_status = False - if self.toggle_open_schemas_node( - server_name, server_password, name_of_database): - sub_nodes_schemas_node = self.find_by_xpath_list( - TreeAreaLocators.sub_nodes_of_schemas_node( - name_of_database)) - index_of_schema_node = self.get_index_of_element( - sub_nodes_schemas_node, - name_of_schema_node) - expansion_status = self.get_expansion_status_of_node_element( - self.find_by_xpath_list( - TreeAreaLocators.sub_nodes_of_schemas_node_exp_status( - name_of_database))[ - index_of_schema_node]) - if not expansion_status: + print("The databases/previous nodes not expanded", file=sys.stderr) + return database_expanded + + # TODO - We might need this method + # def click_to_expand_database_node(self, database_name, database_node): + # """ + # Method clicks on specified database name from expanded databases node + # of server. + # :param sub_nodes_of_databases_node: + # :param index_of_required_db_node: + # :param name_of_database: + # :return: True if particular database click is successful & expanded + # """ + # database_expanded = False + # if self.check_if_element_exist_by_xpath( + # TreeAreaLocators.database_node_exp_status(database_name), 2): + # database_expanded = True + # else: + # # TODO - This is bug 6962 + # webdriver.ActionChains(self.driver).click(database_node).perform() + # if self.check_if_element_exist_by_xpath( + # TreeAreaLocators.database_node_exp_status(database_name)): + # database_expanded = True + # print("click_to_expand_database_node> db_node_expanded_status - ", + # database_expanded) + # return database_expanded + # + + def expand_database_child_node(self, server_group_name, server_name, + server_password, database_name, + database_child_node_name): + """ + Method expands specified database's child + :param server_group_name: + :param server_name: + :param server_password: + :param database_name: + :param database_child_node_name: + :return: + """ + database_child_expanded = False + database_child_node_xpath = \ + TreeAreaLocators.database_child_node( + database_name, database_child_node_name) + database_child_node_exp_status_xpath = \ + TreeAreaLocators.database_child_node_exp_status( + database_name, database_child_node_name) + + if self.expand_database_node(server_group_name, server_name, + server_password, database_name): + child_node_ele = self.check_if_element_exists_with_scroll( + database_child_node_xpath) + if child_node_ele: + if self.check_if_element_exist_by_xpath( + database_child_node_exp_status_xpath, 1): + database_child_expanded = True + else: + database_child_expanded = self.click_to_expand_tree_node( + child_node_ele, database_child_node_exp_status_xpath) + else: + print("Node not found - ", database_child_node_name, + file=sys.stderr) + else: + print("The database/previous nodes not expanded", file=sys.stderr) + return database_child_expanded + + def expand_schemas_node(self, server_group_name, server_name, + server_password, database_name): + """ + Method expands Schemas node under specified server & database + :param server_group_name: + :param server_name: + :param server_password: + :param database_name: + :return: + """ + return self.expand_database_child_node(server_group_name, server_name, + server_password, database_name, + "Schemas") + + def expand_schema_node(self, server_group_name, server_name, + server_password, database_name, schema_name): + """ + Method expands schema node + :param server_group_name: + :param server_name: + :param server_password: + :param database_name: + :param schema_name: + :return: + """ + schema_expanded = False + schema_node_xpath = TreeAreaLocators.schema_node(schema_name) + schema_node_exp_xpath = TreeAreaLocators.schema_node_exp_status( + schema_name) + + if self.expand_schemas_node(server_group_name, server_name, + server_password, database_name): + schema_node = self.check_if_element_exists_with_scroll( + schema_node_xpath) + if schema_node: self.driver.execute_script( - self.js_executor_scrollintoview_arg, - sub_nodes_schemas_node[index_of_schema_node]) - webdriver.ActionChains(self.driver).double_click( - sub_nodes_schemas_node[index_of_schema_node]).perform() - if self.wait_for_elements_to_appear( - self.driver, TreeAreaLocators. - sub_nodes_of_schema_node(name_of_database)): - expansion_status = True + self.js_executor_scrollintoview_arg, schema_node) + if self.check_if_element_exist_by_xpath( + schema_node_exp_xpath, 1): + schema_expanded = True + else: + schema_expanded = self.click_to_expand_tree_node( + schema_node, schema_node_exp_xpath) else: - expansion_status = True + print("Schema node not found - ", file=sys.stderr) else: - print( - "(expand_schema_node) schema/previous nodes are" - " not expanded", - file=sys.stderr) - return expansion_status - - def toggle_open_tables_node( - self, server_name, server_password, - name_of_database, name_of_schema_node): - """will expand tables node under schema node""" - node_expanded_successfully = False - if self.toggle_open_schema_node( - server_name, server_password, name_of_database, - name_of_schema_node): - sub_nodes_of_schema_node = self.find_by_xpath_list( - TreeAreaLocators.sub_nodes_of_schema_node( - name_of_database)) - sub_nodes_of_schema_node_exp_status = self.find_by_xpath_list( - TreeAreaLocators.sub_nodes_of_schema_node_exp_status( - name_of_database)) - index_of_tables_node = self.get_index_of_element( - sub_nodes_of_schema_node, "Tables") - expansion_status = self.get_expansion_status_of_node_element( - sub_nodes_of_schema_node_exp_status[index_of_tables_node]) - if not expansion_status: - self.driver.execute_script(self.js_executor_scrollintoview_arg, - sub_nodes_of_schema_node[ - index_of_tables_node]) - webdriver.ActionChains(self.driver).double_click( - sub_nodes_of_schema_node[ - index_of_tables_node]).perform() - if self.wait_for_elements_to_appear( - self.driver, TreeAreaLocators. - sub_nodes_of_tables_node): - node_expanded_successfully = True + print("The schemas/previous nodes not expanded", file=sys.stderr) + return schema_expanded + + def expand_tables_node(self, server_group, server_name, server_password, + database_name, schema_name): + """ + Method expands tables nodes under schema + :param server_group: + :param server_name: + :param server_password: + :param database_name: + :param schema_name: + :return: + """ + return self.expand_schema_child_node(server_group, server_name, + server_password, database_name, + schema_name, "Tables") + + def expand_schema_child_node(self, server_group_name, server_name, + server_password, database_name, schema_name, + schema_child_node_name): + """ + Expands specified child node of schema + :param server_group_name: + :param server_name: + :param server_password: + :param database_name: + :param schema_name: + :param schema_child_node_name: + :return: + """ + schema_child_expanded = False + schema_child_node_xpath = TreeAreaLocators. \ + schema_child_node(schema_name, schema_child_node_name) + schema_child_node_exp_status_check_xpath = TreeAreaLocators. \ + schema_child_node_exp_status(schema_name, schema_child_node_name) + + if self.expand_schema_node(server_group_name, server_name, + server_password, database_name, + schema_name): + child_node_ele = self.check_if_element_exists_with_scroll( + schema_child_node_xpath) + if child_node_ele: + if self.check_if_element_exist_by_xpath( + schema_child_node_exp_status_check_xpath, 1): + schema_child_expanded = True + else: + schema_child_expanded = self.click_to_expand_tree_node( + child_node_ele, + schema_child_node_exp_status_check_xpath) else: - node_expanded_successfully = True + print("%s node not found - ", schema_child_node_name, + file=sys.stderr) else: - print( - "(expand_tables_node) schema/previous nodes " - "are not expanded", - file=sys.stderr) - return node_expanded_successfully + print("The schema/previous nodes not expanded", file=sys.stderr) + return schema_child_expanded + # TODO Not used any where to be removed def toggle_open_function_node(self): """The function will be used for opening Functions node only""" node_expanded = False @@ -749,76 +847,7 @@ class PgadminPage: else: node_expanded = True - def check_server_is_connected(self, index_of_server): - """This will check connected status of a server, as connection - status is contained either in span or div element so checking it""" - server_connected = False - try: - connection_status_elements = self.find_by_xpath_list( - TreeAreaLocators.server_group_sub_nodes_connected_status) - span_elements = connection_status_elements[ - index_of_server].find_elements_by_tag_name("span") - div_elements = connection_status_elements[ - index_of_server].find_elements_by_tag_name("div") - - span_value_of_class_att = "" - div_value_of_class_att = "" - - if len(span_elements) > 0: - span_value_of_class_att = \ - span_elements[0].get_attribute('class') - if len(div_elements) > 0: - div_value_of_class_att = \ - div_elements[0].get_attribute('class') - if (("aciTreeIcon icon-pg" in span_value_of_class_att or - "aciTreeIcon icon-pg" in div_value_of_class_att or - "aciTreeIcon icon-ppas" in - span_value_of_class_att or - "aciTreeIcon icon-ppas" in div_value_of_class_att) and - ("aciTreeIcon icon-server-not-connected" not in - span_value_of_class_att or - "aciTreeIcon icon-server-not-connected" not in - div_value_of_class_att)): - server_connected = True - except Exception as e: - print("There is some exception thrown in the function " - "check_server_is_connected and is: " + str(e), - file=sys.stderr) - return server_connected - - def click_and_connect_server(self, server_element, password): - """will connect a server node, will provide the password in the - respective window""" - server_connection_status = False - try: - webdriver.ActionChains(self.driver).double_click( - server_element).perform() - if self.check_if_element_exist_by_xpath( - ConnectToServerDiv.ok_button): - field = self.find_by_xpath( - ConnectToServerDiv.password_field) - self.fill_input(field, password) - self.find_by_xpath(ConnectToServerDiv.ok_button).click() - self.wait_for_element_to_disappear( - lambda driver: driver.find_element_by_xpath( - ConnectToServerDiv.ok_button)) - if self.check_if_element_exist_by_xpath( - ConnectToServerDiv.error_message, 2): - print( - "While entering password in click_and_connect_server " - "function, error is occurred : " + str( - self.find_by_xpath( - ConnectToServerDiv.error_message).text), - file=sys.stderr) - else: - server_connection_status = True - except Exception as e: - print( - "There is some exception thrown click_and_connect_server " - "and is: " + str( - e), file=sys.stderr) - return server_connection_status - + # TODO Not used any where to be removed def get_expansion_status_of_node(self, xpath_node): """get the expansion status for a node through xpath""" node_is_expanded = False @@ -827,6 +856,7 @@ class PgadminPage: node_is_expanded = True return node_is_expanded + # TODO Not used any where to be removed def get_expansion_status_of_node_element(self, element): """get the expansion status for an element""" node_is_expanded = False @@ -840,6 +870,7 @@ class PgadminPage: e), file=sys.stderr) return node_is_expanded + # TODO Not used any where to be removed def toggle_open_tree_item(self, tree_item_text): # 'sleep' here helps in cases where underlying nodes are auto opened. # Otherwise, encountered situations where False value is returned @@ -868,6 +899,7 @@ class PgadminPage: except TimeoutException: retry -= 1 + # TODO Not used any where to be removed def toggle_open_server(self, tree_item_text): def check_for_password_dialog_or_tree_open(driver): try: @@ -896,17 +928,17 @@ class PgadminPage: def find_by_xpath(self, xpath): return self.wait_for_element( - lambda driver: driver.find_element_by_xpath(xpath) + lambda driver: driver.find_element(By.XPATH, xpath) ) def find_by_id(self, element_id): return self.wait_for_element( - lambda driver: driver.find_element_by_id(element_id) + lambda driver: driver.find_element(By.ID, element_id) ) def find_by_css_selector(self, css_selector): return self.wait_for_element( - lambda driver: driver.find_element_by_css_selector(css_selector) + lambda driver: driver.find_element(By.CSS_SELECTOR, css_selector) ) def find_by_partial_link_text(self, link_text): @@ -1005,7 +1037,7 @@ class PgadminPage: def find_codemirror(driver): try: driver.switch_to.default_content() - driver.switch_to_frame( + driver.switch_to.frame( driver.find_element_by_tag_name("iframe")) element = driver.find_element_by_css_selector( "#output-panel .CodeMirror") @@ -1013,6 +1045,7 @@ class PgadminPage: return element except (NoSuchElementException, WebDriverException): return False + time.sleep(1) self.wait_for_query_tool_loading_indicator_to_disappear(12) @@ -1133,7 +1166,7 @@ class PgadminPage: def wait_for_spinner_to_disappear(self): def spinner_has_disappeared(driver): try: - driver.find_element_by_id("pg-spinner") + driver.find_element(By.ID, "pg-spinner") return False except NoSuchElementException: return True @@ -1145,9 +1178,9 @@ class PgadminPage: try: # Refer the status message as spinner appears only on the # the data output panel - spinner = driver.find_element_by_css_selector( - ".sql-editor .sql-editor-busy-text-status" - ) + spinner = driver.find_element( + By.CSS_SELECTOR, + ".sql-editor .sql-editor-busy-text-status") return "d-none" in spinner.get_attribute("class") except NoSuchElementException: # wait for loading indicator disappear animation to complete. @@ -1195,8 +1228,8 @@ class PgadminPage: def element_if_it_exists(driver): try: element = find_method_with_args(driver) - if len(element) > 0 and element[0].is_displayed() and element[ - 0].is_enabled(): + if len(element) > 0 and element[0].is_displayed() and \ + element[0].is_enabled(): return element except NoSuchElementException: return False @@ -1209,18 +1242,66 @@ class PgadminPage: elements_located_status = False try: if WebDriverWait(driver, time_value).until( - EC.visibility_of_any_elements_located(( - By.XPATH, locator))): + EC.visibility_of_any_elements_located(( + By.XPATH, locator))): elements_located_status = True except Exception: pass return elements_located_status + def check_if_element_exists_with_scroll(self, xpath): + f_scroll, r_scroll = 111, 111 + while f_scroll > 0 or r_scroll > 0: + try: + ele = WebDriverWait(self.driver, 1, 0.01).until( + lambda d: d.find_element(By.XPATH, xpath)) + f_scroll, r_scroll = 0, 0 + return ele + except (TimeoutException, NoSuchElementException) as e: + tree_height = int((self.driver.find_element( + By.XPATH, "//div[@class='file-tree']/div[1]/div/div"). + value_of_css_property('height')).split("px")[0]) + + if f_scroll == 111 and r_scroll == 111: + window_size = int(self.driver.get_window_size()["height"]) + f_scroll = r_scroll = (tree_height / window_size + 1) + + if f_scroll > 0: + bottom_ele = self.driver.find_element( + By.XPATH, + "//div[@id='tree']/div/div/div/div/div[last()]") + bottom_ele_location = int( + bottom_ele.value_of_css_property('top').split("px")[0]) + + if tree_height - bottom_ele_location < 25: + f_scroll = 0 + else: + self.driver.execute_script( + self.js_executor_scrollintoview_arg, bottom_ele) + f_scroll -= 1 + elif r_scroll > 0: + top_el = self.driver.find_element( + By.XPATH, + "//div[@id='tree']/div/div/div/div/div[1]") + top_el_location = int( + top_el.value_of_css_property('top').split("px")[0]) + + if (tree_height - top_el_location) == tree_height: + r_scroll = 0 + else: + webdriver.ActionChains(self.driver).move_to_element( + top_el).perform() + r_scroll -= 1 + else: + print("check_if_element_exists_with_scroll > Element NOT found") + return False + def find_by_xpath_list(self, xpath): """This will find out list of elements through a single xpath""" return self.wait_for_elements( - lambda driver: driver.find_elements_by_xpath(xpath)) + lambda driver: driver.find_elements(By.XPATH, xpath)) + # TODO Not used any where to be removed def get_index_of_element(self, element_list, target_string): """it will return index of an element from provided element list""" index_of_required_server = -1 diff --git a/web/regression/feature_utils/tree_area_locators.py b/web/regression/feature_utils/tree_area_locators.py index d6968e77b..f0e8f0b39 100644 --- a/web/regression/feature_utils/tree_area_locators.py +++ b/web/regression/feature_utils/tree_area_locators.py @@ -11,126 +11,260 @@ class TreeAreaLocators(): """This will contains element locators for tree area, will also contain parametrized xpath where applicable""" - server_group_node = \ - "//div[@id='tree']//span[@class='aciTreeItem']" \ - "/span[(@class='aciTreeText') and starts-with(text(),'Servers ') or " \ - "starts-with(text(), 'Servers')]" + # Server Group Node + @staticmethod + def server_group_node(server_group_name): + return "//span[starts-with(text(),'%s')]" % server_group_name - server_group_node_exp_status = "//div[div[span[span[" \ - "(@class='aciTreeText') and " \ - "(text()='Servers ' or " \ - "text()='Servers')]]]]" + @staticmethod + def server_group_node_exp_status(server_group_name): + return "//i[@class='directory-toggle open']/following-sibling::" \ + "span//span[starts-with(text(),'%s')]" % server_group_name - server_group_sub_nodes = \ - "//div[div[span[span[contains(text(),'Servers')]]]]/" \ - "following-sibling::ul/li/div/div/div/span[2]/" \ - "span[@class='aciTreeText']" + # Server Node + @staticmethod + def server_node(server_name): + return "//div[@id='tree']//span[starts-with(text(),'%s')]" \ + % server_name - server_group_sub_nodes_exp_status = \ - "//div[div[span[span[contains(text(),'Servers')]]]]" \ - "/following-sibling::ul/li/div" + @staticmethod + def server_node_exp_status(server_name): + return "//i[@class='directory-toggle open']/following-sibling::" \ + "span//span[starts-with(text(),'%s')]" % server_name - server_group_sub_nodes_connected_status = \ - "//div[div[span[span[contains(text(), 'Servers')]]]]/" \ - "following-sibling::ul/li/div/div/div/span[2]" + # Server Connection + @staticmethod + def server_connection_status_element(server_name): + return "//div[@id='tree']//span[starts-with(text(),'%s')]/" \ + "preceding-sibling::i" % server_name - specified_tree_node = \ - "//div[@id='tree']//span[@class='aciTreeItem']/" \ - "span[(@class='aciTreeText') and text()='{}']" + # Databases Node + @staticmethod + def databases_node(server_name): + return "//div[div[span[span[starts-with(text(),'%s')]]]]/" \ + "following-sibling::div//span[text()='Databases']" % server_name - specified_tree_node_exp_status = \ - "//div[@id='tree']//span[@class='aciTreeItem']/" \ - "span[(@class='aciTreeText') and text()='{}']" \ - "//ancestor::*[@class='aciTreeLine']" + @staticmethod + def databases_node_exp_status(server_name): + return "//div[div[span[span[starts-with(text(),'%s')]]]]/" \ + "following-sibling::div//span[span[text()='Databases']]/" \ + "preceding-sibling::i[@class='directory-toggle open']" \ + % server_name - sub_nodes_of_tables_node = \ - "//div[div[div[div[div[div[div[div[span[span[" \ - "contains(text(),'Tables')]]]]]]]]]]/" \ - "following-sibling::ul/li/div//div/span[2]/span[2]" + # Database Node + @staticmethod + def database_node(database_name): + return "//div[@data-depth='4']/span/span[text()='%s']" % database_name - 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 database_node_exp_status(database_name): + return "//i[@class='directory-toggle open']/following-sibling::" \ + "span//span[text()='%s']" % database_name - sub_nodes_of_login_group_node = \ - "//div[div[div[span[span[contains(text(),'Login/Group Roles')]]]]]" \ - "/following::ul/li/div[@class='aciTreeLine']" + # Schemas Node + @staticmethod + def schemas_node(database_name): + return "//div[div[span[span[starts-with(text(),'%s')]]]]/" \ + "following-sibling::div//span[text()='Schemas']" % database_name @staticmethod - def sub_nodes_of_a_server_node(server_name): - xpath = "//div[div[div[span[span[contains(text(),'%s')]]]]]/" \ - "following-sibling::ul/li/div[@class='aciTreeLine']" % \ - server_name - return xpath + def schemas_node_exp_status(database_name): + return "//div[div[span[span[starts-with(text(),'%s')]]]]/" \ + "following-sibling::div//span[span[text()='Schemas']]/" \ + "preceding-sibling::i[@class='directory-toggle open']" \ + % database_name + # Schema Node @staticmethod - def sub_nodes_of_a_server_node_exp_status(server_name): - xpath = "//div[div[div[span[span[contains(text(),'%s')]]]]]/" \ - "following-sibling::ul/li/div" % server_name - return xpath + def schema_node(schema_name): + return "//div[@id='tree']//span[text()='%s']" % schema_name @staticmethod - def databases_node_of_a_server_node(server_name): - xpath = "//div[div[div[span[span[contains(text(),'%s')]]]]]/" \ - "following-sibling::ul/li/div/div/div/div/span[2]/span[2 " \ - "and text()='Databases ']" % server_name - return xpath + def schema_node_exp_status(schema_name): + return "//i[@class='directory-toggle open']/" \ + "following-sibling::span//span[text()='%s']" % schema_name + # Tables Node @staticmethod - def sub_nodes_of_databases_node(server_name): - xpath = "//div[div[div[span[span[contains(text(),'%s')]]]]]/" \ - "following-sibling::ul/li[1]/div/following-sibling::ul/li/" \ - "div/div/div/div/div/span[2]/span[@class='aciTreeText']" % \ - server_name - return xpath + def tables_node(schema_name): + return "//div[div[span[span[starts-with(text(),'%s')]]]]/" \ + "following-sibling::div//span[text()='Tables']" % schema_name @staticmethod - def sub_nodes_of_databases_node_exp_status(server_name): - xpath = "//div[div[div[span[span[contains(text(), '%s')]]]]]/" \ - "following-sibling::ul/li[1]/div/following-sibling::ul/li/" \ - "div" % server_name - return xpath + def tables_node_exp_status(schema_name): + return "//div[div[span[span[starts-with(text(),'%s')]]]]/" \ + "following-sibling::div//span[span[text()='Tables']]/" \ + "preceding-sibling::i[@class='directory-toggle open']"\ + % schema_name + # Schema child @staticmethod - def sub_nodes_of_database_node(database_name): - xpath = "//div[div[div[div[div[span[span[contains(text()," \ - "'%s')]]]]]]]/following-sibling::ul/li/div/div/div/div/div/" \ - "div/span[2]/span[2]" % database_name - return xpath + def schema_child_node_exp_status(schema_name, child_node_name): + return "//div[div[span[span[starts-with(text(),'%s')]]]]/" \ + "following-sibling::div//span[span[text()='%s']]/" \ + "preceding-sibling::i[@class='directory-toggle open']" \ + % (schema_name, child_node_name) @staticmethod - def sub_nodes_of_database_node_exp_status(database_name): - xpath = "//div[div[div[div[div[span[span[contains(text(), " \ - "'%s')]]]]]]]/following-sibling::ul/li/div" % database_name - return xpath + def schema_child_node(schema_name, child_node_name): + return "//div[div[span[span[starts-with(text(),'%s')]]]]/" \ + "following-sibling::div//span[text()='%s']" \ + % (schema_name, child_node_name) + # Database child @staticmethod - def sub_nodes_of_schemas_node(database_name): - xpath = "//div[div[div[div[div[span[span[text()='%s']]]]]]]/" \ - "following-sibling::ul/li[" \ - "@role='presentation']/ul/li/div//div/span/span[" \ - "@class='aciTreeText']" % database_name - return xpath + def database_child_node_exp_status(database_name, child_node_name): + return "//div[div[span[span[starts-with(text(),'%s')]]]]/" \ + "following-sibling::div//span[span[text()='%s']]/" \ + "preceding-sibling::i[@class='directory-toggle open']"\ + % (database_name, child_node_name) @staticmethod - def sub_nodes_of_schemas_node_exp_status(database_name): - xpath = "//div[div[div[div[div[span[span[text()='%s']]]]]]]/" \ - "following-sibling::ul/li[@role='presentation']/ul/li/div" \ - % database_name - return xpath + def database_child_node(database_name, child_node_name): + return "//div[div[span[span[starts-with(text(),'%s')]]]]/" \ + "following-sibling::div//span[text()='%s']" \ + % (database_name, child_node_name) + # Server child @staticmethod - def sub_nodes_of_schema_node(database_name): - xpath = "//div[div[div[div[div[span[span[text()='%s']]]]]]]/" \ - "following-sibling::ul/li[" \ - "@role='presentation']/ul/li/ul/li/div//div/span[2]/span[2]" \ - % database_name - return xpath + def server_child_node_exp_status(server_name, child_node_name): + return "//div[div[span[span[starts-with(text(),'%s')]]]]/" \ + "following-sibling::div//span[span[text()='%s']]/" \ + "preceding-sibling::i[@class='directory-toggle open']"\ + % (server_name, child_node_name) @staticmethod - def sub_nodes_of_schema_node_exp_status(database_name): - xpath = "//div[div[div[div[div[span[span[text()='%s']]]]]]]/" \ - "following-sibling::ul/li[@role='presentation']" \ - "/ul/li/ul/li/div" % database_name - return xpath + def server_child_node(server_name, child_node_name): + return "//div[div[span[span[starts-with(text(),'%s')]]]]/" \ + "following-sibling::div//span[text()='%s']" \ + % (server_name, child_node_name) + + # Table Node + @staticmethod + def table_node(table_name): + return "//div[@data-depth='8']/span/span[text()='%s']" % table_name + + # Function Node + @staticmethod + def function_node(table_name): + return "//div[@data-depth='8']/span/span[text()='%s']" % table_name + + # Role Node + @staticmethod + def role_node(role_name): + return "//div[@data-depth='4']/span/span[text()='%s']" % role_name + + # Context element option + @staticmethod + def context_menu_element(schema_name): + return "//li/span[text()='%s']" % schema_name + + # Old xpaths + # server_group_sub_nodes_exp_status = \ + # "//div[div[span[span[contains(text(),'Servers')]]]]" \ + # "/following-sibling::ul/li/div" + # + # server_group_sub_nodes_connected_status = \ + # "//div[div[span[span[contains(text(), 'Servers')]]]]/" \ + # "following-sibling::ul/li/div/div/div/span[2]" + # + # specified_tree_node = \ + # "//div[@id='tree']//span[@class='aciTreeItem']/" \ + # "span[(@class='aciTreeText') and text()='{}']" + # + # specified_tree_node_exp_status = \ + # "//div[@id='tree']//span[@class='aciTreeItem']/" \ + # "span[(@class='aciTreeText') and text()='{}']" \ + # "//ancestor::*[@class='aciTreeLine']" + # + # sub_nodes_of_tables_node = \ + # "//div[div[div[div[div[div[div[div[span[span[" \ + # "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]" + # + # sub_nodes_of_login_group_node = \ + # "//div[div[div[span[span[contains(text(),'Login/Group Roles')]]]]]" \ + # "/following::ul/li/div[@class='aciTreeLine']" + # + # @staticmethod + # def sub_nodes_of_a_server_node(server_name): + # xpath = "//div[div[div[span[span[contains(text(),'%s')]]]]]/" \ + # "following-sibling::ul/li/div[@class='aciTreeLine']" % \ + # server_name + # return xpath + # + # @staticmethod + # def sub_nodes_of_a_server_node_exp_status(server_name): + # xpath = "//div[div[div[span[span[contains(text(),'%s')]]]]]/" \ + # "following-sibling::ul/li/div" % server_name + # return xpath + # + # @staticmethod + # def databases_node_of_a_server_node(server_name): + # xpath = "//div[div[div[span[span[contains(text(),'%s')]]]]]/" \ + # "following-sibling::ul/li/div/div/div/div/span[2]/span[2 " \ + # "and text()='Databases ']" % server_name + # return xpath + # + # @staticmethod + # def sub_nodes_of_databases_node(server_name): + # xpath = "//div[div[div[span[span[contains(text(),'%s')]]]]]/" \ + # "following-sibling::ul/li[1]/div/following-sibling::ul/li/" \ + # "div/div/div/div/div/span[2]/span[@class='aciTreeText']" % \ + # server_name + # return xpath + # + # @staticmethod + # def sub_nodes_of_databases_node_exp_status(server_name): + # xpath = "//div[div[div[span[span[contains(text(), '%s')]]]]]/" \ + # "following-sibling::ul/li[1]/div/following-sibling::ul/li/" \ + # "div" % server_name + # return xpath + # + # @staticmethod + # def sub_nodes_of_database_node(database_name): + # xpath = "//div[div[div[div[div[span[span[contains(text()," \ + # "'%s')]]]]]]]/following-sibling::" \ + # "ul/li/div/div/div/div/div/div/span[2]/span[2]"\ + # % database_name + # return xpath + # + # @staticmethod + # def sub_nodes_of_database_node_exp_status(database_name): + # xpath = "//div[div[div[div[div[span[span[contains(text(), " \ + # "'%s')]]]]]]]/following-sibling::ul/li/div" % database_name + # return xpath + # + # @staticmethod + # def sub_nodes_of_schemas_node(database_name): + # xpath = "//div[div[div[div[div[span[span[text()='%s']]]]]]]/" \ + # "following-sibling::ul/li[" \ + # "@role='presentation']/ul/li/div//div/span/span[" \ + # "@class='aciTreeText']" % database_name + # return xpath + # + # @staticmethod + # def sub_nodes_of_schemas_node_exp_status(database_name): + # xpath = "//div[div[div[div[div[span[span[text()='%s']]]]]]]/" \ + # "following-sibling::ul/li[@role='presentation']/ul/li/div" \ + # % database_name + # return xpath + # + # @staticmethod + # def sub_nodes_of_schema_node(database_name): + # xpath = "//div[div[div[div[div[span[span[text()='%s']]]]]]]/" \ + # "following-sibling::ul/li[@role='presentation']" \ + # "/ul/li/ul/li/div//div/span[2]/span[2]" % database_name + # return xpath + # + # @staticmethod + # def sub_nodes_of_schema_node_exp_status(database_name): + # xpath = "//div[div[div[div[div[span[span[text()='%s']]]]]]]/" \ + # "following-sibling::ul/li[@role='presentation']" \ + # "/ul/li/ul/li/div" % database_name + # return xpath diff --git a/web/regression/python_test_utils/test_utils.py b/web/regression/python_test_utils/test_utils.py index 85963296f..10397e122 100644 --- a/web/regression/python_test_utils/test_utils.py +++ b/web/regression/python_test_utils/test_utils.py @@ -422,6 +422,32 @@ def does_function_exist(server, db_name, fun_name): return str(result[0][0]) +def grant_role(server, db_name, role_name="test_role", + grant_role="<h1>test</h1>"): + try: + connection = get_db_connection( + db_name, + server['username'], + server['db_password'], + server['host'], + server['port'], + server['sslmode'] + ) + old_isolation_level = connection.isolation_level + connection.set_isolation_level(0) + pg_cursor = connection.cursor() + sql_query = '''GRANT "%s" TO %s;''' % (grant_role, role_name) + + pg_cursor.execute( + sql_query + ) + connection.set_isolation_level(old_isolation_level) + connection.commit() + + except Exception: + traceback.print_exc(file=sys.stderr) + + def create_role(server, db_name, role_name="test_role"): try: connection = get_db_connection( diff --git a/web/regression/requirements.txt b/web/regression/requirements.txt index 4a14802c1..0a5ba0f36 100644 --- a/web/regression/requirements.txt +++ b/web/regression/requirements.txt @@ -25,5 +25,5 @@ python-mimeparse==1.6.0 testscenarios==0.5.0 testtools==2.3.0 traceback2==1.4.0 -selenium==3.14.0 +selenium==4.0.0 coverage==5.0.1 diff --git a/web/regression/runtests.py b/web/regression/runtests.py index 7503f7c63..7bc2ca4d5 100644 --- a/web/regression/runtests.py +++ b/web/regression/runtests.py @@ -295,9 +295,9 @@ def setup_webdriver_specification(arguments): options.add_argument("--headless") options.add_argument("--no-sandbox") options.add_argument("--disable-setuid-sandbox") - options.add_argument("--window-size=1280,1024") + options.add_argument("--window-size=1790,1080") options.add_argument("--disable-infobars") - options.add_experimental_option('w3c', False) + # options.add_experimental_option('w3c', False) driver_local = webdriver.Chrome(chrome_options=options) # maximize browser window ^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Feature Test Fix - React porting @ 2021-11-10 06:29 Akshay Joshi <[email protected]> parent: Yogesh Mahajan <[email protected]> 0 siblings, 1 reply; 12+ messages in thread From: Akshay Joshi @ 2021-11-10 06:29 UTC (permalink / raw) To: Yogesh Mahajan <[email protected]>; +Cc: pgadmin-hackers Thanks, the patch applied. but Jenkins is failing with the below error: ERROR: No matching distribution found for selenium==4.0.0 ERROR: Failed to install Python requirements. On Tue, Nov 9, 2021 at 2:48 PM Yogesh Mahajan < [email protected]> wrote: > Hi, > > Please find the attached patch which fixes feature tests broken due to > react porting changes. > > Thanks, > Yogesh Mahajan > EnterpriseDB > -- *Thanks & Regards* *Akshay Joshi* *pgAdmin Hacker | Principal Software Architect* *EDB Postgres <http://edbpostgres.com>* *Mobile: +91 976-788-8246* ^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Feature Test Fix - React porting @ 2021-11-11 16:33 Yogesh Mahajan <[email protected]> parent: Akshay Joshi <[email protected]> 0 siblings, 1 reply; 12+ messages in thread From: Yogesh Mahajan @ 2021-11-11 16:33 UTC (permalink / raw) To: pgadmin-hackers; Akshay Joshi <[email protected]> Hi, Please find the attached patch which uses selenium 4.0.0a6 which works with python 3.6.8. Selenium 4.0.0 requires python 3.7+ Thanks, Yogesh Mahajan EnterpriseDB On Wed, Nov 10, 2021 at 11:59 AM Akshay Joshi <[email protected]> wrote: > Thanks, the patch applied. but Jenkins is failing with the below error: > ERROR: No matching distribution found for selenium==4.0.0 > ERROR: Failed to install Python requirements. > > On Tue, Nov 9, 2021 at 2:48 PM Yogesh Mahajan < > [email protected]> wrote: > >> Hi, >> >> Please find the attached patch which fixes feature tests broken due to >> react porting changes. >> >> Thanks, >> Yogesh Mahajan >> EnterpriseDB >> > > > -- > *Thanks & Regards* > *Akshay Joshi* > *pgAdmin Hacker | Principal Software Architect* > *EDB Postgres <http://edbpostgres.com>* > > *Mobile: +91 976-788-8246* > Attachments: [application/octet-stream] Feature_Test_Fix_React_Porting_v2.patch (15.3K, 3-Feature_Test_Fix_React_Porting_v2.patch) download | inline diff: diff --git a/web/pgadmin/feature_tests/copy_selected_query_results_feature_test.py b/web/pgadmin/feature_tests/copy_selected_query_results_feature_test.py index 619b9af3a..33003a06d 100644 --- a/web/pgadmin/feature_tests/copy_selected_query_results_feature_test.py +++ b/web/pgadmin/feature_tests/copy_selected_query_results_feature_test.py @@ -12,6 +12,7 @@ import time from selenium.webdriver import ActionChains from selenium.webdriver.common.keys import Keys +from selenium.webdriver.common.by import By from regression.python_test_utils import test_utils from regression.feature_utils.base_feature_test import BaseFeatureTest from regression.feature_utils.locators import QueryToolLocators @@ -62,7 +63,7 @@ class CopySelectedQueryResultsFeatureTest(BaseFeatureTest): def paste_values_to_scratch_pad(self): self.page.driver.switch_to.default_content() self.page.driver.switch_to.frame( - self.page.driver.find_element_by_tag_name("iframe")) + self.page.driver.find_element(By.TAG_NAME, "iframe")) scratch_pad_ele = self.page.find_by_css_selector( QueryToolLocators.scratch_pad_css) self.page.paste_values(scratch_pad_ele) diff --git a/web/pgadmin/feature_tests/pg_datatype_validation_test.py b/web/pgadmin/feature_tests/pg_datatype_validation_test.py index cbc43a1e0..1f792a993 100644 --- a/web/pgadmin/feature_tests/pg_datatype_validation_test.py +++ b/web/pgadmin/feature_tests/pg_datatype_validation_test.py @@ -137,7 +137,7 @@ class PGDataypeFeatureTest(BaseFeatureTest): self.page.click_modal('Save') self.page.wait_for_element_to_disappear( - lambda driver: driver.find_element_by_css_selector(".ajs-modal") + lambda driver: driver.find_element(By.CSS_SELECTOR, ".ajs-modal") ) time.sleep(0.5) @@ -200,8 +200,8 @@ class PGDataypeFeatureTest(BaseFeatureTest): # For every sample data-type value, check the expected output. cnt = 2 - cells = canvas.find_elements_by_css_selector( - QueryToolLocators.query_output_cells) + cells = canvas.find_elements( + By.CSS_SELECTOR, QueryToolLocators.query_output_cells) # remove first element as it is row number. cells.pop(0) for val, cell, datatype in zip( 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 9a8650bb2..c990dbb98 100644 --- a/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py +++ b/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py @@ -87,8 +87,8 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest): (By.XPATH, NavMenuLocators.process_watcher_alertfier)) self.page.wait_for_element_to_disappear( - lambda driver: driver.find_element_by_css_selector( - ".loading-logs"), 10) + lambda driver: driver.find_element( + By.CSS_SELECTOR, ".loading-logs"), 10) expected_backup_success_msg = "Successfully completed." self.assertEqual(status, expected_backup_success_msg) @@ -133,8 +133,8 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest): (By.XPATH, NavMenuLocators.process_watcher_alertfier)) self.page.wait_for_element_to_disappear( - lambda driver: driver.find_element_by_css_selector( - ".loading-logs"), 10) + lambda driver: driver.find_element( + By.CSS_SELECTOR, ".loading-logs"), 10) self.assertEqual(status, expected_backup_success_msg) # Check for XSS in Restore details @@ -209,15 +209,16 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest): try: take_bckup.click() if self.page.wait_for_element_to_disappear( - lambda driver: driver.find_element_by_name( + lambda driver: driver.find_element( + By.NAME, NavMenuLocators.backup_filename_txt_box_name)): click = False except Exception: pass def initiate_restore(self): - tools_menu = self.driver.find_element_by_link_text( - NavMenuLocators.tools_menu_link_text) + tools_menu = self.driver.find_element( + By.LINK_TEXT, NavMenuLocators.tools_menu_link_text) tools_menu.click() restore_obj = self.page.find_by_css_selector( @@ -239,7 +240,8 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest): restore_btn.click() self.page.wait_for_element_to_disappear( - lambda driver: driver.find_element_by_css_selector( + lambda driver: driver.find_element( + By.CSS_SELECTOR, NavMenuLocators.restore_file_name_txt_box_name)) def _check_escaped_characters(self, source_code, string_to_find, source): @@ -286,8 +288,8 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest): default_binary_path = self.server['default_binary_paths'] if default_binary_path is not None: def get_server_version_string(): - server_version = {130000: '13', 120000: '12', 110000: '11', - 100000: '10', 90600: '9.6'} + server_version = {140000: '14', 130000: '13', 120000: '12', + 110000: '11', 100000: '10', 90600: '9.6'} for k, v in server_version.items(): if k <= self.server_information['server_version']: return v @@ -317,5 +319,5 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest): self.page.click_modal('Save') self.page.wait_for_element_to_disappear( - lambda driver: driver.find_element_by_css_selector(".ajs-modal") + lambda driver: driver.find_element(By.CSS_SELECTOR, ".ajs-modal") ) diff --git a/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py b/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py index 344e6b2c4..481bf2cf2 100644 --- a/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py +++ b/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py @@ -81,8 +81,8 @@ class PGUtilitiesMaintenanceFeatureTest(BaseFeatureTest): self._open_maintenance_dialogue() self.page.click_modal('OK') self.page.wait_for_element_to_disappear( - lambda driver: driver.find_element_by_xpath( - NavMenuLocators.maintenance_operation)) + lambda driver: driver.find_element( + By.XPATH, NavMenuLocators.maintenance_operation)) # Wait for the backup status alertfier self.wait.until(EC.visibility_of_element_located( @@ -129,8 +129,8 @@ class PGUtilitiesMaintenanceFeatureTest(BaseFeatureTest): (By.XPATH, NavMenuLocators.process_watcher_alertfier)) self.page.wait_for_element_to_disappear( - lambda driver: driver.find_element_by_css_selector(".loading-logs") - ) + lambda driver: driver.find_element( + By.CSS_SELECTOR, ".loading-logs")) if status != "Successfully completed.": self.assertEqual(status, "Successfully completed.") diff --git a/web/pgadmin/feature_tests/query_tool_tests.py b/web/pgadmin/feature_tests/query_tool_tests.py index 1de2686de..fd8d20e04 100644 --- a/web/pgadmin/feature_tests/query_tool_tests.py +++ b/web/pgadmin/feature_tests/query_tool_tests.py @@ -468,8 +468,9 @@ SELECT relname FROM pg_catalog.pg_class canvas = self.wait.until(EC.presence_of_element_located( (By.CSS_SELECTOR, QueryToolLocators.query_output_canvas_css))) - el = canvas.find_elements_by_xpath( - QueryToolLocators.output_column_data_xpath.format(table_name)) + el = canvas.find_elements( + By.XPATH, QueryToolLocators.output_column_data_xpath.format( + table_name)) assert len(el) != 0, "Table '{}' is not created with auto " \ "commit enabled.".format(table_name) @@ -561,8 +562,9 @@ SELECT relname FROM pg_catalog.pg_class canvas = self.wait.until(EC.presence_of_element_located( (By.CSS_SELECTOR, QueryToolLocators.query_output_canvas_css))) - el = canvas.find_elements_by_xpath( - QueryToolLocators.output_column_data_xpath.format(table_name)) + el = canvas.find_elements( + By.XPATH, QueryToolLocators.output_column_data_xpath.format( + table_name)) assert len(el) == 0, "Table '{}' created even after ROLLBACK due to " \ "sql error.".format(table_name) 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 f4b6ded7f..0ea06681c 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 @@ -56,8 +56,8 @@ class CopySQLFeatureTest(BaseFeatureTest): % self.test_table_name, 10), "No data displayed in SQL tab") # Fetch the inner html & check for escaped characters - source_code = self.driver.find_elements_by_xpath( - QueryToolLocators.code_mirror_data_xpath) + source_code = self.driver.find_elements( + By.XPATH, QueryToolLocators.code_mirror_data_xpath) sql_query = '' for data in source_code: @@ -74,10 +74,10 @@ class CopySQLFeatureTest(BaseFeatureTest): self.driver.switch_to.default_content() self.driver.switch_to.frame( - self.driver.find_element_by_tag_name("iframe")) + self.driver.find_element(By.TAG_NAME, "iframe")) - code_mirror = self.driver.find_elements_by_xpath( - QueryToolLocators.code_mirror_data_xpath) + code_mirror = self.driver.find_elements( + By.XPATH, QueryToolLocators.code_mirror_data_xpath) query_tool_result = '' for data in code_mirror: query_tool_result += data.text 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 5cda88be7..2294b95cc 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 @@ -285,7 +285,7 @@ class CheckForXssFeatureTest(BaseFeatureTest): self.page.find_by_css_selector(".slick-header-column") cells = self.driver. \ - find_elements_by_css_selector(".slick-header-column") + find_elements(By.CSS_SELECTOR, ".slick-header-column") # remove first element as it is row number. # currently 4th col @@ -315,9 +315,9 @@ class CheckForXssFeatureTest(BaseFeatureTest): # Re-try logic try: ActionChains(self.driver).move_to_element( - self.driver.find_element_by_css_selector( - 'div.pgadmin-explain-container > svg > g > g > image' - ) + self.driver.find_element( + By.CSS_SELECTOR, + 'div.pgadmin-explain-container > svg > g > g > image') ).click().perform() break except Exception: @@ -331,7 +331,8 @@ class CheckForXssFeatureTest(BaseFeatureTest): ) raise - source_code = self.driver.find_element_by_css_selector( + source_code = self.driver.find_element( + By.CSS_SELECTOR, '.pgadmin-explain-details:not(.d-none)').get_attribute('innerHTML') self._check_escaped_characters( 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 c04f1ad0f..d5c2b5f09 100644 --- a/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py +++ b/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py @@ -134,7 +134,7 @@ class CheckDebuggerForXssFeatureTest(BaseFeatureTest): self._close_debugger() def _close_debugger(self): - self.page.driver.switch_to_default_content() + self.page.driver.switch_to.default_content() self.page.click_element( self.page.find_by_xpath( "//*[@id='dockerContainer']/div/div[3]/div/div[2]/div[1]") diff --git a/web/regression/feature_utils/pgadmin_page.py b/web/regression/feature_utils/pgadmin_page.py index e648bc625..11ccabf28 100644 --- a/web/regression/feature_utils/pgadmin_page.py +++ b/web/regression/feature_utils/pgadmin_page.py @@ -193,7 +193,7 @@ class PgadminPage: " 'Remove Panel')]").click() if prompt: self.driver.switch_to.frame( - self.driver.find_elements_by_tag_name("iframe")[0]) + self.driver.find_elements(By.TAG_NAME, "iframe")[0]) time.sleep(.5) self.click_element(self.find_by_xpath( '//button[contains(@class, "ajs-button") and ' @@ -241,8 +241,8 @@ class PgadminPage: def check_execute_option(self, option): """"This function will check auto commit or auto roll back based on user input. If button is already checked, no action will be taken""" - query_options = self.driver.find_element_by_css_selector( - QueryToolLocators.btn_query_dropdown) + query_options = self.driver.find_element( + By.CSS_SELECTOR, QueryToolLocators.btn_query_dropdown) expanded = query_options.get_attribute("aria-expanded") if expanded == "false": query_options.click() @@ -250,8 +250,8 @@ class PgadminPage: def update_execute_option_setting( css_selector_of_option_status, css_selector_of_option,): retry = 3 - check_status = self.driver.find_element_by_css_selector( - css_selector_of_option_status) + check_status = self.driver.find_element( + By.CSS_SELECTOR, css_selector_of_option_status) if 'visibility-hidden' in check_status.get_attribute('class'): while retry > 0: self.find_by_css_selector(css_selector_of_option).click() diff --git a/web/regression/python_test_utils/test_utils.py b/web/regression/python_test_utils/test_utils.py index 10397e122..541e8eff2 100644 --- a/web/regression/python_test_utils/test_utils.py +++ b/web/regression/python_test_utils/test_utils.py @@ -1439,11 +1439,7 @@ def get_parallel_sequential_module_list(module_list): """ # list of files consisting tests that needs to be # executed sequentially - sequential_tests_file = [ - 'pgadmin.feature_tests.pg_utilities_backup_restore_test', - 'pgadmin.feature_tests.pg_utilities_maintenance_test', - 'pgadmin.feature_tests.keyboard_shortcut_test' - ] + sequential_tests_file = [] # list of tests can be executed in parallel parallel_tests = list(module_list) diff --git a/web/regression/requirements.txt b/web/regression/requirements.txt index 0a5ba0f36..78cd3ba9c 100644 --- a/web/regression/requirements.txt +++ b/web/regression/requirements.txt @@ -25,5 +25,5 @@ python-mimeparse==1.6.0 testscenarios==0.5.0 testtools==2.3.0 traceback2==1.4.0 -selenium==4.0.0 +selenium==4.0.0a6 coverage==5.0.1 ^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Feature Test Fix - React porting @ 2021-11-12 06:28 Akshay Joshi <[email protected]> parent: Yogesh Mahajan <[email protected]> 0 siblings, 1 reply; 12+ messages in thread From: Akshay Joshi @ 2021-11-12 06:28 UTC (permalink / raw) To: Yogesh Mahajan <[email protected]>; +Cc: pgadmin-hackers Thanks, the patch applied. On Thu, Nov 11, 2021 at 10:04 PM Yogesh Mahajan < [email protected]> wrote: > Hi, > > Please find the attached patch which uses selenium 4.0.0a6 which works > with python 3.6.8. > Selenium 4.0.0 requires python 3.7+ > > Thanks, > Yogesh Mahajan > EnterpriseDB > > > On Wed, Nov 10, 2021 at 11:59 AM Akshay Joshi < > [email protected]> wrote: > >> Thanks, the patch applied. but Jenkins is failing with the below error: >> ERROR: No matching distribution found for selenium==4.0.0 >> ERROR: Failed to install Python requirements. >> >> On Tue, Nov 9, 2021 at 2:48 PM Yogesh Mahajan < >> [email protected]> wrote: >> >>> Hi, >>> >>> Please find the attached patch which fixes feature tests broken due to >>> react porting changes. >>> >>> Thanks, >>> Yogesh Mahajan >>> EnterpriseDB >>> >> >> >> -- >> *Thanks & Regards* >> *Akshay Joshi* >> *pgAdmin Hacker | Principal Software Architect* >> *EDB Postgres <http://edbpostgres.com>* >> >> *Mobile: +91 976-788-8246* >> > -- *Thanks & Regards* *Akshay Joshi* *pgAdmin Hacker | Principal Software Architect* *EDB Postgres <http://edbpostgres.com>* *Mobile: +91 976-788-8246* ^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Feature Test Fix - React porting @ 2021-11-18 09:53 Yogesh Mahajan <[email protected]> parent: Akshay Joshi <[email protected]> 0 siblings, 1 reply; 12+ messages in thread From: Yogesh Mahajan @ 2021-11-18 09:53 UTC (permalink / raw) To: pgadmin-hackers Hi, Please find the attached patch which fixes the problem related to feature tests. Thanks, Yogesh Mahajan EnterpriseDB On Fri, Nov 12, 2021 at 11:59 AM Akshay Joshi <[email protected]> wrote: > Thanks, the patch applied. > > On Thu, Nov 11, 2021 at 10:04 PM Yogesh Mahajan < > [email protected]> wrote: > >> Hi, >> >> Please find the attached patch which uses selenium 4.0.0a6 which works >> with python 3.6.8. >> Selenium 4.0.0 requires python 3.7+ >> >> Thanks, >> Yogesh Mahajan >> EnterpriseDB >> >> >> On Wed, Nov 10, 2021 at 11:59 AM Akshay Joshi < >> [email protected]> wrote: >> >>> Thanks, the patch applied. but Jenkins is failing with the below error: >>> ERROR: No matching distribution found for selenium==4.0.0 >>> ERROR: Failed to install Python requirements. >>> >>> On Tue, Nov 9, 2021 at 2:48 PM Yogesh Mahajan < >>> [email protected]> wrote: >>> >>>> Hi, >>>> >>>> Please find the attached patch which fixes feature tests broken due to >>>> react porting changes. >>>> >>>> Thanks, >>>> Yogesh Mahajan >>>> EnterpriseDB >>>> >>> >>> >>> -- >>> *Thanks & Regards* >>> *Akshay Joshi* >>> *pgAdmin Hacker | Principal Software Architect* >>> *EDB Postgres <http://edbpostgres.com>* >>> >>> *Mobile: +91 976-788-8246* >>> >> > > -- > *Thanks & Regards* > *Akshay Joshi* > *pgAdmin Hacker | Principal Software Architect* > *EDB Postgres <http://edbpostgres.com>* > > *Mobile: +91 976-788-8246* > Attachments: [application/octet-stream] Feature_Test_Fix_React_Porting_v3.patch (9.1K, 3-Feature_Test_Fix_React_Porting_v3.patch) download | inline diff: 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 c990dbb98..f02c19a3d 100644 --- a/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py +++ b/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py @@ -88,7 +88,7 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest): NavMenuLocators.process_watcher_alertfier)) self.page.wait_for_element_to_disappear( lambda driver: driver.find_element( - By.CSS_SELECTOR, ".loading-logs"), 10) + By.CSS_SELECTOR, ".loading-logs"), 18) expected_backup_success_msg = "Successfully completed." self.assertEqual(status, expected_backup_success_msg) @@ -157,18 +157,23 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest): os.remove(backup_file) def after(self): - test_gui_helper.close_process_watcher(self) - test_gui_helper.close_bgprocess_popup(self) - self.page.remove_server(self.server) - connection = test_utils.get_db_connection( - self.server['db'], - self.server['username'], - self.server['db_password'], - self.server['host'], - self.server['port'], - self.server['sslmode'] - ) - test_utils.drop_database(connection, self.database_name) + try: + test_gui_helper.close_process_watcher(self) + test_gui_helper.close_bgprocess_popup(self) + self.page.remove_server(self.server) + except Exception as e: + print("PGUtilitiesBackupFeatureTest - " + "Exception occurred in after method") + finally: + connection = test_utils.get_db_connection( + self.server['db'], + self.server['username'], + self.server['db_password'], + self.server['host'], + self.server['port'], + self.server['sslmode'] + ) + test_utils.drop_database(connection, self.database_name) def _check_detailed_window_for_xss(self, tool_name): source_code = self.page.find_by_css_selector( diff --git a/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py b/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py index 481bf2cf2..e4be948f6 100644 --- a/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py +++ b/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py @@ -165,19 +165,24 @@ class PGUtilitiesMaintenanceFeatureTest(BaseFeatureTest): test_gui_helper.close_process_watcher(self) def after(self): - test_gui_helper.close_bgprocess_popup(self) - test_utils.delete_table(self.server, self.database_name, - self.table_name) - self.page.remove_server(self.server) - connection = test_utils.get_db_connection( - self.server['db'], - self.server['username'], - self.server['db_password'], - self.server['host'], - self.server['port'], - self.server['sslmode'] - ) - test_utils.drop_database(connection, self.database_name) + try: + test_gui_helper.close_bgprocess_popup(self) + test_utils.delete_table(self.server, self.database_name, + self.table_name) + self.page.remove_server(self.server) + except Exception as e: + print("PGUtilitiesMaintenanceFeatureTest - " + "Exception occurred in after method") + finally: + connection = test_utils.get_db_connection( + self.server['db'], + self.server['username'], + self.server['db_password'], + self.server['host'], + self.server['port'], + self.server['sslmode'] + ) + test_utils.drop_database(connection, self.database_name) def check_escaped_characters(self, source_code, string_to_find, source): # For XSS we need to search against element's html code diff --git a/web/pgadmin/feature_tests/xss_checks_roles_control_test.py b/web/pgadmin/feature_tests/xss_checks_roles_control_test.py index d51632386..2be688f69 100644 --- a/web/pgadmin/feature_tests/xss_checks_roles_control_test.py +++ b/web/pgadmin/feature_tests/xss_checks_roles_control_test.py @@ -82,7 +82,7 @@ class CheckRoleMembershipControlFeatureTest(BaseFeatureTest): # Fetch the source code for our custom control source_code = self.page.find_by_xpath( "//span[contains(@class,'icon-')]/following-sibling::span" - ).text + ).get_attribute('innerHTML') self._check_escaped_characters( source_code, diff --git a/web/regression/feature_utils/pgadmin_page.py b/web/regression/feature_utils/pgadmin_page.py index 11ccabf28..630d05ef6 100644 --- a/web/regression/feature_utils/pgadmin_page.py +++ b/web/regression/feature_utils/pgadmin_page.py @@ -431,7 +431,7 @@ class PgadminPage: :param server_group_name: containing server :param server_name: :param server_password: - :return: true if server node is expnaded else false + :return: true if server node is expanded else false """ server_expanded = False server_node_xpath = TreeAreaLocators.server_node(server_name) @@ -444,14 +444,14 @@ class PgadminPage: self.driver.execute_script( self.js_executor_scrollintoview_arg, server_node) if self.check_if_element_exist_by_xpath( - server_node_exp_status_xpath, 1): + server_node_exp_status_xpath, 2): server_expanded = True else: server_expanded = self.click_expand_server_node( server_name, server_password, server_node) if not server_expanded: print("(expand_server_node)The Server node is not " - "expnaded", file=sys.stderr) + "expanded", file=sys.stderr) else: print("(expand_server_node)The Server node not found", file=sys.stderr) @@ -478,7 +478,8 @@ class PgadminPage: webdriver.ActionChains(self.driver).double_click( server_node).perform() if self.check_if_element_exist_by_xpath( - TreeAreaLocators.server_node_exp_status(server_name)): + TreeAreaLocators.server_node_exp_status(server_name), + 10): server_node_expansion_status = True else: if self.click_and_connect_server(server_name, server_password): @@ -586,7 +587,7 @@ class PgadminPage: server_child_expanded = self.click_to_expand_tree_node( child_node_ele, server_child_node_exp_status_xpath) if not server_child_expanded: - print("Child not is not expanded after clickng ", + print("Child not is not expanded after clicking ", file=sys.stderr) else: print("The server/previous nodes not expanded", file=sys.stderr) @@ -1293,7 +1294,8 @@ class PgadminPage: top_el).perform() r_scroll -= 1 else: - print("check_if_element_exists_with_scroll > Element NOT found") + print("check_if_element_exists_with_scroll > Element NOT found", + xpath, file=sys.stderr) return False def find_by_xpath_list(self, xpath): diff --git a/web/regression/python_test_utils/test_utils.py b/web/regression/python_test_utils/test_utils.py index 541e8eff2..28aaaa6f6 100644 --- a/web/regression/python_test_utils/test_utils.py +++ b/web/regression/python_test_utils/test_utils.py @@ -1439,7 +1439,9 @@ def get_parallel_sequential_module_list(module_list): """ # list of files consisting tests that needs to be # executed sequentially - sequential_tests_file = [] + sequential_tests_file = [ + 'pgadmin.feature_tests.pg_utilities_backup_restore_test', + 'pgadmin.feature_tests.pg_utilities_maintenance_test'] # list of tests can be executed in parallel parallel_tests = list(module_list) diff --git a/web/regression/runtests.py b/web/regression/runtests.py index 7bc2ca4d5..bbd03ca95 100644 --- a/web/regression/runtests.py +++ b/web/regression/runtests.py @@ -603,7 +603,8 @@ def run_parallel_tests(url_client, servers_details, parallel_tests_lists, version_of_browser, ser['name']) # Launch client url in browser - test_utils.launch_url_in_browser(driver_object, url_client) + test_utils.launch_url_in_browser( + driver_object, url_client, 60) # Add name for thread thread_name = "parallel_tests" + ser['name'] ^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Feature Test Fix - React porting @ 2021-11-18 11:45 Akshay Joshi <[email protected]> parent: Yogesh Mahajan <[email protected]> 0 siblings, 1 reply; 12+ messages in thread From: Akshay Joshi @ 2021-11-18 11:45 UTC (permalink / raw) To: Yogesh Mahajan <[email protected]>; +Cc: pgadmin-hackers Thanks, the patch applied. On Thu, Nov 18, 2021 at 3:23 PM Yogesh Mahajan < [email protected]> wrote: > Hi, > > Please find the attached patch which fixes the problem related to > feature tests. > > > Thanks, > Yogesh Mahajan > EnterpriseDB > > > On Fri, Nov 12, 2021 at 11:59 AM Akshay Joshi < > [email protected]> wrote: > >> Thanks, the patch applied. >> >> On Thu, Nov 11, 2021 at 10:04 PM Yogesh Mahajan < >> [email protected]> wrote: >> >>> Hi, >>> >>> Please find the attached patch which uses selenium 4.0.0a6 which works >>> with python 3.6.8. >>> Selenium 4.0.0 requires python 3.7+ >>> >>> Thanks, >>> Yogesh Mahajan >>> EnterpriseDB >>> >>> >>> On Wed, Nov 10, 2021 at 11:59 AM Akshay Joshi < >>> [email protected]> wrote: >>> >>>> Thanks, the patch applied. but Jenkins is failing with the below error: >>>> ERROR: No matching distribution found for selenium==4.0.0 >>>> ERROR: Failed to install Python requirements. >>>> >>>> On Tue, Nov 9, 2021 at 2:48 PM Yogesh Mahajan < >>>> [email protected]> wrote: >>>> >>>>> Hi, >>>>> >>>>> Please find the attached patch which fixes feature tests broken due to >>>>> react porting changes. >>>>> >>>>> Thanks, >>>>> Yogesh Mahajan >>>>> EnterpriseDB >>>>> >>>> >>>> >>>> -- >>>> *Thanks & Regards* >>>> *Akshay Joshi* >>>> *pgAdmin Hacker | Principal Software Architect* >>>> *EDB Postgres <http://edbpostgres.com>* >>>> >>>> *Mobile: +91 976-788-8246* >>>> >>> >> >> -- >> *Thanks & Regards* >> *Akshay Joshi* >> *pgAdmin Hacker | Principal Software Architect* >> *EDB Postgres <http://edbpostgres.com>* >> >> *Mobile: +91 976-788-8246* >> > -- *Thanks & Regards* *Akshay Joshi* *pgAdmin Hacker | Principal Software Architect* *EDB Postgres <http://edbpostgres.com>* *Mobile: +91 976-788-8246* ^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Feature Test Fix - React porting @ 2021-11-22 07:27 Yogesh Mahajan <[email protected]> parent: Akshay Joshi <[email protected]> 0 siblings, 1 reply; 12+ messages in thread From: Yogesh Mahajan @ 2021-11-22 07:27 UTC (permalink / raw) To: pgadmin-hackers Hi, Please find the attached patch which adds flexibility to wait for launching pgAdmin. Thanks, Yogesh Mahajan EnterpriseDB On Thu, Nov 18, 2021 at 5:15 PM Akshay Joshi <[email protected]> wrote: > Thanks, the patch applied. > > On Thu, Nov 18, 2021 at 3:23 PM Yogesh Mahajan < > [email protected]> wrote: > >> Hi, >> >> Please find the attached patch which fixes the problem related to >> feature tests. >> >> >> Thanks, >> Yogesh Mahajan >> EnterpriseDB >> >> >> On Fri, Nov 12, 2021 at 11:59 AM Akshay Joshi < >> [email protected]> wrote: >> >>> Thanks, the patch applied. >>> >>> On Thu, Nov 11, 2021 at 10:04 PM Yogesh Mahajan < >>> [email protected]> wrote: >>> >>>> Hi, >>>> >>>> Please find the attached patch which uses selenium 4.0.0a6 which works >>>> with python 3.6.8. >>>> Selenium 4.0.0 requires python 3.7+ >>>> >>>> Thanks, >>>> Yogesh Mahajan >>>> EnterpriseDB >>>> >>>> >>>> On Wed, Nov 10, 2021 at 11:59 AM Akshay Joshi < >>>> [email protected]> wrote: >>>> >>>>> Thanks, the patch applied. but Jenkins is failing with the below error: >>>>> ERROR: No matching distribution found for selenium==4.0.0 >>>>> ERROR: Failed to install Python requirements. >>>>> >>>>> On Tue, Nov 9, 2021 at 2:48 PM Yogesh Mahajan < >>>>> [email protected]> wrote: >>>>> >>>>>> Hi, >>>>>> >>>>>> Please find the attached patch which fixes feature tests broken due >>>>>> to react porting changes. >>>>>> >>>>>> Thanks, >>>>>> Yogesh Mahajan >>>>>> EnterpriseDB >>>>>> >>>>> >>>>> >>>>> -- >>>>> *Thanks & Regards* >>>>> *Akshay Joshi* >>>>> *pgAdmin Hacker | Principal Software Architect* >>>>> *EDB Postgres <http://edbpostgres.com>* >>>>> >>>>> *Mobile: +91 976-788-8246* >>>>> >>>> >>> >>> -- >>> *Thanks & Regards* >>> *Akshay Joshi* >>> *pgAdmin Hacker | Principal Software Architect* >>> *EDB Postgres <http://edbpostgres.com>* >>> >>> *Mobile: +91 976-788-8246* >>> >> > > -- > *Thanks & Regards* > *Akshay Joshi* > *pgAdmin Hacker | Principal Software Architect* > *EDB Postgres <http://edbpostgres.com>* > > *Mobile: +91 976-788-8246* > Attachments: [application/octet-stream] Feature_Test_Fix_React_Porting_v4.patch (2.0K, 3-Feature_Test_Fix_React_Porting_v4.patch) download | inline diff: diff --git a/web/regression/runtests.py b/web/regression/runtests.py index bbd03ca95..a15deeab6 100644 --- a/web/regression/runtests.py +++ b/web/regression/runtests.py @@ -604,7 +604,7 @@ def run_parallel_tests(url_client, servers_details, parallel_tests_lists, ser['name']) # Launch client url in browser test_utils.launch_url_in_browser( - driver_object, url_client, 60) + driver_object, url_client, timeout=60) # Add name for thread thread_name = "parallel_tests" + ser['name'] @@ -847,10 +847,14 @@ if __name__ == '__main__': client_url = app_starter_local.start_app() if config.DEBUG: + pgAdmin_wait_time = \ + selenoid_config['pgAdmin_max_up_time'] print('pgAdmin is launched with DEBUG=True, ' - 'hence sleeping for 50 seconds.', + 'hence sleeping for %s seconds.', + pgAdmin_wait_time, file=sys.stderr) - time.sleep(50) + + time.sleep(int(pgAdmin_wait_time)) # Running Parallel tests if len(parallel_tests) > 0: diff --git a/web/regression/test_config.json.in b/web/regression/test_config.json.in index 4d6b41f69..7ed0847a2 100644 --- a/web/regression/test_config.json.in +++ b/web/regression/test_config.json.in @@ -85,6 +85,7 @@ }], "selenoid_config": { "pgAdmin_default_server":"IP address of machine where source code is going to be executed", + "pgAdmin_max_up_time": 90, "max_parallel_sessions": "3", "selenoid_url": "http://<IP address of Selenoid Installed machine>:4444/wd/hub", "browsers_list":[ ^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Feature Test Fix - React porting @ 2021-11-22 12:39 Akshay Joshi <[email protected]> parent: Yogesh Mahajan <[email protected]> 0 siblings, 1 reply; 12+ messages in thread From: Akshay Joshi @ 2021-11-22 12:39 UTC (permalink / raw) To: Yogesh Mahajan <[email protected]>; +Cc: pgadmin-hackers Thanks, the patch applied. On Mon, Nov 22, 2021 at 12:58 PM Yogesh Mahajan < [email protected]> wrote: > Hi, > > Please find the attached patch which adds flexibility to wait for > launching pgAdmin. > > Thanks, > Yogesh Mahajan > EnterpriseDB > > > On Thu, Nov 18, 2021 at 5:15 PM Akshay Joshi < > [email protected]> wrote: > >> Thanks, the patch applied. >> >> On Thu, Nov 18, 2021 at 3:23 PM Yogesh Mahajan < >> [email protected]> wrote: >> >>> Hi, >>> >>> Please find the attached patch which fixes the problem related to >>> feature tests. >>> >>> >>> Thanks, >>> Yogesh Mahajan >>> EnterpriseDB >>> >>> >>> On Fri, Nov 12, 2021 at 11:59 AM Akshay Joshi < >>> [email protected]> wrote: >>> >>>> Thanks, the patch applied. >>>> >>>> On Thu, Nov 11, 2021 at 10:04 PM Yogesh Mahajan < >>>> [email protected]> wrote: >>>> >>>>> Hi, >>>>> >>>>> Please find the attached patch which uses selenium 4.0.0a6 which works >>>>> with python 3.6.8. >>>>> Selenium 4.0.0 requires python 3.7+ >>>>> >>>>> Thanks, >>>>> Yogesh Mahajan >>>>> EnterpriseDB >>>>> >>>>> >>>>> On Wed, Nov 10, 2021 at 11:59 AM Akshay Joshi < >>>>> [email protected]> wrote: >>>>> >>>>>> Thanks, the patch applied. but Jenkins is failing with the below >>>>>> error: >>>>>> ERROR: No matching distribution found for selenium==4.0.0 >>>>>> ERROR: Failed to install Python requirements. >>>>>> >>>>>> On Tue, Nov 9, 2021 at 2:48 PM Yogesh Mahajan < >>>>>> [email protected]> wrote: >>>>>> >>>>>>> Hi, >>>>>>> >>>>>>> Please find the attached patch which fixes feature tests broken due >>>>>>> to react porting changes. >>>>>>> >>>>>>> Thanks, >>>>>>> Yogesh Mahajan >>>>>>> EnterpriseDB >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> *Thanks & Regards* >>>>>> *Akshay Joshi* >>>>>> *pgAdmin Hacker | Principal Software Architect* >>>>>> *EDB Postgres <http://edbpostgres.com>* >>>>>> >>>>>> *Mobile: +91 976-788-8246* >>>>>> >>>>> >>>> >>>> -- >>>> *Thanks & Regards* >>>> *Akshay Joshi* >>>> *pgAdmin Hacker | Principal Software Architect* >>>> *EDB Postgres <http://edbpostgres.com>* >>>> >>>> *Mobile: +91 976-788-8246* >>>> >>> >> >> -- >> *Thanks & Regards* >> *Akshay Joshi* >> *pgAdmin Hacker | Principal Software Architect* >> *EDB Postgres <http://edbpostgres.com>* >> >> *Mobile: +91 976-788-8246* >> > -- *Thanks & Regards* *Akshay Joshi* *pgAdmin Hacker | Principal Software Architect* *EDB Postgres <http://edbpostgres.com>* *Mobile: +91 976-788-8246* ^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Feature Test Fix - React porting @ 2021-11-23 11:01 Yogesh Mahajan <[email protected]> parent: Akshay Joshi <[email protected]> 0 siblings, 1 reply; 12+ messages in thread From: Yogesh Mahajan @ 2021-11-23 11:01 UTC (permalink / raw) To: pgadmin-hackers Hi, Please find the attached patch to fix feature test failures due to react porting for backup dialogue. Thanks, Yogesh Mahajan EnterpriseDB On Mon, Nov 22, 2021 at 6:09 PM Akshay Joshi <[email protected]> wrote: > Thanks, the patch applied. > > On Mon, Nov 22, 2021 at 12:58 PM Yogesh Mahajan < > [email protected]> wrote: > >> Hi, >> >> Please find the attached patch which adds flexibility to wait for >> launching pgAdmin. >> >> Thanks, >> Yogesh Mahajan >> EnterpriseDB >> >> >> On Thu, Nov 18, 2021 at 5:15 PM Akshay Joshi < >> [email protected]> wrote: >> >>> Thanks, the patch applied. >>> >>> On Thu, Nov 18, 2021 at 3:23 PM Yogesh Mahajan < >>> [email protected]> wrote: >>> >>>> Hi, >>>> >>>> Please find the attached patch which fixes the problem related to >>>> feature tests. >>>> >>>> >>>> Thanks, >>>> Yogesh Mahajan >>>> EnterpriseDB >>>> >>>> >>>> On Fri, Nov 12, 2021 at 11:59 AM Akshay Joshi < >>>> [email protected]> wrote: >>>> >>>>> Thanks, the patch applied. >>>>> >>>>> On Thu, Nov 11, 2021 at 10:04 PM Yogesh Mahajan < >>>>> [email protected]> wrote: >>>>> >>>>>> Hi, >>>>>> >>>>>> Please find the attached patch which uses selenium 4.0.0a6 which >>>>>> works with python 3.6.8. >>>>>> Selenium 4.0.0 requires python 3.7+ >>>>>> >>>>>> Thanks, >>>>>> Yogesh Mahajan >>>>>> EnterpriseDB >>>>>> >>>>>> >>>>>> On Wed, Nov 10, 2021 at 11:59 AM Akshay Joshi < >>>>>> [email protected]> wrote: >>>>>> >>>>>>> Thanks, the patch applied. but Jenkins is failing with the below >>>>>>> error: >>>>>>> ERROR: No matching distribution found for selenium==4.0.0 >>>>>>> ERROR: Failed to install Python requirements. >>>>>>> >>>>>>> On Tue, Nov 9, 2021 at 2:48 PM Yogesh Mahajan < >>>>>>> [email protected]> wrote: >>>>>>> >>>>>>>> Hi, >>>>>>>> >>>>>>>> Please find the attached patch which fixes feature tests broken due >>>>>>>> to react porting changes. >>>>>>>> >>>>>>>> Thanks, >>>>>>>> Yogesh Mahajan >>>>>>>> EnterpriseDB >>>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> *Thanks & Regards* >>>>>>> *Akshay Joshi* >>>>>>> *pgAdmin Hacker | Principal Software Architect* >>>>>>> *EDB Postgres <http://edbpostgres.com>* >>>>>>> >>>>>>> *Mobile: +91 976-788-8246* >>>>>>> >>>>>> >>>>> >>>>> -- >>>>> *Thanks & Regards* >>>>> *Akshay Joshi* >>>>> *pgAdmin Hacker | Principal Software Architect* >>>>> *EDB Postgres <http://edbpostgres.com>* >>>>> >>>>> *Mobile: +91 976-788-8246* >>>>> >>>> >>> >>> -- >>> *Thanks & Regards* >>> *Akshay Joshi* >>> *pgAdmin Hacker | Principal Software Architect* >>> *EDB Postgres <http://edbpostgres.com>* >>> >>> *Mobile: +91 976-788-8246* >>> >> > > -- > *Thanks & Regards* > *Akshay Joshi* > *pgAdmin Hacker | Principal Software Architect* > *EDB Postgres <http://edbpostgres.com>* > > *Mobile: +91 976-788-8246* > Attachments: [application/octet-stream] Feature_Test_Fix_React_Porting_v5.patch (3.4K, 3-Feature_Test_Fix_React_Porting_v5.patch) download | inline diff: 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 f02c19a3d..9a6c7ec8b 100644 --- a/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py +++ b/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py @@ -88,7 +88,7 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest): NavMenuLocators.process_watcher_alertfier)) self.page.wait_for_element_to_disappear( lambda driver: driver.find_element( - By.CSS_SELECTOR, ".loading-logs"), 18) + By.CSS_SELECTOR, ".loading-logs"), 15) expected_backup_success_msg = "Successfully completed." self.assertEqual(status, expected_backup_success_msg) @@ -204,13 +204,14 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest): element.click() self.page.fill_input_by_field_name( NavMenuLocators.backup_filename_txt_box_name, - "test_backup", loose_focus=True) + "test_backup", input_keys=True, loose_focus=True) # Click on the take Backup button take_bckup = self.page.find_by_xpath( NavMenuLocators.backup_btn_xpath) click = True - while click: + retry = 3 + while click and retry > 0: try: take_bckup.click() if self.page.wait_for_element_to_disappear( @@ -219,6 +220,7 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest): NavMenuLocators.backup_filename_txt_box_name)): click = False except Exception: + retry -= 1 pass def initiate_restore(self): diff --git a/web/regression/feature_utils/locators.py b/web/regression/feature_utils/locators.py index 3c728ca9c..110e1425e 100644 --- a/web/regression/feature_utils/locators.py +++ b/web/regression/feature_utils/locators.py @@ -78,7 +78,7 @@ class NavMenuLocators: restore_file_name_txt_box_name = "file" backup_btn_xpath = \ - "//button[contains(@class,'fa-save')and contains(.,'Backup')]" + "//button[ contains(.,'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 630d05ef6..996118b58 100644 --- a/web/regression/feature_utils/pgadmin_page.py +++ b/web/regression/feature_utils/pgadmin_page.py @@ -384,12 +384,17 @@ class PgadminPage: :param tree_node_exp_check_xpath: :return: True is tree_node_exp_check_xpath present in DOM else false """ - 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 - else: - return False + 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) + retry -= 1 def expand_server_group_node(self, server_group_name): """ ^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Feature Test Fix - React porting @ 2021-11-23 12:07 Akshay Joshi <[email protected]> parent: Yogesh Mahajan <[email protected]> 0 siblings, 1 reply; 12+ messages in thread From: Akshay Joshi @ 2021-11-23 12:07 UTC (permalink / raw) To: Yogesh Mahajan <[email protected]>; +Cc: pgadmin-hackers Thanks, the patch applied. On Tue, Nov 23, 2021 at 4:32 PM Yogesh Mahajan < [email protected]> wrote: > Hi, > > Please find the attached patch to fix feature test failures due to react > porting for backup dialogue. > > Thanks, > Yogesh Mahajan > EnterpriseDB > > > On Mon, Nov 22, 2021 at 6:09 PM Akshay Joshi < > [email protected]> wrote: > >> Thanks, the patch applied. >> >> On Mon, Nov 22, 2021 at 12:58 PM Yogesh Mahajan < >> [email protected]> wrote: >> >>> Hi, >>> >>> Please find the attached patch which adds flexibility to wait for >>> launching pgAdmin. >>> >>> Thanks, >>> Yogesh Mahajan >>> EnterpriseDB >>> >>> >>> On Thu, Nov 18, 2021 at 5:15 PM Akshay Joshi < >>> [email protected]> wrote: >>> >>>> Thanks, the patch applied. >>>> >>>> On Thu, Nov 18, 2021 at 3:23 PM Yogesh Mahajan < >>>> [email protected]> wrote: >>>> >>>>> Hi, >>>>> >>>>> Please find the attached patch which fixes the problem related to >>>>> feature tests. >>>>> >>>>> >>>>> Thanks, >>>>> Yogesh Mahajan >>>>> EnterpriseDB >>>>> >>>>> >>>>> On Fri, Nov 12, 2021 at 11:59 AM Akshay Joshi < >>>>> [email protected]> wrote: >>>>> >>>>>> Thanks, the patch applied. >>>>>> >>>>>> On Thu, Nov 11, 2021 at 10:04 PM Yogesh Mahajan < >>>>>> [email protected]> wrote: >>>>>> >>>>>>> Hi, >>>>>>> >>>>>>> Please find the attached patch which uses selenium 4.0.0a6 which >>>>>>> works with python 3.6.8. >>>>>>> Selenium 4.0.0 requires python 3.7+ >>>>>>> >>>>>>> Thanks, >>>>>>> Yogesh Mahajan >>>>>>> EnterpriseDB >>>>>>> >>>>>>> >>>>>>> On Wed, Nov 10, 2021 at 11:59 AM Akshay Joshi < >>>>>>> [email protected]> wrote: >>>>>>> >>>>>>>> Thanks, the patch applied. but Jenkins is failing with the below >>>>>>>> error: >>>>>>>> ERROR: No matching distribution found for selenium==4.0.0 >>>>>>>> ERROR: Failed to install Python requirements. >>>>>>>> >>>>>>>> On Tue, Nov 9, 2021 at 2:48 PM Yogesh Mahajan < >>>>>>>> [email protected]> wrote: >>>>>>>> >>>>>>>>> Hi, >>>>>>>>> >>>>>>>>> Please find the attached patch which fixes feature tests broken >>>>>>>>> due to react porting changes. >>>>>>>>> >>>>>>>>> Thanks, >>>>>>>>> Yogesh Mahajan >>>>>>>>> EnterpriseDB >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> *Thanks & Regards* >>>>>>>> *Akshay Joshi* >>>>>>>> *pgAdmin Hacker | Principal Software Architect* >>>>>>>> *EDB Postgres <http://edbpostgres.com>* >>>>>>>> >>>>>>>> *Mobile: +91 976-788-8246* >>>>>>>> >>>>>>> >>>>>> >>>>>> -- >>>>>> *Thanks & Regards* >>>>>> *Akshay Joshi* >>>>>> *pgAdmin Hacker | Principal Software Architect* >>>>>> *EDB Postgres <http://edbpostgres.com>* >>>>>> >>>>>> *Mobile: +91 976-788-8246* >>>>>> >>>>> >>>> >>>> -- >>>> *Thanks & Regards* >>>> *Akshay Joshi* >>>> *pgAdmin Hacker | Principal Software Architect* >>>> *EDB Postgres <http://edbpostgres.com>* >>>> >>>> *Mobile: +91 976-788-8246* >>>> >>> >> >> -- >> *Thanks & Regards* >> *Akshay Joshi* >> *pgAdmin Hacker | Principal Software Architect* >> *EDB Postgres <http://edbpostgres.com>* >> >> *Mobile: +91 976-788-8246* >> > -- *Thanks & Regards* *Akshay Joshi* *pgAdmin Hacker | Principal Software Architect* *EDB Postgres <http://edbpostgres.com>* *Mobile: +91 976-788-8246* ^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Feature Test Fix - React porting @ 2021-12-21 11:00 Yogesh Mahajan <[email protected]> parent: Akshay Joshi <[email protected]> 0 siblings, 1 reply; 12+ messages in thread From: Yogesh Mahajan @ 2021-12-21 11:00 UTC (permalink / raw) To: pgadmin-hackers Hi Team, Please find feature tests fix that are broken due to react porting for alert dialogues. Thanks, Yogesh Mahajan EnterpriseDB On Tue, Nov 23, 2021 at 5:38 PM Akshay Joshi <[email protected]> wrote: > Thanks, the patch applied. > > On Tue, Nov 23, 2021 at 4:32 PM Yogesh Mahajan < > [email protected]> wrote: > >> Hi, >> >> Please find the attached patch to fix feature test failures due to react >> porting for backup dialogue. >> >> Thanks, >> Yogesh Mahajan >> EnterpriseDB >> >> >> On Mon, Nov 22, 2021 at 6:09 PM Akshay Joshi < >> [email protected]> wrote: >> >>> Thanks, the patch applied. >>> >>> On Mon, Nov 22, 2021 at 12:58 PM Yogesh Mahajan < >>> [email protected]> wrote: >>> >>>> Hi, >>>> >>>> Please find the attached patch which adds flexibility to wait for >>>> launching pgAdmin. >>>> >>>> Thanks, >>>> Yogesh Mahajan >>>> EnterpriseDB >>>> >>>> >>>> On Thu, Nov 18, 2021 at 5:15 PM Akshay Joshi < >>>> [email protected]> wrote: >>>> >>>>> Thanks, the patch applied. >>>>> >>>>> On Thu, Nov 18, 2021 at 3:23 PM Yogesh Mahajan < >>>>> [email protected]> wrote: >>>>> >>>>>> Hi, >>>>>> >>>>>> Please find the attached patch which fixes the problem related to >>>>>> feature tests. >>>>>> >>>>>> >>>>>> Thanks, >>>>>> Yogesh Mahajan >>>>>> EnterpriseDB >>>>>> >>>>>> >>>>>> On Fri, Nov 12, 2021 at 11:59 AM Akshay Joshi < >>>>>> [email protected]> wrote: >>>>>> >>>>>>> Thanks, the patch applied. >>>>>>> >>>>>>> On Thu, Nov 11, 2021 at 10:04 PM Yogesh Mahajan < >>>>>>> [email protected]> wrote: >>>>>>> >>>>>>>> Hi, >>>>>>>> >>>>>>>> Please find the attached patch which uses selenium 4.0.0a6 which >>>>>>>> works with python 3.6.8. >>>>>>>> Selenium 4.0.0 requires python 3.7+ >>>>>>>> >>>>>>>> Thanks, >>>>>>>> Yogesh Mahajan >>>>>>>> EnterpriseDB >>>>>>>> >>>>>>>> >>>>>>>> On Wed, Nov 10, 2021 at 11:59 AM Akshay Joshi < >>>>>>>> [email protected]> wrote: >>>>>>>> >>>>>>>>> Thanks, the patch applied. but Jenkins is failing with the below >>>>>>>>> error: >>>>>>>>> ERROR: No matching distribution found for selenium==4.0.0 >>>>>>>>> ERROR: Failed to install Python requirements. >>>>>>>>> >>>>>>>>> On Tue, Nov 9, 2021 at 2:48 PM Yogesh Mahajan < >>>>>>>>> [email protected]> wrote: >>>>>>>>> >>>>>>>>>> Hi, >>>>>>>>>> >>>>>>>>>> Please find the attached patch which fixes feature tests broken >>>>>>>>>> due to react porting changes. >>>>>>>>>> >>>>>>>>>> Thanks, >>>>>>>>>> Yogesh Mahajan >>>>>>>>>> EnterpriseDB >>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> *Thanks & Regards* >>>>>>>>> *Akshay Joshi* >>>>>>>>> *pgAdmin Hacker | Principal Software Architect* >>>>>>>>> *EDB Postgres <http://edbpostgres.com>* >>>>>>>>> >>>>>>>>> *Mobile: +91 976-788-8246* >>>>>>>>> >>>>>>>> >>>>>>> >>>>>>> -- >>>>>>> *Thanks & Regards* >>>>>>> *Akshay Joshi* >>>>>>> *pgAdmin Hacker | Principal Software Architect* >>>>>>> *EDB Postgres <http://edbpostgres.com>* >>>>>>> >>>>>>> *Mobile: +91 976-788-8246* >>>>>>> >>>>>> >>>>> >>>>> -- >>>>> *Thanks & Regards* >>>>> *Akshay Joshi* >>>>> *pgAdmin Hacker | Principal Software Architect* >>>>> *EDB Postgres <http://edbpostgres.com>* >>>>> >>>>> *Mobile: +91 976-788-8246* >>>>> >>>> >>> >>> -- >>> *Thanks & Regards* >>> *Akshay Joshi* >>> *pgAdmin Hacker | Principal Software Architect* >>> *EDB Postgres <http://edbpostgres.com>* >>> >>> *Mobile: +91 976-788-8246* >>> >> > > -- > *Thanks & Regards* > *Akshay Joshi* > *pgAdmin Hacker | Principal Software Architect* > *EDB Postgres <http://edbpostgres.com>* > > *Mobile: +91 976-788-8246* > Attachments: [application/octet-stream] Feature_Test_Fix_React_Porting_v6.patch (3.0K, 3-Feature_Test_Fix_React_Porting_v6.patch) download | inline diff: diff --git a/web/pgadmin/feature_tests/query_tool_journey_test.py b/web/pgadmin/feature_tests/query_tool_journey_test.py index c0e7f442c..09ce2781a 100644 --- a/web/pgadmin/feature_tests/query_tool_journey_test.py +++ b/web/pgadmin/feature_tests/query_tool_journey_test.py @@ -150,6 +150,9 @@ class QueryToolJourneyTest(BaseFeatureTest): def _test_history_tab(self): self.page.clear_query_tool() + self.page.driver.switch_to.frame( + self.page.driver.find_element_by_tag_name("iframe")) + editor_input = self.page.find_by_css_selector( QueryToolLocators.query_editor_panel) self.page.click_element(editor_input) @@ -197,6 +200,8 @@ class QueryToolJourneyTest(BaseFeatureTest): self.page.click_tab(self.query_editor_tab_name) self.page.clear_query_tool() + self.page.driver.switch_to.frame( + self.page.driver.find_element_by_tag_name("iframe")) self.page.click_element(editor_input) # Check if 15 more query executed then the history should contain 17 @@ -221,6 +226,8 @@ class QueryToolJourneyTest(BaseFeatureTest): self._test_toggle_generated_queries() def _test_history_query_sources(self): + self.page.driver.switch_to.frame( + self.page.driver.find_element_by_tag_name("iframe")) self.page.click_tab(self.query_editor_tab_name) self._execute_sources_test_queries() @@ -297,7 +304,11 @@ class QueryToolJourneyTest(BaseFeatureTest): query = "SELECT pk_column FROM %s" % self.test_editable_table_name self.page.execute_query(query) # Discard changes made by previous test to data grid - self.page.click_modal('Yes') + self.page.driver.switch_to.default_content() + self.page.click_modal('Yes', True) + self.page.driver.switch_to.frame( + self.page.driver.find_element_by_tag_name("iframe")) + icon_exists = self.page.check_if_element_exist_by_xpath( QueryToolLocators.editable_column_icon_xpath ) @@ -418,7 +429,8 @@ class QueryToolJourneyTest(BaseFeatureTest): self.page.click_element( self.page.find_by_css_selector(QueryToolLocators.btn_clear_history) ) - self.page.click_modal('Yes') + self.driver.switch_to.default_content() + self.page.click_modal('Yes', True) def _navigate_to_query_tool(self): self.page.expand_database_node("Server", self.server['name'], @@ -448,7 +460,11 @@ class QueryToolJourneyTest(BaseFeatureTest): discard_changes_modal=False): self.page.execute_query(query) if discard_changes_modal: - self.page.click_modal('Yes') + self.driver.switch_to.default_content() + self.page.click_modal('Yes', True) + self.page.driver.switch_to.frame( + self.page.driver.find_element_by_tag_name("iframe")) + enumerated_should_be_editable = enumerate(cols_should_be_editable, 1) import time ^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Feature Test Fix - React porting @ 2021-12-21 12:42 Akshay Joshi <[email protected]> parent: Yogesh Mahajan <[email protected]> 0 siblings, 0 replies; 12+ messages in thread From: Akshay Joshi @ 2021-12-21 12:42 UTC (permalink / raw) To: Yogesh Mahajan <[email protected]>; +Cc: pgadmin-hackers Thanks, the patch applied. On Tue, Dec 21, 2021 at 4:31 PM Yogesh Mahajan < [email protected]> wrote: > Hi Team, > > Please find feature tests fix that are broken due to react porting for > alert dialogues. > > Thanks, > Yogesh Mahajan > EnterpriseDB > > > On Tue, Nov 23, 2021 at 5:38 PM Akshay Joshi < > [email protected]> wrote: > >> Thanks, the patch applied. >> >> On Tue, Nov 23, 2021 at 4:32 PM Yogesh Mahajan < >> [email protected]> wrote: >> >>> Hi, >>> >>> Please find the attached patch to fix feature test failures due to react >>> porting for backup dialogue. >>> >>> Thanks, >>> Yogesh Mahajan >>> EnterpriseDB >>> >>> >>> On Mon, Nov 22, 2021 at 6:09 PM Akshay Joshi < >>> [email protected]> wrote: >>> >>>> Thanks, the patch applied. >>>> >>>> On Mon, Nov 22, 2021 at 12:58 PM Yogesh Mahajan < >>>> [email protected]> wrote: >>>> >>>>> Hi, >>>>> >>>>> Please find the attached patch which adds flexibility to wait for >>>>> launching pgAdmin. >>>>> >>>>> Thanks, >>>>> Yogesh Mahajan >>>>> EnterpriseDB >>>>> >>>>> >>>>> On Thu, Nov 18, 2021 at 5:15 PM Akshay Joshi < >>>>> [email protected]> wrote: >>>>> >>>>>> Thanks, the patch applied. >>>>>> >>>>>> On Thu, Nov 18, 2021 at 3:23 PM Yogesh Mahajan < >>>>>> [email protected]> wrote: >>>>>> >>>>>>> Hi, >>>>>>> >>>>>>> Please find the attached patch which fixes the problem related to >>>>>>> feature tests. >>>>>>> >>>>>>> >>>>>>> Thanks, >>>>>>> Yogesh Mahajan >>>>>>> EnterpriseDB >>>>>>> >>>>>>> >>>>>>> On Fri, Nov 12, 2021 at 11:59 AM Akshay Joshi < >>>>>>> [email protected]> wrote: >>>>>>> >>>>>>>> Thanks, the patch applied. >>>>>>>> >>>>>>>> On Thu, Nov 11, 2021 at 10:04 PM Yogesh Mahajan < >>>>>>>> [email protected]> wrote: >>>>>>>> >>>>>>>>> Hi, >>>>>>>>> >>>>>>>>> Please find the attached patch which uses selenium 4.0.0a6 which >>>>>>>>> works with python 3.6.8. >>>>>>>>> Selenium 4.0.0 requires python 3.7+ >>>>>>>>> >>>>>>>>> Thanks, >>>>>>>>> Yogesh Mahajan >>>>>>>>> EnterpriseDB >>>>>>>>> >>>>>>>>> >>>>>>>>> On Wed, Nov 10, 2021 at 11:59 AM Akshay Joshi < >>>>>>>>> [email protected]> wrote: >>>>>>>>> >>>>>>>>>> Thanks, the patch applied. but Jenkins is failing with the below >>>>>>>>>> error: >>>>>>>>>> ERROR: No matching distribution found for selenium==4.0.0 >>>>>>>>>> ERROR: Failed to install Python requirements. >>>>>>>>>> >>>>>>>>>> On Tue, Nov 9, 2021 at 2:48 PM Yogesh Mahajan < >>>>>>>>>> [email protected]> wrote: >>>>>>>>>> >>>>>>>>>>> Hi, >>>>>>>>>>> >>>>>>>>>>> Please find the attached patch which fixes feature tests broken >>>>>>>>>>> due to react porting changes. >>>>>>>>>>> >>>>>>>>>>> Thanks, >>>>>>>>>>> Yogesh Mahajan >>>>>>>>>>> EnterpriseDB >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> *Thanks & Regards* >>>>>>>>>> *Akshay Joshi* >>>>>>>>>> *pgAdmin Hacker | Principal Software Architect* >>>>>>>>>> *EDB Postgres <http://edbpostgres.com>* >>>>>>>>>> >>>>>>>>>> *Mobile: +91 976-788-8246* >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> *Thanks & Regards* >>>>>>>> *Akshay Joshi* >>>>>>>> *pgAdmin Hacker | Principal Software Architect* >>>>>>>> *EDB Postgres <http://edbpostgres.com>* >>>>>>>> >>>>>>>> *Mobile: +91 976-788-8246* >>>>>>>> >>>>>>> >>>>>> >>>>>> -- >>>>>> *Thanks & Regards* >>>>>> *Akshay Joshi* >>>>>> *pgAdmin Hacker | Principal Software Architect* >>>>>> *EDB Postgres <http://edbpostgres.com>* >>>>>> >>>>>> *Mobile: +91 976-788-8246* >>>>>> >>>>> >>>> >>>> -- >>>> *Thanks & Regards* >>>> *Akshay Joshi* >>>> *pgAdmin Hacker | Principal Software Architect* >>>> *EDB Postgres <http://edbpostgres.com>* >>>> >>>> *Mobile: +91 976-788-8246* >>>> >>> >> >> -- >> *Thanks & Regards* >> *Akshay Joshi* >> *pgAdmin Hacker | Principal Software Architect* >> *EDB Postgres <http://edbpostgres.com>* >> >> *Mobile: +91 976-788-8246* >> > -- *Thanks & Regards* *Akshay Joshi* *pgAdmin Hacker | Principal Software Architect* *EDB Postgres <http://edbpostgres.com>* *Mobile: +91 976-788-8246* ^ permalink raw reply [nested|flat] 12+ messages in thread
end of thread, other threads:[~2021-12-21 12:42 UTC | newest] Thread overview: 12+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2021-11-09 09:17 Feature Test Fix - React porting Yogesh Mahajan <[email protected]> 2021-11-10 06:29 ` Akshay Joshi <[email protected]> 2021-11-11 16:33 ` Yogesh Mahajan <[email protected]> 2021-11-12 06:28 ` Akshay Joshi <[email protected]> 2021-11-18 09:53 ` Yogesh Mahajan <[email protected]> 2021-11-18 11:45 ` Akshay Joshi <[email protected]> 2021-11-22 07:27 ` Yogesh Mahajan <[email protected]> 2021-11-22 12:39 ` Akshay Joshi <[email protected]> 2021-11-23 11:01 ` Yogesh Mahajan <[email protected]> 2021-11-23 12:07 ` Akshay Joshi <[email protected]> 2021-12-21 11:00 ` Yogesh Mahajan <[email protected]> 2021-12-21 12:42 ` Akshay Joshi <[email protected]>
This inbox is served by agora; see mirroring instructions for how to clone and mirror all data and code used for this inbox