我是lambda的新手,我想知道是否有人可以给我提示如何将C#return语句转换为python,这是可能的。
WebDrivrWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
var imagesLink = wait.Until(d =>
{
var elements = driver.FindElements(By.ClassName("kl"));
if (elements.Count > 0)
return elements[0];
return null;
});
imagesLink.Click();
在FB上运行测试时,简单的selenium显式等待对我和几乎所有的时间都没有问题。 到目前为止,我已经找到了等待赋值函数,但是我不知道如何在lambda中创建带有返回值的变量和if语句。有没有什么好处?
答案 0 :(得分:1)
Python lambda函数非常有限,只能包含一个表达式。虽然你可以,理论上,将你的C#示例中的lambda写为单个表达式,因为你不能进行任务,你必须两次调用driver.FindElements
,这是冗长而低效的。相反,使用命名函数。
答案 1 :(得分:0)
这是可能的(但是丑陋,令人困惑和不必要),没有使用嵌套的lambdas调用find_elements
两次:
f = lambda: (lambda x: x[0] if len(x) > 0 else "Argh" )([1,2,3])
f() # returns 1
f = lambda: (lambda x: x[0] if len(x) > 0 else "Argh" )([])
f() # returns "Argh"
因此,对于您的硒示例,可以执行以下操作:
wait = WebDriverWait(driver, 10)
wait.until(lambda d: (lambda x: x[0] if len(x) > 0 else None)(d.find_elements_by_class_name("k1")))
但是,由于您只是想尝试返回第一个元素,因此您应该能够更简单地使用selenium 2 expected conditions API执行此操作:
wait.until(EC.presence_of_element_located((By.CLASS_NAME, "k1"))
嵌套的lambdas是一个有趣的技巧,但我强烈建议你不要在实际代码中使用它们!