WebDriverWait.until的自定义子例程会引发错误

时间:2016-04-05 17:10:01

标签: python-2.7 selenium-webdriver

我正在使用selenium和python测试一个有角度的网络应用程序。对于我的测试,我使用API​​调用设置一些数据。现在我想等到数据出现在前端,然后再进行测试。我们目前有60秒的时间来克服这个问题;但是,我希望能有更聪明的等待并写下以下代码:

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

在我的测试脚本中,我正在调用:

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

但是,当我运行此代码时 - 我收到以下错误:

error: 'int' object is not callable"

如果我更改wait_for_plan_to_appear以使其返回布尔值,则会抛出错误:

error: 'bool' object is not callable"

有人在工作中看到/解决了这个问题吗?感谢

1 个答案:

答案 0 :(得分:1)

我会使用"...".format()自动将plan_id转换为字符串。 此外,您可以通过使用预期条件来简化服务员:

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)