2016-04-05 16 views
1

Ich teste eine eckige Web-App mit Selen und Python. Für meinen Test richte ich einige Daten über API-Aufrufe ein. Jetzt möchte ich warten, bis die Daten im Frontend angezeigt werden, bevor ich mit meinem Test fortfahre. Wir haben derzeit eine Wartezeit von 60 Sekunden, um dieses Problem zu überwinden. aber ich war für eine intelligentere Warte hoffen und schrieb den folgenden Code:benutzerdefinierte Subroutine für WebDriverWait.until wirft einen Fehler

def wait_for_plan_to_appear(self,driver,plan_locator): 

    plan_name_element = UNDEF 

    try: 
     self.navigateToPlanPage() 
     plan_name_element = driver.find_element_by_xpath(plan_locator) 
    except NoSuchElementException: 
     pass 

    return plan_name_element 

def find_plan_name_element(self,plan_id): 

    plan_locator = '//*[@data-hraf-id="'+plan_id+'-plan-name"]' 
    plan_name_element = UNDEF 
    try: 
     plan_name_element = WebDriverWait(self.driver,60,2).until(self.wait_for_plan_to_appear(self.driver,plan_locator)) 
    except TimeoutException: 
     self.logger.debug("Could not find the plan with plan_id = "+plan_id) 
    return plan_name_element 

In meinem Test-Skript, ich rufe:

self.find_plan_name_element('e7fa25a5-0b39-4a97-b99f-44c48439ce99') # the long string is the plan-id 

Allerdings, wenn ich diesen Code ausführen - ich erhalte folgende Fehler :

error: 'int' object is not callable" 

Wenn ich die wait_for_plan_to_appear, so dass es gibt einen booleschen ändern, wirft es Fehler:

error: 'bool' object is not callable" 

Hat jemand das in seiner Arbeit gesehen/gelöst? Danke

Antwort

1

Ich würde "...".format() verwenden, um die plan_id automatisch in eine Zeichenfolge zu konvertieren. Darüber hinaus können Sie den Kellner mit einer erwarteten Bedingung zu vereinfachen:

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.common.exceptions import NoSuchElementException, StaleElementReferenceException 

class element_loaded_and_displayed(object): 
    """ An expectation for checking that an element is present on the DOM of a 
    page and visible. Refreshes the page if the element is not present. 
    returns the WebElement once it is located and visible. 
    """ 
    def __init__(self, locator): 
     self.locator = locator 

    def __call__(self, driver): 
     try: 
      element = driver.find_element(*self.locator) 
      return element if element.is_displayed() else False 
     except StaleElementReferenceException: 
      return False 
     except NoSuchElementException as ex: 
      driver.refresh() 
      raise ex 

def find_plan_name_element(self, plan_id): 
    plan_locator = (By.CSS_SELECTOR, "[data-hraf-id='{0}-plan-name']".format(plan_id)) 
    err_message = "Could not find the plan with plan_id = {0}".format(plan_id) 

    wait = WebDriverWait(self.driver, timeout=60, poll_frequency=2) 
    return wait.until(element_loaded_and_displayed(plan_locator), err_message) 
+0

Vielen Dank Florent. Allerdings habe ich die vorgeschlagene Änderung (über die Verwendung von .format()) gemacht und ich bekomme immer noch den gleichen Fehler. Ich kann EC.visibility_of_element_located nicht verwenden, da ich die Seite jedes Mal aktualisieren muss, bevor Sie überprüfen, ob das Element in der Liste angezeigt wird. Gibt es eine Möglichkeit, die Seitenaktualisierung zu erzwingen, bevor die Elementsichtbarkeit mithilfe von EC überprüft wird? Wenn ich EC verwende, verschwindet dieser Fehler; Allerdings löst es mein Problem nicht, da das Element manchmal nicht verfügbar ist, wenn die Seite zum ersten Mal aufgerufen wird und mehrere Seitenaktualisierungen benötigt werden. –

Verwandte Themen