迭代列表长度并创建函数列表

时间:2016-03-21 16:56:31

标签: python python-2.7

在下面的代码片段中,我手动输入了两个函数,这两个函数是 AnyEc 的参数。

def element_visible(context, element_id):
    element = WebDriverWait(context.browser, 10).until(AnyEc(
        expected_conditions.visibility_of_element_located((By.ID, element_id[0])),
        expected_conditions.visibility_of_element_located((By.ID, element_id[1]))
    ))
    return element

我如何能够将这些参数创建为函数,具体取决于 element_id 的列表长度?

我已经尝试过使用eaches,但是无法生成以逗号分隔的函数列表,这些函数没有被解析为字符串参数。

修改 看起来迭代函数现在正在使用建议的更新运行。不幸的是,似乎我不再让函数返回。

以下是我更新的代码:

class AnyEc:
    # Use with WebDriverWait to combine expected_conditions in an OR
    def __init__(self, *args):
        self.ecs = args

    def __call__(self, browser):
        for fn in self.ecs:
            try:
                if fn(browser):
                    # Return element ID located and element object
                    return [fn.locator[1], fn(browser)]
            except:
                pass

def element_visible(context, element_id):
    # Iterate through element_id list to provide args for AnyEc
    args = [expected_conditions.visibility_of_element_located((By.ID, id)) for id in element_id]
    element = WebDriverWait(context.browser, 10).until(AnyEc(*args))
    return element

编辑2: 我现在正在使用以下代码,尽管它不够优雅:

def element_visible(context, element_id):
    if isinstance(element_id, str):
        element = WebDriverWait(context.browser, 10).until(AnyEc(
            expected_conditions.visibility_of_element_located((By.ID, element_id))
        ))
    else:
        element = WebDriverWait(context.browser, 10).until(AnyEc(
            expected_conditions.visibility_of_element_located((By.ID, element_id[0])),
            expected_conditions.visibility_of_element_located((By.ID, element_id[1]))
        ))
    return element

3 个答案:

答案 0 :(得分:3)

在列表中收集预期条件,然后 unpack the list

conditions = [
    expected_conditions.visibility_of_element_located((By.ID, item))
    for item in element_id
]
element = WebDriverWait(context.browser, 10).until(AnyEc(*conditions))

答案 1 :(得分:2)

首先创建你的功能:

args = [expected_conditions.visibility_of_element_located((By.ID, id_)) 
        for id_ in element_id]

*

一起使用
element = WebDriverWait(context.browser, 10).until(AnyEc(*args))

您可以使用*语法将definitions序列(例如list)作为单独的参数。

答案 2 :(得分:1)

使用Python的* args将参数列表传递给函数:

def element_visible(context, element_id):
    any_ec_args = []
    for i, element in enumerate(element_id):
        arg = expected_conditions.visibility_of_element_located((By.ID,
                                                                 element_id[i]))
        any_ec_args.append(arg)
    element = WebDriverWait(context.browser, 10).until(AnyEc(*any_ec_args))
    return element