Python 关于 lambda 在 WebDriverWait () 中的用法

wskuku · 2020年08月06日 · 最后由 wskuku 回复于 2020年08月06日 · 2759 次阅读
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
driver=webdriver.Firefox()
driver.get()
WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("someId"))

问题:实在不明白的一点是,WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("someId")) 这段里面 until() 传入的是 lambda,一般正常使用传入的为 find_element_byid("someId") 之类的验证信息,但是这里用 lambda 代替了,我不太理解的是 lambda 里的 x 不应该是形参吗,这里什么都没传进去为什么还能执行,好像下面这样:

共收到 6 条回复 时间 点赞

没用过这个方法,但是 这里 x(dirver) 这个参数应该是要传进去的吧

匿名 #2 · 2020年08月06日

python 跟 java 不一样吧 传入的都是值的一个空间地址

def lambda_method(x):
    return x.find_element_by_id('someId')
WebDriverWait(driver, 10).until(lambda_method)

这样写差不多能看懂了吧,主要还是熟悉下 lambda 干嘛的,还有 until 里面的具体实现

YueChen 回复

看了下 until 的源码,传进去的对象一定要有 call() 才行,不是单独传进去验证条件的。谢谢

wskuku 关闭了讨论 08月06日 15:09
wskuku 重新开启了讨论 08月06日 15:09

这问题不看源码根本答不上😅

def until(self, method, message=''):
    """Calls the method provided with the driver as an argument until the \
    return value is not False."""
    screen = None
    stacktrace = None

    end_time = time.time() + self._timeout
    while True:
        try:
            value = method(self._driver)
            if value:
                return value

看到这里就能明白,self.driver 是你 lambda 函数的参数,而且被执行了

MarvinWu 回复

是的~ 我也是用到 util() 的时候看到示例给的是 method,但是又给了一个 lambda 却看不懂了。事后也是才想起来找找源码发现是要有 call() 属性才行。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册