如何将c#lambda函数完全转换为python?

时间:2014-06-13 17:34:05

标签: python selenium lambda selenium-webdriver

我是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语句。有没有什么好处?

2 个答案:

答案 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是一个有趣的技巧,但我强烈建议你不要在实际代码中使用它们!