Fixed feature test failures on the selenium grid for concurrent execution.
parent
96939ba985
commit
d927a517aa
|
@ -92,14 +92,17 @@ def get_browser_version(browser_name, executable_path):
|
|||
# Mozilla Firefox 75.0
|
||||
if 'esr' in version_str:
|
||||
firefox_version = '.'.join(
|
||||
version_str.split()[-1].split('.')[:-2]) + '.0'
|
||||
version_str.split('esr')[0].split()[-1].split('.')[:-1])
|
||||
else:
|
||||
firefox_version = '.'.join(
|
||||
version_str.split()[-1].split('.')[:-1]) + '.0'
|
||||
version_str.split()[-1].split('.')[:-1])
|
||||
|
||||
if firefox_version.count('.') == 0:
|
||||
firefox_version = firefox_version + '.0'
|
||||
|
||||
# Make sure browser version has only 1 decimal point
|
||||
if firefox_version.count('.') != 1:
|
||||
print('The specified Chrome executable output an unexpected '
|
||||
print('The specified Firefox executable output an unexpected '
|
||||
'version string: {}.'.format(version_str))
|
||||
sys.exit(1)
|
||||
browser_version_val = firefox_version
|
||||
|
@ -215,7 +218,7 @@ def edit_browsers_json(browser_name, browser_version):
|
|||
data_to_insert = dict(
|
||||
{browser_version: {
|
||||
'image': 'selenoid/vnc_firefox:' + browser_version,
|
||||
'port': '4444', 'path': '/'}})
|
||||
'port': '4444', 'path': '/wd/hub'}})
|
||||
(existing_data['firefox']['versions']).update(data_to_insert)
|
||||
updated_data = existing_data
|
||||
else:
|
||||
|
|
|
@ -71,6 +71,8 @@ class CheckFileManagerFeatureTest(BaseFeatureTest):
|
|||
self.page.find_by_css_selector(QueryToolLocators.btn_save_file) \
|
||||
.click()
|
||||
# Set the XSS value in input
|
||||
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located(
|
||||
(By.CSS_SELECTOR, ".change_file_types")))
|
||||
self.page.find_by_css_selector('.change_file_types')
|
||||
self.page.fill_input_by_css_selector(
|
||||
QueryToolLocators.input_file_path_css, self.XSS_FILE)
|
||||
|
@ -82,6 +84,8 @@ class CheckFileManagerFeatureTest(BaseFeatureTest):
|
|||
load_file = self.page.find_by_css_selector(
|
||||
QueryToolLocators.btn_load_file_css)
|
||||
load_file.click()
|
||||
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located(
|
||||
(By.CSS_SELECTOR, ".change_file_types")))
|
||||
self.page.find_by_css_selector('.change_file_types')
|
||||
self.page.fill_input_by_css_selector(
|
||||
QueryToolLocators.input_file_path_css,
|
||||
|
|
|
@ -86,9 +86,15 @@ class PGDataypeFeatureTest(BaseFeatureTest):
|
|||
NavMenuLocators.file_menu_css)
|
||||
file_menu.click()
|
||||
|
||||
pref_menu_item = self.page.find_by_css_selector(
|
||||
NavMenuLocators.preference_menu_item_css)
|
||||
pref_menu_item.click()
|
||||
# pref_menu_item = self.page.find_by_css_selector(
|
||||
# NavMenuLocators.preference_menu_item_css)
|
||||
# pref_menu_item.click()
|
||||
|
||||
self.page.retry_click(
|
||||
(By.CSS_SELECTOR, NavMenuLocators.preference_menu_item_css),
|
||||
(By.XPATH, NavMenuLocators.specified_preference_tree_node
|
||||
.format('Browser'))
|
||||
)
|
||||
|
||||
wait = WebDriverWait(self.page.driver, 10)
|
||||
|
||||
|
|
|
@ -14,7 +14,8 @@ import random
|
|||
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
|
||||
from selenium.common.exceptions import StaleElementReferenceException, \
|
||||
WebDriverException
|
||||
from regression.feature_utils.locators import QueryToolLocators
|
||||
from regression.feature_utils.tree_area_locators import TreeAreaLocators
|
||||
|
||||
|
@ -68,10 +69,19 @@ class CheckForXssFeatureTest(BaseFeatureTest):
|
|||
|
||||
# sometime the tab for dependent does not show info, so refreshing
|
||||
# the page and then again collapsing until the table node
|
||||
self.page.refresh_page()
|
||||
self.page.toggle_open_servers_group()
|
||||
self._tables_node_expandable()
|
||||
self._check_xss_in_dependents_tab()
|
||||
retry = 2
|
||||
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
|
||||
except WebDriverException as e:
|
||||
print("Exception in dependent check {0}".format(retry))
|
||||
if retry == 1:
|
||||
raise e
|
||||
retry -= 1
|
||||
|
||||
# Query tool
|
||||
self.page.open_query_tool()
|
||||
|
@ -145,12 +155,22 @@ class CheckForXssFeatureTest(BaseFeatureTest):
|
|||
"\n\tChecking the Dependents tab for XSS vulnerabilities",
|
||||
file=sys.stderr, end=""
|
||||
)
|
||||
self.page.click_tab("Dependents")
|
||||
|
||||
source_code = self.page.find_by_xpath(
|
||||
"//*[@id='5']/table/tbody/tr/td/div/div/div[2]/"
|
||||
"table/tbody/tr/td[2]"
|
||||
).get_attribute('innerHTML')
|
||||
retry = 2
|
||||
while retry > 0:
|
||||
try:
|
||||
self.page.click_tab("Dependents")
|
||||
source_code = \
|
||||
self.page.find_by_xpath("//*[@id='5']/table/tbody/tr/td/"
|
||||
"div/div/div[2]/table/tbody/tr/"
|
||||
"td[2]").get_attribute('innerHTML')
|
||||
retry = 0
|
||||
except WebDriverException as e:
|
||||
print("Exception in dependent tab {0}")
|
||||
self.page.click_tab("Dependencies")
|
||||
if retry == 1:
|
||||
raise e
|
||||
retry -= 1
|
||||
|
||||
self._check_escaped_characters(
|
||||
source_code,
|
||||
|
|
|
@ -14,7 +14,7 @@ import sys
|
|||
from selenium import webdriver
|
||||
from selenium.common.exceptions import NoSuchElementException, \
|
||||
WebDriverException, TimeoutException, NoSuchWindowException, \
|
||||
StaleElementReferenceException
|
||||
StaleElementReferenceException, ElementNotInteractableException
|
||||
from selenium.webdriver import ActionChains
|
||||
from selenium.webdriver.common.keys import Keys
|
||||
from selenium.webdriver.support import expected_conditions as EC
|
||||
|
@ -71,12 +71,24 @@ class PgadminPage:
|
|||
def add_server(self, server_config):
|
||||
self.find_by_xpath(
|
||||
"//*[@class='aciTreeText' and contains(.,'Servers')]").click()
|
||||
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()
|
||||
|
||||
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()
|
||||
|
||||
WebDriverWait(self.driver, 5).until(EC.visibility_of_element_located(
|
||||
(By.XPATH, "//div[text()='Create - Server']")))
|
||||
|
||||
# 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()
|
||||
|
@ -162,6 +174,11 @@ class PgadminPage:
|
|||
self.click_element(self.find_by_xpath(
|
||||
'//button[contains(@class, "ajs-button") and '
|
||||
'contains(.,"Don\'t save")]'))
|
||||
|
||||
if self.check_if_element_exist_by_xpath(
|
||||
"//button[text()='Rollback']", 1):
|
||||
self.click_element(
|
||||
self.find_by_xpath("//button[text()='Rollback']"))
|
||||
self.driver.switch_to.default_content()
|
||||
|
||||
def clear_query_tool(self):
|
||||
|
@ -200,6 +217,12 @@ 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)
|
||||
expanded = query_options.get_attribute("aria-expanded")
|
||||
if expanded == "false":
|
||||
query_options.click()
|
||||
|
||||
retry = 3
|
||||
if option == 'auto_commit':
|
||||
check_status = self.driver.find_element_by_css_selector(
|
||||
|
@ -232,6 +255,12 @@ class PgadminPage:
|
|||
def uncheck_execute_option(self, option):
|
||||
""""This function will uncheck auto commit or auto roll back based on
|
||||
user input. If button is already unchecked, no action will be taken"""
|
||||
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()
|
||||
|
||||
retry = 3
|
||||
if option == 'auto_commit':
|
||||
check_status = self.driver.find_element_by_css_selector(
|
||||
|
@ -917,17 +946,29 @@ class PgadminPage:
|
|||
except (NoSuchElementException, WebDriverException):
|
||||
return False
|
||||
time.sleep(1)
|
||||
self.driver.switch_to.default_content()
|
||||
self.driver.switch_to_frame(
|
||||
self.driver.find_element_by_tag_name("iframe"))
|
||||
self.find_by_xpath("//a[text()='Query Editor']").click()
|
||||
codemirror_ele = WebDriverWait(
|
||||
self.driver, timeout=self.timeout, poll_frequency=0.01)\
|
||||
.until(find_codemirror,
|
||||
"Timed out waiting for codemirror to appear")
|
||||
self.wait_for_query_tool_loading_indicator_to_disappear(12)
|
||||
|
||||
time.sleep(1)
|
||||
codemirror_ele.click()
|
||||
retry = 2
|
||||
while retry > 0:
|
||||
try:
|
||||
self.driver.switch_to.default_content()
|
||||
WebDriverWait(self.driver, 10).until(
|
||||
EC.frame_to_be_available_and_switch_to_it(
|
||||
(By.TAG_NAME, "iframe")))
|
||||
self.find_by_xpath("//a[text()='Query Editor']").click()
|
||||
|
||||
codemirror_ele = WebDriverWait(
|
||||
self.driver, timeout=self.timeout, poll_frequency=0.01) \
|
||||
.until(find_codemirror,
|
||||
"Timed out waiting for codemirror to appear")
|
||||
codemirror_ele.click()
|
||||
retry = 0
|
||||
except WebDriverException as e:
|
||||
print("Exception in filling code mirror {0} ".format(retry))
|
||||
print(str(e))
|
||||
if retry == 0:
|
||||
raise e
|
||||
retry -= 1
|
||||
|
||||
# Use send keys if input_keys true, else use javascript to set content
|
||||
if input_keys:
|
||||
|
|
|
@ -29,6 +29,7 @@ import json
|
|||
from selenium import webdriver
|
||||
from selenium.webdriver.chrome.options import Options
|
||||
from selenium.webdriver.support import expected_conditions as ec
|
||||
import selenium.common.exceptions
|
||||
|
||||
import config
|
||||
import regression
|
||||
|
@ -1262,7 +1263,8 @@ def get_selenium_grid_status_and_browser_list(selenoid_url):
|
|||
if browser["version"] is None:
|
||||
print("Specified version of browser is None. Hence "
|
||||
"latest version of {0} available with selenoid "
|
||||
"server will be used.\n".format(browser["name"]))
|
||||
"server will be used.\n".format(browser["name"]),
|
||||
file=sys.stderr)
|
||||
browser_list.append(browser)
|
||||
elif browser["version"] in versions.keys():
|
||||
browser_list.append(browser)
|
||||
|
@ -1273,10 +1275,11 @@ def get_selenium_grid_status_and_browser_list(selenoid_url):
|
|||
print("Specified Version = {0}".format(
|
||||
browser["version"]))
|
||||
else:
|
||||
print("{0} is NOT available".format(browser["name"]))
|
||||
print("{0} is NOT available".format(browser["name"]),
|
||||
file=sys.stderr)
|
||||
except Exception as e:
|
||||
(str(e))
|
||||
print("Unable to find Selenoid Status")
|
||||
print("Unable to find Selenoid Status", file=sys.stderr)
|
||||
|
||||
return selenoid_status, browser_list
|
||||
|
||||
|
@ -1299,7 +1302,7 @@ def is_feature_test_included(arguments):
|
|||
return feature_test_tobe_included
|
||||
|
||||
|
||||
def launch_url_in_browser(driver_instance, url, title='pgAdmin 4', timeout=40):
|
||||
def launch_url_in_browser(driver_instance, url, title='pgAdmin 4', timeout=50):
|
||||
"""
|
||||
Function launches urls in specified driver instance
|
||||
:param driver_instance:browser instance
|
||||
|
@ -1338,7 +1341,6 @@ def get_remote_webdriver(hub_url, browser, browser_ver, test_name):
|
|||
test_name = browser + browser_ver + "_" + test_name + "-" + time.strftime(
|
||||
"%m_%d_%y_%H_%M_%S", time.localtime())
|
||||
driver_local = None
|
||||
|
||||
desired_capabilities = {
|
||||
"version": browser_ver,
|
||||
"enableVNC": True,
|
||||
|
@ -1347,7 +1349,8 @@ def get_remote_webdriver(hub_url, browser, browser_ver, test_name):
|
|||
"videoName": test_name + ".mp4",
|
||||
"logName": test_name + ".log",
|
||||
"name": test_name,
|
||||
"timeZone": "Asia/Kolkata"
|
||||
"timeZone": "Asia/Kolkata",
|
||||
"sessionTimeout": "180s"
|
||||
}
|
||||
|
||||
if browser == 'firefox':
|
||||
|
@ -1467,3 +1470,18 @@ def get_selenium_grid_status_json(selenoid_url):
|
|||
print("Unable to find Selenoid Status.Kindly check url passed -'{0}'".
|
||||
format(selenoid_url))
|
||||
return None
|
||||
|
||||
|
||||
def quit_webdriver(driver):
|
||||
"""
|
||||
Function closes webdriver instance
|
||||
:param driver:
|
||||
"""
|
||||
try:
|
||||
driver.quit()
|
||||
except selenium.common.exceptions.InvalidSessionIdException:
|
||||
print("Driver object is already closed.")
|
||||
except Exception as e:
|
||||
print("Some Other exception occurred.")
|
||||
traceback.print_exc(file=sys.stderr)
|
||||
print(str(e))
|
||||
|
|
|
@ -510,7 +510,7 @@ def execute_test(test_module_list_passed, server_passed, driver_passed):
|
|||
# Delete web-driver instance
|
||||
thread_name = "parallel_tests" + server_passed['name']
|
||||
if threading.currentThread().getName() == thread_name:
|
||||
driver_passed.quit()
|
||||
test_utils.quit_webdriver(driver_passed)
|
||||
time.sleep(20)
|
||||
|
||||
# Print info about completed tests
|
||||
|
|
Loading…
Reference in New Issue