2017-06-06 11:54:20 +00:00
|
|
|
##########################################################################
|
|
|
|
#
|
|
|
|
# pgAdmin 4 - PostgreSQL Tools
|
|
|
|
#
|
2019-01-02 10:24:12 +00:00
|
|
|
# Copyright (C) 2013 - 2019, The pgAdmin Development Team
|
2017-06-06 11:54:20 +00:00
|
|
|
# This software is released under the PostgreSQL Licence
|
|
|
|
#
|
|
|
|
##########################################################################
|
|
|
|
|
2019-08-28 12:34:08 +00:00
|
|
|
from __future__ import print_function
|
2017-06-06 11:54:20 +00:00
|
|
|
import json
|
|
|
|
import os
|
2017-06-27 13:03:04 +00:00
|
|
|
import time
|
2018-08-21 12:09:36 +00:00
|
|
|
|
2017-06-06 11:54:20 +00:00
|
|
|
from selenium.webdriver import ActionChains
|
|
|
|
from regression.python_test_utils import test_utils
|
|
|
|
from regression.feature_utils.base_feature_test import BaseFeatureTest
|
|
|
|
from selenium.webdriver.common.by import By
|
2019-07-03 13:30:12 +00:00
|
|
|
from selenium.webdriver.common.keys import Keys
|
2017-06-06 11:54:20 +00:00
|
|
|
from selenium.webdriver.support import expected_conditions as EC
|
|
|
|
from selenium.webdriver.support.ui import WebDriverWait
|
2019-08-22 09:20:51 +00:00
|
|
|
from regression.feature_utils.locators import QueryToolLocators, \
|
|
|
|
NavMenuLocators
|
2017-06-06 11:54:20 +00:00
|
|
|
|
|
|
|
CURRENT_PATH = os.path.dirname(os.path.realpath(__file__))
|
|
|
|
|
2019-07-03 13:30:12 +00:00
|
|
|
config_data = config_data_json = {}
|
|
|
|
# try:
|
|
|
|
with open(CURRENT_PATH + '/test_data.json') as data_file:
|
|
|
|
config_data_json = json.load(data_file)
|
2017-06-06 11:54:20 +00:00
|
|
|
|
|
|
|
|
|
|
|
class CheckForViewDataTest(BaseFeatureTest):
|
|
|
|
"""
|
|
|
|
Test cases to validate insert, update operations in table
|
|
|
|
with input test data
|
|
|
|
|
|
|
|
First of all, the test data is inserted/updated into table and then
|
|
|
|
inserted data is compared with original data to check if expected data
|
|
|
|
is returned from table or not.
|
|
|
|
|
|
|
|
We will cover test cases for,
|
|
|
|
1) Insert with default values
|
|
|
|
2) Update with null values
|
|
|
|
3) Update with blank string
|
|
|
|
4) Copy/Paste row
|
|
|
|
"""
|
|
|
|
|
|
|
|
scenarios = [
|
2018-02-09 12:57:37 +00:00
|
|
|
("Validate Insert, Update operations in View/Edit data with "
|
|
|
|
"given test data",
|
2017-06-06 11:54:20 +00:00
|
|
|
dict())
|
|
|
|
]
|
|
|
|
|
|
|
|
TIMEOUT_STRING = "Timed out waiting for div element to appear"
|
|
|
|
|
|
|
|
# query for creating 'defaults_text' table
|
|
|
|
defaults_query = """
|
2018-02-19 11:37:31 +00:00
|
|
|
CREATE TABLE public.defaults_{0}
|
2017-06-06 11:54:20 +00:00
|
|
|
(
|
2018-02-19 11:37:31 +00:00
|
|
|
{1} serial NOT NULL,
|
2017-06-06 11:54:20 +00:00
|
|
|
number_defaults numeric(100) DEFAULT 1,
|
|
|
|
number_null numeric(100),
|
2018-02-09 12:57:37 +00:00
|
|
|
text_defaults text COLLATE pg_catalog."default"
|
|
|
|
DEFAULT 'Hello World'::text,
|
2017-06-06 11:54:20 +00:00
|
|
|
text_null1 text COLLATE pg_catalog."default",
|
|
|
|
text_null2 text COLLATE pg_catalog."default",
|
|
|
|
text_null3 text COLLATE pg_catalog."default",
|
|
|
|
text_null4 text COLLATE pg_catalog."default",
|
|
|
|
json_defaults json DEFAULT '[51, 52]'::json,
|
|
|
|
json_null json,
|
2017-11-21 17:22:25 +00:00
|
|
|
boolean_true boolean DEFAULT true,
|
2017-06-06 11:54:20 +00:00
|
|
|
boolean_null boolean,
|
2017-11-21 17:22:25 +00:00
|
|
|
boolean_false boolean,
|
2017-09-18 06:37:15 +00:00
|
|
|
text_arr text[],
|
|
|
|
text_arr_empty text[],
|
|
|
|
text_arr_null text[],
|
|
|
|
int_arr integer[],
|
|
|
|
int_arr_empty integer[],
|
|
|
|
boolean_arr boolean[],
|
|
|
|
boolean_arr_null boolean[],
|
2018-02-19 11:37:31 +00:00
|
|
|
CONSTRAINT defaults_pkey_{0} PRIMARY KEY ({1})
|
2017-06-06 11:54:20 +00:00
|
|
|
)
|
|
|
|
"""
|
2019-07-03 13:30:12 +00:00
|
|
|
non_int_pkey_table = """
|
|
|
|
CREATE TABLE public.nonintpkey
|
|
|
|
(
|
|
|
|
charid text COLLATE pg_catalog."default" NOT NULL,
|
|
|
|
col1 text,
|
|
|
|
col2 numeric(100),
|
|
|
|
CONSTRAINT nonintpkey_pkey PRIMARY KEY (charid)
|
|
|
|
)
|
|
|
|
"""
|
2017-06-06 11:54:20 +00:00
|
|
|
|
|
|
|
def before(self):
|
2017-06-13 09:27:09 +00:00
|
|
|
with test_utils.Database(self.server) as (connection, _):
|
|
|
|
if connection.server_version < 90100:
|
2018-02-09 12:57:37 +00:00
|
|
|
self.skipTest(
|
|
|
|
"COLLATE is not present in PG versions below v9.1"
|
|
|
|
)
|
|
|
|
|
2017-06-06 11:54:20 +00:00
|
|
|
# Create pre-requisite table
|
2018-03-02 09:37:11 +00:00
|
|
|
for k, v in {1: 'id', 2: '"ID"'}.items():
|
2018-02-19 11:37:31 +00:00
|
|
|
test_utils.create_table_with_query(
|
|
|
|
self.server,
|
2018-08-21 12:09:36 +00:00
|
|
|
self.test_db,
|
2018-02-19 11:37:31 +00:00
|
|
|
CheckForViewDataTest.defaults_query.format(k, v))
|
|
|
|
|
2019-07-03 13:30:12 +00:00
|
|
|
test_utils.create_table_with_query(
|
|
|
|
self.server,
|
|
|
|
self.test_db,
|
|
|
|
CheckForViewDataTest.non_int_pkey_table
|
|
|
|
)
|
|
|
|
|
2017-06-06 11:54:20 +00:00
|
|
|
# Initialize an instance of WebDriverWait with timeout of 3 seconds
|
|
|
|
self.wait = WebDriverWait(self.driver, 3)
|
|
|
|
|
2018-08-21 12:09:36 +00:00
|
|
|
# close the db connection
|
|
|
|
connection.close()
|
|
|
|
|
2017-06-06 11:54:20 +00:00
|
|
|
def runTest(self):
|
|
|
|
self.page.wait_for_spinner_to_disappear()
|
|
|
|
self.page.add_server(self.server)
|
2019-08-22 09:20:51 +00:00
|
|
|
|
|
|
|
self.page.toggle_open_tree_item(self.server['name'])
|
|
|
|
self.page.toggle_open_tree_item('Databases')
|
|
|
|
self.page.toggle_open_tree_item(self.test_db)
|
|
|
|
self.page.toggle_open_tree_item('Schemas')
|
|
|
|
self.page.toggle_open_tree_item('public')
|
|
|
|
self.page.toggle_open_tree_item('Tables')
|
2019-07-03 13:30:12 +00:00
|
|
|
|
|
|
|
self._load_config_data('table_insert_update_cases')
|
2018-02-19 11:37:31 +00:00
|
|
|
# iterate on both tables
|
2018-03-02 09:37:11 +00:00
|
|
|
for cnt in (1, 2):
|
2019-07-03 13:30:12 +00:00
|
|
|
self._perform_test_for_table('defaults_{0}'.format(str(cnt)))
|
2017-06-06 11:54:20 +00:00
|
|
|
|
2019-07-03 13:30:12 +00:00
|
|
|
# test nonint pkey table
|
|
|
|
self._load_config_data('table_insert_update_nonint')
|
|
|
|
self._perform_test_for_table('nonintpkey')
|
2017-06-06 11:54:20 +00:00
|
|
|
|
|
|
|
def after(self):
|
|
|
|
self.page.remove_server(self.server)
|
2019-08-22 09:20:51 +00:00
|
|
|
for cnt in (1, 2):
|
|
|
|
test_utils.delete_table(
|
|
|
|
self.server, self.test_db, 'defaults_{0}'.format(str(cnt)))
|
|
|
|
test_utils.delete_table(self.server, self.test_db, 'nonintpkey')
|
2017-06-06 11:54:20 +00:00
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def _get_cell_xpath(cell, row):
|
|
|
|
|
|
|
|
if row == 1:
|
|
|
|
xpath_grid_row = "//*[contains(@class, 'ui-widget-content') " \
|
|
|
|
"and contains(@style, 'top:0px')]"
|
|
|
|
else:
|
|
|
|
xpath_grid_row = "//*[contains(@class, 'ui-widget-content') " \
|
|
|
|
"and contains(@style, 'top:25px')]"
|
|
|
|
|
2018-02-09 12:57:37 +00:00
|
|
|
xpath_row_cell = '//div[contains(@class, "' + cell + '")]'
|
2017-06-06 11:54:20 +00:00
|
|
|
|
|
|
|
xpath_cell = '{0}{1}'.format(xpath_grid_row, xpath_row_cell)
|
|
|
|
|
|
|
|
return xpath_cell
|
|
|
|
|
2019-07-03 13:30:12 +00:00
|
|
|
@staticmethod
|
|
|
|
def _load_config_data(config_key):
|
|
|
|
global config_data
|
|
|
|
config_data = config_data_json[config_key]
|
|
|
|
|
|
|
|
def _perform_test_for_table(self, table_name):
|
|
|
|
self.page.select_tree_item(table_name)
|
|
|
|
# Open Object -> View/Edit data
|
|
|
|
self._view_data_grid(table_name)
|
|
|
|
|
|
|
|
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()
|
|
|
|
self._verify_row_data(True, config_data['add'])
|
|
|
|
|
|
|
|
# Run test to copy/paste a row
|
|
|
|
self._copy_paste_row()
|
|
|
|
|
|
|
|
self._update_row()
|
|
|
|
self.page.click_tab("Messages")
|
|
|
|
self._verify_messsages("")
|
|
|
|
self.page.click_tab("Data Output")
|
|
|
|
updated_row_data = {
|
|
|
|
i: config_data['update'][i] if i in config_data['update'] else val
|
|
|
|
for i, val in config_data['add'].items()
|
|
|
|
}
|
|
|
|
self._verify_row_data(False, updated_row_data)
|
|
|
|
|
|
|
|
self.page.close_data_grid()
|
|
|
|
|
2017-06-06 11:54:20 +00:00
|
|
|
def _compare_cell_value(self, xpath, value):
|
|
|
|
# Initialize an instance of WebDriverWait with timeout of 5 seconds
|
|
|
|
wait = WebDriverWait(self.driver, 5)
|
|
|
|
try:
|
|
|
|
wait.until(EC.text_to_be_present_in_element(
|
2018-02-09 12:57:37 +00:00
|
|
|
(By.XPATH, xpath + "//span"), str(value)),
|
2017-06-06 11:54:20 +00:00
|
|
|
CheckForViewDataTest.TIMEOUT_STRING
|
|
|
|
)
|
|
|
|
except Exception:
|
|
|
|
wait.until(EC.text_to_be_present_in_element(
|
|
|
|
(By.XPATH, xpath), str(value)),
|
|
|
|
CheckForViewDataTest.TIMEOUT_STRING
|
|
|
|
)
|
|
|
|
|
|
|
|
def _update_cell(self, xpath, data):
|
|
|
|
"""
|
|
|
|
This function updates the given cell(xpath) with
|
|
|
|
given value
|
|
|
|
Args:
|
|
|
|
xpath: xpath of cell element
|
|
|
|
data: list with cell related data
|
|
|
|
|
|
|
|
Returns: None
|
|
|
|
|
|
|
|
"""
|
2017-07-20 12:09:47 +00:00
|
|
|
|
2017-06-06 11:54:20 +00:00
|
|
|
self.wait.until(EC.visibility_of_element_located(
|
|
|
|
(By.XPATH, xpath)), CheckForViewDataTest.TIMEOUT_STRING
|
|
|
|
)
|
|
|
|
cell_el = self.page.find_by_xpath(xpath)
|
Improvement in the look and feel of the whole application
Changed the SCSS/CSS for the below third party libraries to adopt the
new look 'n' feel:
- wcDocker
- Alertify dialogs, and notifications
- AciTree
- Bootstrap Navbar
- Bootstrap Tabs
- Bootstrap Drop-Down menu
- Backgrid
- Select2
Adopated the new the look 'n' feel for the dialogs, wizard, properties,
tab panels, tabs, fieldset, subnode control, spinner control, HTML
table, and other form controls.
- Font is changed to Roboto
- Using SCSS variables to define the look 'n' feel
- Designer background images for the Login, and Forget password pages in
'web' mode
- Improved the look 'n' feel for the key selection in the preferences
dialog
- Table classes consistency changes across the application
- File Open and Save dialog list view changes
Author(s): Aditya Toshniwal & Khushboo Vashi
2018-12-21 11:44:55 +00:00
|
|
|
self.page.driver.execute_script("arguments[0].scrollIntoView(false)",
|
2018-05-15 14:10:11 +00:00
|
|
|
cell_el)
|
2017-06-06 11:54:20 +00:00
|
|
|
ActionChains(self.driver).move_to_element(cell_el).double_click(
|
|
|
|
cell_el
|
|
|
|
).perform()
|
|
|
|
cell_type = data[2]
|
|
|
|
value = data[0]
|
|
|
|
|
2017-09-18 06:37:15 +00:00
|
|
|
if cell_type in ['int', 'int[]']:
|
2017-06-06 11:54:20 +00:00
|
|
|
if value == 'clear':
|
|
|
|
cell_el.find_element_by_css_selector('input').clear()
|
|
|
|
else:
|
2019-07-03 13:30:12 +00:00
|
|
|
ActionChains(self.driver).send_keys(value).\
|
|
|
|
send_keys(Keys.ENTER).perform()
|
2017-09-18 06:37:15 +00:00
|
|
|
elif cell_type in ['text', 'json', 'text[]', 'boolean[]']:
|
2019-03-21 12:04:37 +00:00
|
|
|
text_area_ele = self.page.find_by_css_selector(
|
2019-08-22 09:20:51 +00:00
|
|
|
QueryToolLocators.row_editor_text_area_css)
|
2019-07-03 13:30:12 +00:00
|
|
|
text_area_ele.clear()
|
2019-03-21 12:04:37 +00:00
|
|
|
text_area_ele.click()
|
|
|
|
text_area_ele.send_keys(value)
|
2017-06-14 11:18:27 +00:00
|
|
|
|
|
|
|
# Click on editor's Save button
|
Improvement in the look and feel of the whole application
Changed the SCSS/CSS for the below third party libraries to adopt the
new look 'n' feel:
- wcDocker
- Alertify dialogs, and notifications
- AciTree
- Bootstrap Navbar
- Bootstrap Tabs
- Bootstrap Drop-Down menu
- Backgrid
- Select2
Adopated the new the look 'n' feel for the dialogs, wizard, properties,
tab panels, tabs, fieldset, subnode control, spinner control, HTML
table, and other form controls.
- Font is changed to Roboto
- Using SCSS variables to define the look 'n' feel
- Designer background images for the Login, and Forget password pages in
'web' mode
- Improved the look 'n' feel for the key selection in the preferences
dialog
- Table classes consistency changes across the application
- File Open and Save dialog list view changes
Author(s): Aditya Toshniwal & Khushboo Vashi
2018-12-21 11:44:55 +00:00
|
|
|
self.page.find_by_css_selector(
|
2019-08-22 09:20:51 +00:00
|
|
|
QueryToolLocators.text_editor_ok_btn_css).click()
|
2017-06-06 11:54:20 +00:00
|
|
|
else:
|
2017-11-21 17:22:25 +00:00
|
|
|
# Boolean editor test for to True click
|
2017-06-06 11:54:20 +00:00
|
|
|
if data[1] == 'true':
|
2018-02-09 12:57:37 +00:00
|
|
|
checkbox_el = cell_el.find_element_by_xpath(
|
|
|
|
".//*[contains(@class, 'multi-checkbox')]")
|
2017-06-06 11:54:20 +00:00
|
|
|
checkbox_el.click()
|
2017-11-21 17:22:25 +00:00
|
|
|
# Boolean editor test for to False click
|
|
|
|
elif data[1] == 'false':
|
2018-02-09 12:57:37 +00:00
|
|
|
checkbox_el = cell_el.find_element_by_xpath(
|
|
|
|
".//*[contains(@class, 'multi-checkbox')]")
|
2017-11-21 17:22:25 +00:00
|
|
|
# Sets true
|
|
|
|
checkbox_el.click()
|
|
|
|
# Sets false
|
|
|
|
ActionChains(self.driver).click(checkbox_el).perform()
|
2017-06-06 11:54:20 +00:00
|
|
|
|
2019-03-21 12:04:37 +00:00
|
|
|
def _view_data_grid(self, table_name):
|
2017-06-06 11:54:20 +00:00
|
|
|
self.page.driver.find_element_by_link_text("Object").click()
|
2018-02-09 12:57:37 +00:00
|
|
|
ActionChains(
|
|
|
|
self.page.driver
|
|
|
|
).move_to_element(
|
2019-08-22 09:20:51 +00:00
|
|
|
self.page.driver.find_element_by_link_text(
|
|
|
|
NavMenuLocators.view_data_link_text)
|
2018-02-09 12:57:37 +00:00
|
|
|
).perform()
|
2017-06-28 13:49:39 +00:00
|
|
|
self.page.find_by_partial_link_text("All Rows").click()
|
2019-08-22 09:20:51 +00:00
|
|
|
|
2017-06-27 13:03:04 +00:00
|
|
|
# wait until datagrid frame is loaded.
|
2019-08-22 09:20:51 +00:00
|
|
|
self.page.wait_for_query_tool_loading_indicator_to_appear()
|
|
|
|
self.page.wait_for_query_tool_loading_indicator_to_disappear()
|
2019-03-21 12:04:37 +00:00
|
|
|
|
|
|
|
self.page.click_tab(table_name)
|
2017-06-27 13:03:04 +00:00
|
|
|
|
2017-06-06 11:54:20 +00:00
|
|
|
self.wait.until(
|
|
|
|
EC.visibility_of_element_located(
|
|
|
|
(By.CSS_SELECTOR, 'iframe')
|
|
|
|
), CheckForViewDataTest.TIMEOUT_STRING
|
|
|
|
)
|
|
|
|
self.page.driver.switch_to.frame(
|
|
|
|
self.page.driver.find_element_by_tag_name('iframe')
|
|
|
|
)
|
|
|
|
|
|
|
|
def _copy_paste_row(self):
|
|
|
|
row0_cell0_xpath = CheckForViewDataTest._get_cell_xpath("r0", 1)
|
|
|
|
|
|
|
|
self.page.find_by_xpath(row0_cell0_xpath).click()
|
2019-08-22 09:20:51 +00:00
|
|
|
self.page.find_by_css_selector(
|
|
|
|
QueryToolLocators.copy_button_css).click()
|
|
|
|
self.page.find_by_css_selector(
|
|
|
|
QueryToolLocators.paste_button_css).click()
|
2017-06-06 11:54:20 +00:00
|
|
|
|
2019-07-03 13:30:12 +00:00
|
|
|
# Update primary key of copied cell
|
|
|
|
self._add_update_save_row(config_data['copy'], row=2)
|
2017-06-06 11:54:20 +00:00
|
|
|
|
|
|
|
# Verify row 1 and row 2 data
|
2019-07-03 13:30:12 +00:00
|
|
|
updated_row_data = {
|
|
|
|
i: config_data['copy'][i] if i in config_data['copy'] else val
|
|
|
|
for i, val in config_data['add'].items()
|
|
|
|
}
|
|
|
|
self._verify_row_data(False, updated_row_data)
|
|
|
|
|
|
|
|
def _add_update_save_row(self, data, row=1):
|
|
|
|
for idx in data.keys():
|
2017-06-06 11:54:20 +00:00
|
|
|
cell_xpath = CheckForViewDataTest._get_cell_xpath(
|
2019-07-03 13:30:12 +00:00
|
|
|
'r' + str(idx), row
|
2017-06-06 11:54:20 +00:00
|
|
|
)
|
2017-08-29 13:57:56 +00:00
|
|
|
time.sleep(0.2)
|
2019-07-03 13:30:12 +00:00
|
|
|
self._update_cell(cell_xpath, data[str(idx)])
|
2019-08-16 11:47:12 +00:00
|
|
|
self.page.find_by_css_selector(
|
2019-08-22 09:20:51 +00:00
|
|
|
QueryToolLocators.btn_save_data).click()
|
2017-06-27 13:03:04 +00:00
|
|
|
# There should be some delay after save button is clicked, as it
|
|
|
|
# takes some time to complete save ajax call otherwise discard unsaved
|
|
|
|
# changes dialog will appear if we try to execute query before previous
|
|
|
|
# save ajax is completed.
|
|
|
|
time.sleep(2)
|
2017-06-06 11:54:20 +00:00
|
|
|
|
2019-07-03 13:30:12 +00:00
|
|
|
def _add_row(self):
|
|
|
|
self._add_update_save_row(config_data['add'], 1)
|
|
|
|
|
|
|
|
def _update_row(self):
|
|
|
|
self._add_update_save_row(config_data['update'], 1)
|
|
|
|
|
|
|
|
def _verify_messsages(self, text):
|
|
|
|
messages_ele = self.page.find_by_css_selector(
|
2019-08-22 09:20:51 +00:00
|
|
|
QueryToolLocators.query_messages_panel)
|
2019-07-03 13:30:12 +00:00
|
|
|
self.assertEquals(text, messages_ele.text)
|
|
|
|
|
|
|
|
def _verify_row_data(self, is_new_row, config_check_data):
|
2019-08-22 09:20:51 +00:00
|
|
|
self.page.find_by_css_selector(
|
|
|
|
QueryToolLocators.btn_execute_query_css).click()
|
2017-06-06 11:54:20 +00:00
|
|
|
|
|
|
|
# First row if row height = 0, second row if its 25
|
|
|
|
row_height = 0 if is_new_row else 25
|
|
|
|
|
|
|
|
xpath = "//*[contains(@class, 'ui-widget-content') and " \
|
|
|
|
"contains(@style, 'top:" + str(row_height) + "px')]"
|
|
|
|
|
2017-06-27 13:03:04 +00:00
|
|
|
self.page.wait_for_query_tool_loading_indicator_to_disappear()
|
|
|
|
|
2017-06-06 11:54:20 +00:00
|
|
|
result_row = self.page.find_by_xpath(xpath)
|
|
|
|
|
|
|
|
# List of row values in an array
|
2019-07-03 13:30:12 +00:00
|
|
|
for idx in config_check_data.keys():
|
2018-05-04 09:15:02 +00:00
|
|
|
element = result_row.find_element_by_class_name("r" + str(idx))
|
Improvement in the look and feel of the whole application
Changed the SCSS/CSS for the below third party libraries to adopt the
new look 'n' feel:
- wcDocker
- Alertify dialogs, and notifications
- AciTree
- Bootstrap Navbar
- Bootstrap Tabs
- Bootstrap Drop-Down menu
- Backgrid
- Select2
Adopated the new the look 'n' feel for the dialogs, wizard, properties,
tab panels, tabs, fieldset, subnode control, spinner control, HTML
table, and other form controls.
- Font is changed to Roboto
- Using SCSS variables to define the look 'n' feel
- Designer background images for the Login, and Forget password pages in
'web' mode
- Improved the look 'n' feel for the key selection in the preferences
dialog
- Table classes consistency changes across the application
- File Open and Save dialog list view changes
Author(s): Aditya Toshniwal & Khushboo Vashi
2018-12-21 11:44:55 +00:00
|
|
|
self.page.driver.execute_script(
|
|
|
|
"arguments[0].scrollIntoView(false)", element)
|
2018-05-04 09:15:02 +00:00
|
|
|
|
2019-07-03 13:30:12 +00:00
|
|
|
self.assertEquals(element.text, config_check_data[str(idx)][1])
|
|
|
|
self.assertEquals(element.text, config_check_data[str(idx)][1])
|
2018-05-04 09:15:02 +00:00
|
|
|
|
|
|
|
# scroll browser back to the left
|
|
|
|
# to reset position so other assertions can succeed
|
2019-07-03 13:30:12 +00:00
|
|
|
for idx in reversed(list(config_check_data.keys())):
|
2018-05-04 09:15:02 +00:00
|
|
|
element = result_row.find_element_by_class_name("r" + str(idx))
|
Improvement in the look and feel of the whole application
Changed the SCSS/CSS for the below third party libraries to adopt the
new look 'n' feel:
- wcDocker
- Alertify dialogs, and notifications
- AciTree
- Bootstrap Navbar
- Bootstrap Tabs
- Bootstrap Drop-Down menu
- Backgrid
- Select2
Adopated the new the look 'n' feel for the dialogs, wizard, properties,
tab panels, tabs, fieldset, subnode control, spinner control, HTML
table, and other form controls.
- Font is changed to Roboto
- Using SCSS variables to define the look 'n' feel
- Designer background images for the Login, and Forget password pages in
'web' mode
- Improved the look 'n' feel for the key selection in the preferences
dialog
- Table classes consistency changes across the application
- File Open and Save dialog list view changes
Author(s): Aditya Toshniwal & Khushboo Vashi
2018-12-21 11:44:55 +00:00
|
|
|
self.page.driver.execute_script(
|
|
|
|
"arguments[0].scrollIntoView(false)", element)
|