在下面的片段中,我手动输入了两个作为 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 的列表长度,我如何才能将这些参数创建为函数?
我已经尝试使用 for 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
请您参考如下方法:
在列表中收集预期条件,然后 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))
