From 0668a52c6bbc919c33575ebeb3e47dd71ffcb6e6 Mon Sep 17 00:00:00 2001 From: Yogesh Mahajan Date: Wed, 19 Aug 2020 13:22:17 +0530 Subject: [PATCH] Fixed following SonarQube issues: 1. String literals should not be duplicated. 2. Cognitive Complexity of functions should not be too high. --- .../pg_utilities_backup_restore_test.py | 129 ++++--- web/regression/feature_utils/pgadmin_page.py | 358 ++++++++++-------- web/regression/runtests.py | 118 +++--- 3 files changed, 347 insertions(+), 258 deletions(-) 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 9efdd9285..797e5bb87 100644 --- a/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py +++ b/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py @@ -72,39 +72,7 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest): self.server['db_password'], self.database_name) # Backup - self.page.retry_click( - (By.LINK_TEXT, - NavMenuLocators.tools_menu_link_text), - (By.CSS_SELECTOR, - NavMenuLocators.backup_obj_css)) - - backup_object = self.wait.until(EC.visibility_of_element_located( - (By.CSS_SELECTOR, NavMenuLocators.backup_obj_css))) - backup_object.click() - - # Enter the file name of the backup to be taken - self.wait.until(EC.visibility_of_element_located( - (By.NAME, NavMenuLocators.backup_filename_txt_box_name))) - element = self.wait.until(EC.element_to_be_clickable( - (By.NAME, NavMenuLocators.backup_filename_txt_box_name))) - element.click() - self.page.fill_input_by_field_name( - NavMenuLocators.backup_filename_txt_box_name, - "test_backup", loose_focus=True) - - # Click on the take Backup button - take_bckup = self.page.find_by_xpath( - NavMenuLocators.backup_btn_xpath) - click = True - while click: - try: - take_bckup.click() - if self.page.wait_for_element_to_disappear( - lambda driver: driver.find_element_by_name( - NavMenuLocators.backup_filename_txt_box_name)): - click = False - except Exception: - pass + self.initiate_backup() # Wait for the backup status alertfier self.wait.until(EC.visibility_of_element_located( @@ -123,8 +91,7 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest): ".loading-logs"), 10) expected_backup_success_msg = "Successfully completed." - if status != expected_backup_success_msg: - self.assertEquals(status, expected_backup_success_msg) + self.assertEquals(status, expected_backup_success_msg) backup_file = None # Check for XSS in Backup details @@ -151,31 +118,7 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest): test_gui_helper.close_process_watcher(self) # Restore - 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( - NavMenuLocators.restore_obj_css) - restore_obj.click() - - self.wait.until(EC.visibility_of_element_located( - (By.NAME, NavMenuLocators.restore_file_name_txt_box_name))) - - self.wait.until(EC.element_to_be_clickable( - (By.NAME, NavMenuLocators.restore_file_name_txt_box_name))).click() - - self.page.fill_input_by_field_name( - NavMenuLocators.restore_file_name_txt_box_name, - "test_backup", loose_focus=True) - - restore_btn = self.page.find_by_xpath( - NavMenuLocators.restore_button_xpath) - restore_btn.click() - - self.page.wait_for_element_to_disappear( - lambda driver: driver.find_element_by_css_selector( - NavMenuLocators.restore_file_name_txt_box_name)) + self.initiate_restore() # Wait for the backup status alertfier self.wait.until(EC.visibility_of_element_located( @@ -192,9 +135,7 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest): self.page.wait_for_element_to_disappear( lambda driver: driver.find_element_by_css_selector( ".loading-logs"), 10) - - if status != expected_backup_success_msg: - self.assertEquals(status, expected_backup_success_msg) + self.assertEquals(status, expected_backup_success_msg) # Check for XSS in Restore details if self.is_xss_check: @@ -239,6 +180,68 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest): '{0} detailed window'.format(tool_name) ) + def initiate_backup(self): + self.page.retry_click( + (By.LINK_TEXT, + NavMenuLocators.tools_menu_link_text), + (By.CSS_SELECTOR, + NavMenuLocators.backup_obj_css)) + + backup_object = self.wait.until(EC.visibility_of_element_located( + (By.CSS_SELECTOR, NavMenuLocators.backup_obj_css))) + backup_object.click() + + # Enter the file name of the backup to be taken + self.wait.until(EC.visibility_of_element_located( + (By.NAME, NavMenuLocators.backup_filename_txt_box_name))) + element = self.wait.until(EC.element_to_be_clickable( + (By.NAME, NavMenuLocators.backup_filename_txt_box_name))) + element.click() + self.page.fill_input_by_field_name( + NavMenuLocators.backup_filename_txt_box_name, + "test_backup", loose_focus=True) + + # Click on the take Backup button + take_bckup = self.page.find_by_xpath( + NavMenuLocators.backup_btn_xpath) + click = True + while click: + try: + take_bckup.click() + if self.page.wait_for_element_to_disappear( + 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.click() + + restore_obj = self.page.find_by_css_selector( + NavMenuLocators.restore_obj_css) + restore_obj.click() + + self.wait.until(EC.visibility_of_element_located( + (By.NAME, NavMenuLocators.restore_file_name_txt_box_name))) + + self.wait.until(EC.element_to_be_clickable( + (By.NAME, NavMenuLocators.restore_file_name_txt_box_name))).click() + + self.page.fill_input_by_field_name( + NavMenuLocators.restore_file_name_txt_box_name, + "test_backup", loose_focus=True) + + restore_btn = self.page.find_by_xpath( + NavMenuLocators.restore_button_xpath) + restore_btn.click() + + self.page.wait_for_element_to_disappear( + 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): # For XSS we need to search against element's html code assert source_code.find(string_to_find) != - \ diff --git a/web/regression/feature_utils/pgadmin_page.py b/web/regression/feature_utils/pgadmin_page.py index 15d775a12..749192de2 100644 --- a/web/regression/feature_utils/pgadmin_page.py +++ b/web/regression/feature_utils/pgadmin_page.py @@ -28,6 +28,8 @@ class PgadminPage: """ Helper class for interacting with the page, given a selenium driver """ + # Common argument passed for scrolling + js_executor_scrollintoview_arg = "arguments[0].scrollIntoView()" def __init__(self, driver, app_config): self.driver = driver @@ -99,17 +101,18 @@ class PgadminPage: (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'] + "']" try: WebDriverWait(self.driver, 10).until( EC.visibility_of_element_located( - (By.XPATH, - "//*[@id='tree']//*[.='" + server_config['name'] + "']"))) + (By.XPATH, server_tree_xpath))) except TimeoutException: self.toggle_open_servers_group() WebDriverWait(self.driver, 10).until( EC.visibility_of_element_located( - (By.XPATH, - "//*[@id='tree']//*[.='" + server_config['name'] + "']"))) + (By.XPATH, server_tree_xpath))) def open_query_tool(self): self.driver.find_element_by_link_text("Tools").click() @@ -222,34 +225,28 @@ class PgadminPage: if expanded == "false": query_options.click() - retry = 3 + 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) + if 'visibility-hidden' in check_status.get_attribute('class'): + while retry > 0: + self.find_by_css_selector(css_selector_of_option).click() + time.sleep(0.2) + if 'visibility-hidden' not in \ + check_status.get_attribute('class'): + break + else: + retry -= 1 if option == 'auto_commit': - check_status = self.driver.find_element_by_css_selector( - QueryToolLocators.btn_auto_commit_check_status) - if 'visibility-hidden' in check_status.get_attribute('class'): - while retry > 0: - self.find_by_css_selector( - QueryToolLocators.btn_auto_commit).click() - time.sleep(0.2) - if 'visibility-hidden' not in \ - check_status.get_attribute('class'): - break - else: - retry -= 1 - + update_execute_option_setting( + QueryToolLocators.btn_auto_commit_check_status, + QueryToolLocators.btn_auto_commit) if option == 'auto_rollback': - check_status = self.driver.find_element_by_css_selector( - QueryToolLocators.btn_auto_rollback_check_status) - if 'visibility-hidden' in check_status.get_attribute('class'): - while retry > 0: - self.find_by_css_selector( - QueryToolLocators.btn_auto_rollback).click() - time.sleep(0.2) - if 'visibility-hidden' not in \ - check_status.get_attribute('class'): - break - else: - retry -= 1 + update_execute_option_setting( + QueryToolLocators.btn_auto_rollback_check_status, + QueryToolLocators.btn_auto_rollback) def uncheck_execute_option(self, option): """"This function will uncheck auto commit or auto roll back based on @@ -260,33 +257,30 @@ class PgadminPage: if expanded == "false": query_options.click() - retry = 3 + 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) + if 'visibility-hidden' not in check_status.get_attribute('class'): + while retry > 0: + self.find_by_css_selector( + css_selector_of_option).click() + time.sleep(0.2) + if 'visibility-hidden' in \ + check_status.get_attribute('class'): + break + else: + retry -= 1 + if option == 'auto_commit': - check_status = self.driver.find_element_by_css_selector( - QueryToolLocators.btn_auto_commit_check_status) - if 'visibility-hidden' not in check_status.get_attribute('class'): - while retry > 0: - self.find_by_css_selector( - QueryToolLocators.btn_auto_commit).click() - time.sleep(0.2) - if 'visibility-hidden' in \ - check_status.get_attribute('class'): - break - else: - retry -= 1 + update_execute_option_setting( + QueryToolLocators.btn_auto_commit_check_status, + QueryToolLocators.btn_auto_commit) if option == 'auto_rollback': - check_status = self.driver.find_element_by_css_selector( - QueryToolLocators.btn_auto_rollback_check_status) - if 'visibility-hidden' not in check_status.get_attribute('class'): - while retry > 0: - self.find_by_css_selector( - QueryToolLocators.btn_auto_rollback).click() - time.sleep(0.2) - if 'visibility-hidden' in \ - check_status.get_attribute('class'): - break - else: - retry -= 1 + update_execute_option_setting( + QueryToolLocators.btn_auto_rollback_check_status, + QueryToolLocators.btn_auto_rollback) def close_data_grid(self): self.driver.switch_to_default_content() @@ -299,7 +293,7 @@ class PgadminPage: "//*[@id='tree']//*[.='" + server_config['name'] + "' and @class='aciTreeItem']") self.driver.execute_script( - "arguments[0].scrollIntoView()", server_to_remove) + 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) @@ -311,7 +305,7 @@ class PgadminPage: item = self.find_by_xpath( "//*[@id='tree']//*[contains(text(), '" + tree_item_text + "')]" "/parent::span[@class='aciTreeItem']") - self.driver.execute_script("arguments[0].scrollIntoView()", item) + self.driver.execute_script(self.js_executor_scrollintoview_arg, item) # unexpected exception like element overlapping, click attempts more # than one time attempts = 3 @@ -336,7 +330,7 @@ class PgadminPage: elements, element_name) if index_of_element >= 0: self.driver.execute_script( - "arguments[0].scrollIntoView()", + self.js_executor_scrollintoview_arg, list_of_element[index_of_element]) self.wait_for_elements_to_appear( self.driver, list_of_element[index_of_element]) @@ -396,31 +390,12 @@ class PgadminPage: index_of_server_node = self.get_index_of_element( subnodes_of_servers, server_name) - 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): - 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]): - 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_expansion_status = True - else: - server_node_expansion_status = True + 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) else: print( "(expand_server_node) The Servers node is" @@ -428,6 +403,46 @@ class PgadminPage: file=sys.stderr) return server_node_expansion_status + def click_expand_server_node(self, subnodes_of_servers_expansion_status, + index_of_server_node, subnodes_of_servers, + server_name, server_password): + """ + 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: + :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): + 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]): + 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_expansion_status = True + else: + server_node_expansion_status = True + 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 @@ -447,20 +462,11 @@ class PgadminPage: expansion_status = self.get_expansion_status_of_node_element( subnode_of_server_node_exp_status[index_of_databases_node]) if not expansion_status: - retry = 5 - 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 + 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: @@ -468,11 +474,73 @@ class PgadminPage: file=sys.stderr) return databases_node_expanded + def click_to_expand_databases_node(self, subnodes_of_server_node, + index_of_databases_node, server_name): + """ + Method clicks on databases node of specified server to expand + :param subnodes_of_server_node: + :param index_of_databases_node: + :param server_name: + :return: True if database node click is successful & expanded + """ + 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 + + def click_to_expand_database_node(self, sub_nodes_of_databases_node, + index_of_required_db_node, + name_of_database): + """ + 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 + """ + 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() + 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 + 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 - retry = 5 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)) @@ -486,28 +554,9 @@ class PgadminPage: server_name))[ index_of_required_db_node]) if not expansion_status: - self.driver.execute_script("arguments[0].scrollIntoView()", - 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() - 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 - 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 + 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 else: @@ -533,7 +582,7 @@ class PgadminPage: index_of_schemas_node]) if not expansion_status: self.driver.execute_script( - "arguments[0].scrollIntoView()", + 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() @@ -570,7 +619,7 @@ class PgadminPage: index_of_schema_node]) if not expansion_status: self.driver.execute_script( - "arguments[0].scrollIntoView()", + 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() @@ -606,7 +655,7 @@ class PgadminPage: 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("arguments[0].scrollIntoView()", + self.driver.execute_script(self.js_executor_scrollintoview_arg, sub_nodes_of_schema_node[ index_of_tables_node]) webdriver.ActionChains(self.driver).double_click( @@ -778,7 +827,7 @@ class PgadminPage: item_with_text = self.find_by_xpath( TreeAreaLocators.specified_tree_node.format(tree_item_text)) - self.driver.execute_script("arguments[0].scrollIntoView()", + self.driver.execute_script(self.js_executor_scrollintoview_arg, item_with_text) if item_with_text.find_element_by_xpath( @@ -1170,33 +1219,46 @@ class PgadminPage: switch_box_element = self.find_by_xpath(switch_box) if required_status == 'Yes': - if 'off' in switch_box_element.get_attribute("class"): - switch_box_element.click() - time.sleep(1) - if 'success' in switch_box_element.get_attribute("class"): - status_changed_successfully = True - else: - print( - "(set_switch_box_status)Clicked the " - "element to change its status but " - "it did not changed", - file=sys.stderr) - elif 'success' in switch_box_element.get_attribute("class"): - status_changed_successfully = True + status_changed_successfully = \ + self.toggle_switch_box(switch_box_element, + expected_attr_in_class_tag='success', + unexpected_attr_in_class_tag='off') else: - if 'success' in switch_box_element.get_attribute("class"): - switch_box_element.click() - if 'off' in switch_box_element.get_attribute("class"): - status_changed_successfully = True - else: - print( - "(set_switch_box_status)Clicked the element to " - "change its status but it did not changed", - file=sys.stderr) - elif 'off' in switch_box_element.get_attribute("class"): - status_changed_successfully = True + status_changed_successfully = \ + self.toggle_switch_box(switch_box_element, + expected_attr_in_class_tag='off', + unexpected_attr_in_class_tag='success') return status_changed_successfully + def toggle_switch_box(self, switch_box_ele, expected_attr_in_class_tag, + unexpected_attr_in_class_tag): + """ + Method toggles switch box status using attributes from class tag + :param switch_box_ele: + :param expected_attr_in_class_tag: e.g. 'off', success + :param unexpected_attr_in_class_tag: e.g. 'off', success + :return: True if class tag attribute is to expected attribute value + in class tag. + """ + status_changed = False + if unexpected_attr_in_class_tag in switch_box_ele.get_attribute( + "class"): + switch_box_ele.click() + time.sleep(1) + if expected_attr_in_class_tag in switch_box_ele.get_attribute( + "class"): + status_changed = True + else: + print( + "(set_switch_box_status)Clicked the " + "element to change its status but " + "it did not changed", + file=sys.stderr) + elif expected_attr_in_class_tag in switch_box_ele.get_attribute( + "class"): + status_changed = True + return status_changed + def retry_click(self, click_locator, verify_locator): click_status = False attempt = 0 diff --git a/web/regression/runtests.py b/web/regression/runtests.py index c49b30860..94c39cdf5 100644 --- a/web/regression/runtests.py +++ b/web/regression/runtests.py @@ -214,53 +214,7 @@ def get_test_modules(arguments): exclude_pkgs.extend(['resql']) if not test_utils.is_parallel_ui_tests(args): - from selenium import webdriver - from selenium.webdriver.chrome.options import Options - from selenium.webdriver.common.desired_capabilities import \ - DesiredCapabilities - - default_browser = 'chrome' - - # Check default browser provided through command line. If provided - # then use that browser as default browser else check for the - # setting provided in test_config.json file. - if ( - 'default_browser' in arguments and - arguments['default_browser'] is not None - ): - default_browser = arguments['default_browser'].lower() - elif ( - test_setup.config_data and - "default_browser" in test_setup.config_data - ): - default_browser = test_setup.config_data[ - 'default_browser'].lower() - - if default_browser == 'firefox': - cap = DesiredCapabilities.FIREFOX - cap['requireWindowFocus'] = True - cap['enablePersistentHover'] = False - profile = webdriver.FirefoxProfile() - profile.set_preference("dom.disable_beforeunload", True) - driver = webdriver.Firefox(capabilities=cap, - firefox_profile=profile) - driver.implicitly_wait(1) - else: - options = Options() - if test_setup.config_data and \ - 'headless_chrome' in test_setup.config_data and \ - test_setup.config_data['headless_chrome']: - 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("--disable-infobars") - options.add_experimental_option('w3c', False) - driver = webdriver.Chrome(chrome_options=options) - - # maximize browser window - driver.maximize_window() - + driver = setup_webdriver_specification(arguments) app_starter = AppStarter(driver, config) app_starter.start_app() @@ -268,6 +222,76 @@ def get_test_modules(arguments): # Register cleanup function to cleanup on exit atexit.register(handle_cleanup) + # Load Test modules + module_list = load_modules(arguments, exclude_pkgs) + return module_list + + +def setup_webdriver_specification(arguments): + """ + Method return web-driver object set up according to values passed + in arguments + :param arguments: + :return: webdriver object + """ + from selenium import webdriver + from selenium.webdriver.chrome.options import Options + from selenium.webdriver.common.desired_capabilities import \ + DesiredCapabilities + + default_browser = 'chrome' + + # Check default browser provided through command line. If provided + # then use that browser as default browser else check for the + # setting provided in test_config.json file. + if ( + 'default_browser' in arguments and + arguments['default_browser'] is not None + ): + default_browser = arguments['default_browser'].lower() + elif ( + test_setup.config_data and + "default_browser" in test_setup.config_data + ): + default_browser = test_setup.config_data[ + 'default_browser'].lower() + + if default_browser == 'firefox': + cap = DesiredCapabilities.FIREFOX + cap['requireWindowFocus'] = True + cap['enablePersistentHover'] = False + profile = webdriver.FirefoxProfile() + profile.set_preference("dom.disable_beforeunload", True) + driver_local = webdriver.Firefox(capabilities=cap, + firefox_profile=profile) + driver_local.implicitly_wait(1) + else: + options = Options() + if test_setup.config_data and \ + 'headless_chrome' in test_setup.config_data and \ + test_setup.config_data['headless_chrome']: + 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("--disable-infobars") + options.add_experimental_option('w3c', False) + driver_local = webdriver.Chrome(chrome_options=options) + + # maximize browser window + driver_local.maximize_window() + return driver_local + + +def load_modules(arguments, exclude_pkgs): + """ + Method returns list of modules which is formed by removing packages from + exclude_pkgs arguments. + :param arguments: + :param exclude_pkgs: + :return: + """ + from pgadmin.utils.route import TestsGeneratorRegistry # Load the test modules which are in given package(i.e. in arguments.pkg) if arguments['pkg'] is None or arguments['pkg'] == "all": TestsGeneratorRegistry.load_generators('pgadmin', exclude_pkgs)