From 4555730ab6d285576a94508ac9807b7e43210c63 Mon Sep 17 00:00:00 2001
From: Joao Pereira and Tira Odhner <pair+jpereira+aodhner@pivotal.io>
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

