在下面的代码片段中,我手动输入了两个函数,这两个函数是 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
答案 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