From 4555730ab6d285576a94508ac9807b7e43210c63 Mon Sep 17 00:00:00 2001 From: Joao Pereira and Tira Odhner Date: Tue, 28 Feb 2017 16:56:39 -0500 Subject: [PATCH 2/2] Use selenium built-in waiting function and fix flakiness around clicking the alertify OK button - we think the OK button does not have its event bound when it is created. --- web/regression/feature_utils/pgadmin_page.py | 55 +++++++++++++--------------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/web/regression/feature_utils/pgadmin_page.py b/web/regression/feature_utils/pgadmin_page.py index 23c30d55..952b3722 100644 --- a/web/regression/feature_utils/pgadmin_page.py +++ b/web/regression/feature_utils/pgadmin_page.py @@ -12,6 +12,7 @@ class PgadminPage: """ Helper class for interacting with the page, given a selenium driver """ + def __init__(self, driver, app_config): self.driver = driver self.app_config = app_config @@ -20,6 +21,10 @@ class PgadminPage: def reset_layout(self): self.click_element(self.find_by_partial_link_text("File")) self.find_by_partial_link_text("Reset Layout").click() + self.click_modal_ok() + + def click_modal_ok(self): + time.sleep(0.1) self.click_element(self.find_by_xpath("//button[contains(.,'OK')]")) def add_server(self, server_config): @@ -44,24 +49,25 @@ class PgadminPage: self.find_by_xpath("//*[@id='tree']//*[.='" + server_config['name'] + "' and @class='aciTreeItem']").click() self.find_by_partial_link_text("Object").click() self.find_by_partial_link_text("Delete/Drop").click() - time.sleep(0.5) - self.find_by_xpath("//button[contains(.,'OK')]").click() + self.click_modal_ok() def toggle_open_tree_item(self, tree_item_text): self.find_by_xpath("//*[@id='tree']//*[.='" + tree_item_text + "']/../*[@class='aciTreeButton']").click() def find_by_xpath(self, xpath): - return self.wait_for_element(lambda: self.driver.find_element_by_xpath(xpath)) + return self.wait_for_element(lambda (driver): driver.find_element_by_xpath(xpath)) def find_by_id(self, element_id): - return self.wait_for_element(lambda: self.driver.find_element_by_id(element_id)) + return self.wait_for_element(lambda (driver): driver.find_element_by_id(element_id)) def find_by_partial_link_text(self, link_text): - return WebDriverWait(self.driver, self.timeout).until( - EC.element_to_be_clickable((By.PARTIAL_LINK_TEXT, link_text))) + return self._wait_for( + 'link with text "#{0}"'.format(link_text), + EC.element_to_be_clickable((By.PARTIAL_LINK_TEXT, link_text)) + ) def click_element(self, element): - def click_succeeded(): + def click_succeeded(driver): try: element.click() return True @@ -72,7 +78,7 @@ class PgadminPage: def fill_input_by_field_name(self, field_name, field_content): field = self.find_by_xpath("//input[@name='" + field_name + "']") - backspaces = [Keys.BACKSPACE]*len(field.get_attribute('value')) + backspaces = [Keys.BACKSPACE] * len(field.get_attribute('value')) field.click() field.send_keys(backspaces) @@ -88,8 +94,8 @@ class PgadminPage: self.find_by_xpath("//*[contains(@class,'wcPanelTab') and contains(.,'" + tab_name + "')]").click() def wait_for_input_field_content(self, field_name, content): - def input_field_has_content(): - element = self.driver.find_element_by_xpath( + def input_field_has_content(driver): + element = driver.find_element_by_xpath( "//input[@name='" + field_name + "']") return str(content) == element.get_attribute('value') @@ -97,10 +103,10 @@ class PgadminPage: return self._wait_for("field to contain '" + str(content) + "'", input_field_has_content) def wait_for_element(self, find_method_with_args): - def element_if_it_exists(): + def element_if_it_exists(driver): try: - element = find_method_with_args() - if element.is_displayed() & element.is_enabled(): + element = find_method_with_args(driver) + if element.is_displayed() and element.is_enabled(): return element except NoSuchElementException: return False @@ -108,9 +114,9 @@ class PgadminPage: return self._wait_for("element to exist", element_if_it_exists) def wait_for_spinner_to_disappear(self): - def spinner_has_disappeared(): + def spinner_has_disappeared(driver): try: - self.driver.find_element_by_id("pg-spinner") + driver.find_element_by_id("pg-spinner") return False except NoSuchElementException: return True @@ -118,24 +124,15 @@ class PgadminPage: self._wait_for("spinner to disappear", spinner_has_disappeared) def wait_for_app(self): - def page_shows_app(): - if self.driver.title == self.app_config.APP_NAME: + def page_shows_app(driver): + if driver.title == self.app_config.APP_NAME: return True else: - self.driver.refresh() + driver.refresh() return False self._wait_for("app to start", page_shows_app) def _wait_for(self, waiting_for_message, condition_met_function): - time_waited = 0 - sleep_time = 0.01 - - while time_waited < self.timeout: - result = condition_met_function() - if result: - return result - time_waited += sleep_time - time.sleep(sleep_time) - - raise AssertionError("timed out waiting for " + waiting_for_message) \ No newline at end of file + return WebDriverWait(self.driver, self.timeout, 0.01).until(condition_met_function, + "Timed out waiting for " + waiting_for_message) -- 2.11.0