Fixed an issue where users would not be able to authenticate in Azure on Linux platforms. Fixes #7495

This commit is contained in:
Yogesh Mahajan
2022-06-23 18:19:32 +05:30
committed by Akshay Joshi
parent e95eb14651
commit 23869cd61f
11 changed files with 86 additions and 192 deletions

View File

@@ -162,13 +162,17 @@ class AzureProvider(AbsProvider):
_credential = InteractiveBrowserCredential( _credential = InteractiveBrowserCredential(
tenant_id=self._tenant_id, tenant_id=self._tenant_id,
timeout=180, timeout=180,
cache_persistence_options=TokenCachePersistenceOptions(), cache_persistence_options=TokenCachePersistenceOptions(
allow_unencrypted_storage=True
),
authentication_record=deserialized_auth_record) authentication_record=deserialized_auth_record)
else: else:
_credential = InteractiveBrowserCredential( _credential = InteractiveBrowserCredential(
tenant_id=self._tenant_id, tenant_id=self._tenant_id,
timeout=180, timeout=180,
cache_persistence_options=TokenCachePersistenceOptions()) cache_persistence_options=TokenCachePersistenceOptions(
allow_unencrypted_storage=True)
)
return _credential return _credential
def _get_azure_client(self, type): def _get_azure_client(self, type):

View File

@@ -100,8 +100,8 @@ class CheckFileManagerFeatureTest(BaseFeatureTest):
self.wait.until(EC.visibility_of_element_located( self.wait.until(EC.visibility_of_element_located(
(By.CSS_SELECTOR, QueryToolLocators.select_file_content_css))) (By.CSS_SELECTOR, QueryToolLocators.select_file_content_css)))
table = self.page.driver.find_element_by_css_selector( table = self.page.driver.find_element(
QueryToolLocators.select_file_content_css) By.CSS_SELECTOR, QueryToolLocators.select_file_content_css)
retry_count = 0 retry_count = 0
while retry_count < 5: while retry_count < 5:

View File

@@ -18,6 +18,7 @@ from regression.python_test_utils import test_utils
from regression.feature_utils.base_feature_test import BaseFeatureTest from regression.feature_utils.base_feature_test import BaseFeatureTest
from regression.feature_utils.locators import QueryToolLocators from regression.feature_utils.locators import QueryToolLocators
import time import time
from selenium.webdriver.support import expected_conditions as EC
class QueryToolJourneyTest(BaseFeatureTest): class QueryToolJourneyTest(BaseFeatureTest):
@@ -98,7 +99,7 @@ class QueryToolJourneyTest(BaseFeatureTest):
def _test_copies_rows(self): def _test_copies_rows(self):
self.page.driver.switch_to.default_content() 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")) self.page.driver.find_element(By.TAG_NAME, "iframe"))
# row index starts with 2 # row index starts with 2
select_row = self.page.find_by_css_selector( select_row = self.page.find_by_css_selector(
@@ -112,7 +113,7 @@ class QueryToolJourneyTest(BaseFeatureTest):
self.page.driver.switch_to.default_content() 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")) self.page.driver.find_element(By.TAG_NAME, "iframe"))
scratch_pad_ele = self.page.find_by_css_selector( scratch_pad_ele = self.page.find_by_css_selector(
QueryToolLocators.scratch_pad_css) QueryToolLocators.scratch_pad_css)
@@ -127,7 +128,7 @@ class QueryToolJourneyTest(BaseFeatureTest):
def _test_copies_columns(self): def _test_copies_columns(self):
self.page.driver.switch_to.default_content() 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")) self.page.driver.find_element(By.TAG_NAME, "iframe"))
column_header = self.page.find_by_css_selector( column_header = self.page.find_by_css_selector(
QueryToolLocators.output_column_header_css.format('some_column')) QueryToolLocators.output_column_header_css.format('some_column'))
@@ -151,7 +152,7 @@ class QueryToolJourneyTest(BaseFeatureTest):
def _test_history_tab(self): def _test_history_tab(self):
self.page.driver.switch_to.default_content() 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")) self.page.driver.find_element(By.TAG_NAME, "iframe"))
self.page.clear_query_tool() self.page.clear_query_tool()
editor_input = self.page.find_by_css_selector( editor_input = self.page.find_by_css_selector(
@@ -400,8 +401,11 @@ class QueryToolJourneyTest(BaseFeatureTest):
ActionChains(self.driver).double_click(cell_el).perform() ActionChains(self.driver).double_click(cell_el).perform()
ActionChains(self.driver).send_keys(value). \ ActionChains(self.driver).send_keys(value). \
send_keys(Keys.ENTER).perform() send_keys(Keys.ENTER).perform()
self.page.find_by_css_selector(
QueryToolLocators.btn_save_data).click() save_btn = WebDriverWait(self.driver, 5).until(
EC.element_to_be_clickable(
(By.CSS_SELECTOR, QueryToolLocators.btn_save_data)))
save_btn.click()
def _insert_data_into_test_editable_table(self): def _insert_data_into_test_editable_table(self):
self.page.click_tab(self.query_editor_tab_id, rc_dock=True) self.page.click_tab(self.query_editor_tab_id, rc_dock=True)
@@ -472,7 +476,7 @@ class QueryToolJourneyTest(BaseFeatureTest):
ActionChains(self.driver).double_click(cell_el).perform() ActionChains(self.driver).double_click(cell_el).perform()
ActionChains(self.driver).send_keys(new_value). \ ActionChains(self.driver).send_keys(new_value). \
send_keys(Keys.ENTER).perform() send_keys(Keys.ENTER).perform()
time.sleep(0.5)
# Check if the value was updated # Check if the value was updated
# Finding element again to avoid stale element reference exception # Finding element again to avoid stale element reference exception
cell_el = self.page.\ cell_el = self.page.\

View File

@@ -41,10 +41,10 @@ class QueryToolFeatureTest(BaseFeatureTest):
self.test_db) self.test_db)
self.page.open_query_tool() self.page.open_query_tool()
self.page.wait_for_spinner_to_disappear() self.page.wait_for_spinner_to_disappear()
self._reset_options()
self.wait = WebDriverWait(self.page.driver, 10) self.wait = WebDriverWait(self.page.driver, 10)
def runTest(self): def runTest(self):
self._reset_options()
skip_warning = "Skipped." skip_warning = "Skipped."
# on demand result set on scrolling. # on demand result set on scrolling.
print("\nOn demand query result... ", print("\nOn demand query result... ",
@@ -260,10 +260,11 @@ SELECT generate_series(1, {}) as id1, 'dummy' as id2""".format(
SELECT generate_series(1, 1000) as id order by id desc""" SELECT generate_series(1, 1000) as id order by id desc"""
self.page.fill_codemirror_area_with(query) self.page.fill_codemirror_area_with(query)
time.sleep(0.5)
self.page.retry_click( explain_op_btn_click = self.page.retry_click(
(By.CSS_SELECTOR, QueryToolLocators.btn_explain_options_dropdown), (By.CSS_SELECTOR, QueryToolLocators.btn_explain_options_dropdown),
(By.CSS_SELECTOR, QueryToolLocators.btn_explain_verbose)) (By.CSS_SELECTOR, QueryToolLocators.btn_explain_verbose))
self.assertTrue(explain_op_btn_click, 'Explain Op button click failed')
# disable Explain options and auto rollback only if they are enabled. # disable Explain options and auto rollback only if they are enabled.
for op in (QueryToolLocators.btn_explain_verbose, for op in (QueryToolLocators.btn_explain_verbose,
@@ -297,9 +298,10 @@ SELECT generate_series(1, 1000) as id order by id desc"""
self.page.fill_codemirror_area_with(query) self.page.fill_codemirror_area_with(query)
self.page.retry_click( explain_op_btn_click = self.page.retry_click(
(By.CSS_SELECTOR, QueryToolLocators.btn_explain_options_dropdown), (By.CSS_SELECTOR, QueryToolLocators.btn_explain_options_dropdown),
(By.CSS_SELECTOR, QueryToolLocators.btn_explain_verbose)) (By.CSS_SELECTOR, QueryToolLocators.btn_explain_verbose))
self.assertTrue(explain_op_btn_click, 'Explain Op button click failed')
# disable Explain options and auto rollback only if they are enabled. # disable Explain options and auto rollback only if they are enabled.
for op in (QueryToolLocators.btn_explain_buffers, for op in (QueryToolLocators.btn_explain_buffers,

View File

@@ -128,7 +128,6 @@ class CopySQLFeatureTest(BaseFeatureTest):
sql_editor = self.page.find_by_xpath( sql_editor = self.page.find_by_xpath(
NavMenuLocators.specified_preference_tree_node.format( NavMenuLocators.specified_preference_tree_node.format(
specified_preference_tree_node_name)) specified_preference_tree_node_name))
print(sql_editor)
sql_editor.click() sql_editor.click()
if self.page.find_by_xpath( if self.page.find_by_xpath(
NavMenuLocators.specified_pref_node_exp_status. NavMenuLocators.specified_pref_node_exp_status.
@@ -139,7 +138,6 @@ class CopySQLFeatureTest(BaseFeatureTest):
option_node = self.page.find_by_xpath( option_node = self.page.find_by_xpath(
"//*[@id='treeContainer']//div//span[text()=" "//*[@id='treeContainer']//div//span[text()="
"'Results grid']//preceding::span[text()='Options']") "'Results grid']//preceding::span[text()='Options']")
print(option_node)
# self.page.check_if_element_exists_with_scroll(option_node) # self.page.check_if_element_exists_with_scroll(option_node)
self.page.driver.execute_script("arguments[0].scrollIntoView(false)", self.page.driver.execute_script("arguments[0].scrollIntoView(false)",
option_node) option_node)

View File

@@ -231,8 +231,10 @@ CREATE TABLE public.nonintpkey
ActionChains(self.driver).send_keys(value). \ ActionChains(self.driver).send_keys(value). \
send_keys(Keys.ENTER).perform() send_keys(Keys.ENTER).perform()
elif cell_type in ['text', 'text[]', 'boolean[]']: elif cell_type in ['text', 'text[]', 'boolean[]']:
text_area_ele = self.page.find_by_css_selector( text_area_ele = WebDriverWait(self.driver, 5).until(
QueryToolLocators.row_editor_text_area_css) EC.visibility_of_element_located(
(By.CSS_SELECTOR,
QueryToolLocators.row_editor_text_area_css)))
text_area_ele.clear() text_area_ele.clear()
text_area_ele.click() text_area_ele.click()
text_area_ele.send_keys(value) text_area_ele.send_keys(value)
@@ -273,12 +275,12 @@ CREATE TABLE public.nonintpkey
ActionChains(self.driver).click(checkbox_el).perform() ActionChains(self.driver).click(checkbox_el).perform()
def _view_data_grid(self, table_name): def _view_data_grid(self, table_name):
self.page.driver.find_element_by_link_text("Object").click() self.page.driver.find_element(By.LINK_TEXT, "Object").click()
ActionChains( ActionChains(
self.page.driver self.page.driver
).move_to_element( ).move_to_element(
self.page.driver.find_element_by_link_text( self.page.driver.find_element(
NavMenuLocators.view_data_link_text) By.LINK_TEXT, NavMenuLocators.view_data_link_text)
).perform() ).perform()
self.page.find_by_partial_link_text("All Rows").click() self.page.find_by_partial_link_text("All Rows").click()
@@ -327,7 +329,7 @@ CREATE TABLE public.nonintpkey
# rowindex starts with 2 and 1st colindex is rownum # rowindex starts with 2 and 1st colindex is rownum
cell_xpath = CheckForViewDataTest\ cell_xpath = CheckForViewDataTest\
._get_cell_xpath(str(idx + 1), row + 1) ._get_cell_xpath(str(idx + 1), row + 1)
time.sleep(0.2) time.sleep(0.5)
self._update_cell(cell_xpath, data[str(idx)]) self._update_cell(cell_xpath, data[str(idx)])
self.page.find_by_css_selector( self.page.find_by_css_selector(
QueryToolLocators.btn_save_data).click() QueryToolLocators.btn_save_data).click()

View File

@@ -66,13 +66,13 @@ class CheckDebuggerForXssFeatureTest(BaseFeatureTest):
function_node.click() function_node.click()
def _debug_function(self): def _debug_function(self):
self.page.driver.find_element_by_link_text("Object").click() self.page.driver.find_element(By.LINK_TEXT, "Object").click()
ActionChains( ActionChains(
self.page.driver self.page.driver
).move_to_element( ).move_to_element(
self.page.driver.find_element_by_link_text("Debugging") self.page.driver.find_element(By.LINK_TEXT, "Debugging")
).perform() ).perform()
self.page.driver.find_element_by_link_text("Debug").click() self.page.driver.find_element(By.LINK_TEXT, "Debug").click()
# We need to check if debugger plugin is installed or not # We need to check if debugger plugin is installed or not
try: try:
@@ -103,14 +103,14 @@ class CheckDebuggerForXssFeatureTest(BaseFeatureTest):
) )
else: else:
self.page.driver.switch_to.frame( self.page.driver.switch_to.frame(
self.page.driver.find_element_by_tag_name('iframe') self.page.driver.find_element(By.TAG_NAME, 'iframe')
) )
wait.until(EC.presence_of_element_located( wait.until(EC.presence_of_element_located(
(By.XPATH, "//span[contains(.,'Hello, pgAdmin4')]")) (By.XPATH, "//span[contains(.,'Hello, pgAdmin4')]"))
) )
self.page.click_element( self.page.click_element(
self.page.driver.find_elements_by_xpath("//button")[2] self.page.driver.find_elements(By.XPATH, "//button")[2]
) )
wait.until(EC.presence_of_element_located( wait.until(EC.presence_of_element_located(

View File

@@ -69,8 +69,8 @@ class CheckRoleMembershipControlFeatureTest(BaseFeatureTest):
role_node.click() role_node.click()
def _check_role_membership_control(self): def _check_role_membership_control(self):
self.page.driver.find_element_by_link_text( self.page.driver.find_element(
NavMenuLocators.object_menu_link_text).click() By.LINK_TEXT, NavMenuLocators.object_menu_link_text).click()
property_object = self.wait.until(EC.visibility_of_element_located( property_object = self.wait.until(EC.visibility_of_element_located(
(By.CSS_SELECTOR, NavMenuLocators.properties_obj_css))) (By.CSS_SELECTOR, NavMenuLocators.properties_obj_css)))
property_object.click() property_object.click()

View File

@@ -288,13 +288,17 @@ class Azure:
_credential = InteractiveBrowserCredential( _credential = InteractiveBrowserCredential(
tenant_id=self._tenant_id, tenant_id=self._tenant_id,
timeout=180, timeout=180,
cache_persistence_options=TokenCachePersistenceOptions(), cache_persistence_options=TokenCachePersistenceOptions(
allow_unencrypted_storage=True
),
authentication_record=deserialized_auth_record) authentication_record=deserialized_auth_record)
else: else:
_credential = InteractiveBrowserCredential( _credential = InteractiveBrowserCredential(
tenant_id=self._tenant_id, tenant_id=self._tenant_id,
timeout=180, timeout=180,
cache_persistence_options=TokenCachePersistenceOptions()) cache_persistence_options=TokenCachePersistenceOptions(
allow_unencrypted_storage=True)
)
return _credential return _credential
def _get_azure_client(self, type): def _get_azure_client(self, type):

View File

@@ -42,12 +42,12 @@ class PgadminPage:
self.driver.switch_to.default_content() self.driver.switch_to.default_content()
if not (self.check_if_element_exist_by_xpath( if not (self.check_if_element_exist_by_xpath(
'//a[@id="navbar-user"]', 1)): '//a[@id="navbar-user"]', 1)):
user_edt_box_el = self.driver.find_element_by_name('email') user_edt_box_el = self.driver.find_element(By.NAME, 'email')
user_edt_box_el.send_keys(user_detail['login_username']) user_edt_box_el.send_keys(user_detail['login_username'])
password_edt_box_el = self.driver.find_element_by_name('password') password_edt_box_el = self.driver.find_element(By.NAME, 'password')
password_edt_box_el.send_keys(user_detail['login_password']) password_edt_box_el.send_keys(user_detail['login_password'])
submit_btn = self.driver.find_element_by_xpath( submit_btn = self.driver.find_element(
'//button[@value="Login"]') By.XPATH, '//button[@value="Login"]')
submit_btn.click() submit_btn.click()
self.wait_for_spinner_to_disappear() self.wait_for_spinner_to_disappear()
@@ -155,11 +155,11 @@ class PgadminPage:
self.driver, "//div[@id='btn-conn-status']", 5) self.driver, "//div[@id='btn-conn-status']", 5)
def open_view_data(self, table_name): def open_view_data(self, table_name):
self.driver.find_element_by_link_text("Object").click() self.driver.find_element(By.LINK_TEXT, "Object").click()
ActionChains( ActionChains(
self.driver self.driver
).move_to_element( ).move_to_element(
self.driver.find_element_by_link_text("View/Edit Data") self.driver.find_element(By.LINK_TEXT, "View/Edit Data")
).perform() ).perform()
self.find_by_partial_link_text("All Rows").click() self.find_by_partial_link_text("All Rows").click()
time.sleep(1) time.sleep(1)
@@ -173,7 +173,7 @@ class PgadminPage:
), "Timed out waiting for div element to appear" ), "Timed out waiting for div element to appear"
) )
self.driver.switch_to.frame( self.driver.switch_to.frame(
self.driver.find_element_by_tag_name('iframe') self.driver.find_element(By.TAG_NAME, 'iframe')
) )
def enable_menu_item(self, menu_item, wait_time): def enable_menu_item(self, menu_item, wait_time):
@@ -243,15 +243,15 @@ class PgadminPage:
def check_execute_option(self, option): def check_execute_option(self, option):
""""This function will check auto commit or auto roll back based on """"This function will check auto commit or auto roll back based on
user input. If button is already checked, no action will be taken""" user input. If button is already checked, no action will be taken"""
menu_btn = self.driver.find_element_by_css_selector( menu_btn = self.driver.find_element(
QueryToolLocators.btn_query_dropdown) By.CSS_SELECTOR, QueryToolLocators.btn_query_dropdown)
if menu_btn.get_attribute('data-state') == "closed": if menu_btn.get_attribute('data-state') == "closed":
menu_btn.click() menu_btn.click()
def update_execute_option_setting(css_selector_of_option): def update_execute_option_setting(css_selector_of_option):
retry = 3 retry = 3
menu_option = self.driver.find_element_by_css_selector( menu_option = self.driver.find_element(By.CSS_SELECTOR,
css_selector_of_option) css_selector_of_option)
if menu_option.get_attribute('data-checked') == 'false': if menu_option.get_attribute('data-checked') == 'false':
while retry > 0: while retry > 0:
try: try:
@@ -277,17 +277,18 @@ class PgadminPage:
def uncheck_execute_option(self, option): def uncheck_execute_option(self, option):
""""This function will uncheck auto commit or auto roll back based on """"This function will uncheck auto commit or auto roll back based on
user input. If button is already unchecked, no action will be taken""" user input. If button is already unchecked, no action will be taken"""
menu = self.driver.find_element_by_css_selector( menu = self.driver.find_element(
By.CSS_SELECTOR,
QueryToolLocators.query_tool_menu.format('Execute Options Menu')) QueryToolLocators.query_tool_menu.format('Execute Options Menu'))
if menu.get_attribute('data-state') == "closed": if menu.get_attribute('data-state') == "closed":
self.driver.find_element_by_css_selector( self.driver.find_element(
QueryToolLocators.btn_query_dropdown).click() By.CSS_SELECTOR, QueryToolLocators.btn_query_dropdown).click()
def update_execute_option_setting(css_selector_of_option): def update_execute_option_setting(css_selector_of_option):
retry = 3 retry = 3
menu_option = self.driver.find_element_by_css_selector( menu_option = self.driver.find_element(
css_selector_of_option) By.CSS_SELECTOR, css_selector_of_option)
if menu_option.get_attribute('data-checked') == 'true': if menu_option.get_attribute('data-checked') == 'true':
while retry > 0: while retry > 0:
menu_option.click() menu_option.click()
@@ -305,8 +306,8 @@ class PgadminPage:
QueryToolLocators.btn_auto_rollback) QueryToolLocators.btn_auto_rollback)
if menu.get_attribute('data-state') == "open": if menu.get_attribute('data-state') == "open":
self.driver.find_element_by_css_selector( self.driver.find_element(
QueryToolLocators.btn_query_dropdown).click() By.CSS_SELECTOR, QueryToolLocators.btn_query_dropdown).click()
def close_data_grid(self): def close_data_grid(self):
self.driver.switch_to.default_content() self.driver.switch_to.default_content()
@@ -538,8 +539,8 @@ class PgadminPage:
self.fill_input(field, password) self.fill_input(field, password)
self.find_by_xpath(ConnectToServerDiv.ok_button).click() self.find_by_xpath(ConnectToServerDiv.ok_button).click()
self.wait_for_element_to_disappear( self.wait_for_element_to_disappear(
lambda driver: driver.find_element_by_xpath( lambda driver: driver.find_element(
ConnectToServerDiv.ok_button)) By.XPATH, ConnectToServerDiv.ok_button))
if self.check_if_element_exist_by_xpath( if self.check_if_element_exist_by_xpath(
ConnectToServerDiv.error_message, 2): ConnectToServerDiv.error_message, 2):
print( print(
@@ -593,6 +594,16 @@ class PgadminPage:
else: else:
child_node_ele = self.check_if_element_exists_with_scroll( child_node_ele = self.check_if_element_exists_with_scroll(
server_child_node_xpath) server_child_node_xpath)
if not child_node_ele:
databases_node = self.driver.find_element(
By.XPATH,
TreeAreaLocators.server_child_node(
server_name, 'Databases'))
webdriver.ActionChains(self.driver).double_click(
databases_node).perform()
child_node_ele = self.check_if_element_exists_with_scroll(
server_child_node_xpath)
server_child_expanded = self.click_to_expand_tree_node( server_child_expanded = self.click_to_expand_tree_node(
child_node_ele, server_child_node_exp_status_xpath) child_node_ele, server_child_node_exp_status_xpath)
if not server_child_expanded: if not server_child_expanded:
@@ -803,140 +814,6 @@ class PgadminPage:
print("The schema/previous nodes not expanded", file=sys.stderr) print("The schema/previous nodes not expanded", file=sys.stderr)
return schema_child_expanded 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
attempts = 3
xpath_for_functions_node = \
"//span[@class='aciTreeText' and starts-with(text()," \
"'Functions')]"
xpath_for_exp = "//div[div[div[div[div[div[div[div[span[span[" \
"(@class='aciTreeText') and starts-with(text()," \
"'Functions')]]]]]]]]]]"
xpath_for_button = "//div[span[span[(@class='aciTreeText') " \
"and starts-with(text(),'Functions')]]]" \
"/span[@class='aciTreeButton']"
while node_expanded is not True and attempts > 0:
# get the element which contains 'aria-expanded' info
xpath_for_refresh_btn = "//li[@class='context-menu-item']" \
"/span[text()='Refresh']"
# add code to refresh button, sometime the collapsing button
# is not visible even if there is sub node.
functions_node_ele = self.find_by_xpath(xpath_for_functions_node)
webdriver.ActionChains(self.driver).move_to_element(
functions_node_ele).context_click().perform()
refresh_btn = self.find_by_xpath(xpath_for_refresh_btn)
refresh_btn.click()
time.sleep(.5)
# get the expansion status
function_expansion_ele = self.find_by_xpath(xpath_for_exp)
# look into the attribute and check if it is already expanded or
# not
if function_expansion_ele.get_attribute('aria-expanded') \
== 'false':
# button element of the Function node to open it
item_button = self.find_by_xpath(xpath_for_button)
ActionChains(self.driver).click(item_button).perform()
# Expansion of element on GUI takes sometime, so put small
# sleep
time.sleep(.5)
function_expansion_ele = self.find_by_xpath(
xpath_for_exp)
if function_expansion_ele.get_attribute('aria-expanded') \
== 'true':
break
else:
attempts -= 1
else:
node_expanded = True
# 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
element = self.find_by_xpath(xpath_node)
if element.get_attribute("aria-expanded") == 'true':
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
try:
if element.get_attribute("aria-expanded") == 'true':
node_is_expanded = True
except Exception as e:
print(
"There is some exception thrown in the function "
"get_expansion_status_of_node_element and is: " + str(
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
# even if the underlying node to be clicked was Opened.
time.sleep(.6)
item_with_text = self.find_by_xpath(
TreeAreaLocators.specified_tree_node.format(tree_item_text))
self.driver.execute_script(self.js_executor_scrollintoview_arg,
item_with_text)
if item_with_text.find_element_by_xpath(
".//ancestor::*[@class='aciTreeLine']").get_attribute(
"aria-expanded") == 'false':
item = item_with_text.find_element_by_xpath(
".//parent::*[@class='aciTreeItem']")
ActionChains(self.driver).double_click(item).perform()
retry = 3
while retry > 0:
try:
WebDriverWait(self.driver, 5).until((lambda item_with_text: (
item_with_text.find_element_by_xpath(
".//ancestor::*[@class='aciTreeLine']").
get_attribute("aria-expanded") == 'true')))
break
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:
dialog = driver.find_element_by_id("frmPassword")
except WebDriverException:
dialog = None
try:
database_node = driver.find_element_by_xpath(
"//*[@id='tree']//*[.='Databases']"
"/../*[@class='aciTreeButton']")
except WebDriverException:
database_node = None
return dialog is not None or database_node is not None
self.toggle_open_tree_item(tree_item_text)
self._wait_for("Waiting for password dialog or tree to open",
check_for_password_dialog_or_tree_open)
try:
self.driver.find_element_by_id("frmPassword")
# Enter password here if needed
self.click_modal('OK')
except WebDriverException:
return
def find_by_xpath(self, xpath): def find_by_xpath(self, xpath):
return self.wait_for_element( return self.wait_for_element(
lambda driver: driver.find_element(By.XPATH, xpath) lambda driver: driver.find_element(By.XPATH, xpath)
@@ -1049,7 +926,7 @@ class PgadminPage:
try: try:
driver.switch_to.default_content() driver.switch_to.default_content()
driver.switch_to.frame( driver.switch_to.frame(
driver.find_element_by_tag_name("iframe")) driver.find_element(By.TAG_NAME, "iframe"))
element = driver.find_element( element = driver.find_element(
By.CSS_SELECTOR, "#sqleditor-container .CodeMirror") By.CSS_SELECTOR, "#sqleditor-container .CodeMirror")
if element.is_displayed() and element.is_enabled(): if element.is_displayed() and element.is_enabled():
@@ -1123,8 +1000,8 @@ class PgadminPage:
def wait_for_input_field_content(self, field_name, content, wait=1): def wait_for_input_field_content(self, field_name, content, wait=1):
def input_field_has_content(driver): def input_field_has_content(driver):
element = driver.find_element_by_xpath( element = driver.find_element(
"//input[@name='" + field_name + "']") By.XPATH, "//input[@name='" + field_name + "']")
return str(content) == element.get_attribute('value') return str(content) == element.get_attribute('value')
@@ -1173,7 +1050,7 @@ class PgadminPage:
def wait_for_reloading_indicator_to_disappear(self): def wait_for_reloading_indicator_to_disappear(self):
def reloading_indicator_has_disappeared(driver): def reloading_indicator_has_disappeared(driver):
try: try:
driver.find_element_by_id("reloading-indicator") driver.find_element(By.ID, "reloading-indicator")
return False return False
except NoSuchElementException: except NoSuchElementException:
return True return True
@@ -1394,7 +1271,7 @@ class PgadminPage:
WebDriverWait(self.driver, 10).until( WebDriverWait(self.driver, 10).until(
EC.visibility_of_element_located(verify_locator)) EC.visibility_of_element_located(verify_locator))
click_status = True click_status = True
except Exception: except Exception as e:
attempt += 1 attempt += 1
return click_status return click_status

View File

@@ -357,8 +357,11 @@ def create_debug_function(server, db_name, function_name="test_func"):
old_isolation_level = connection.isolation_level old_isolation_level = connection.isolation_level
connection.set_isolation_level(0) connection.set_isolation_level(0)
pg_cursor = connection.cursor() pg_cursor = connection.cursor()
try:
pg_cursor.execute('''CREATE EXTENSION pldbgapi;''')
except Exception as e:
pass
pg_cursor.execute(''' pg_cursor.execute('''
CREATE EXTENSION pldbgapi;
CREATE OR REPLACE FUNCTION public."%s"() CREATE OR REPLACE FUNCTION public."%s"()
RETURNS text RETURNS text
LANGUAGE 'plpgsql' LANGUAGE 'plpgsql'