Python-Selenium: 等待一个元素存在然后 return True or false

Python-Selenium: Wait for an element to exist then return True or false

我正在尝试创建一个函数来帮助确定某个元素是从网页中出现还是消失。

这就是我的。

def wait_for_element_to_exist(driver, by, seconds=15, negative=False):
    wait = WebDriverWait(driver, seconds)

    # waiting for element to exist
    if not negative:
        try:
            wait.until(EC.presence_of_element_located(*by))
            return True
        except:
            return False

    #wait for element not to exist
    else:
        try:
            wait.until_not(EC.presence_of_element_located(*by))
            return True
        except:
            return False

唯一的问题是它总是 returns FALSE 无论如何称呼它或元素是否存在

wait_for_element_to_exist(self.driver, (By.XPATH, 'xpath')) returnsFalse

wait_for_element_to_exist(self.driver, (By.CLASS, 'class'), negative=True) returnsFalse

我做错了什么?

我认为您的代码出错了,因为您正在使用 try except 块。如果 Selenium 没有找到元素,我认为它没有发现错误——它只是 returns None.

所以在我过去为这个问题编写的类似代码中,我做了这样的事情:

element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.TAG_NAME, "h2"))
        )

if element:
    return True
else:
    return False

因此应用于您的代码,如下所示:

def wait_for_element_to_exist(driver, by, seconds=15, negative=False):
    wait = WebDriverWait(driver, seconds)

    # waiting for element to exist
    if not negative:
        wait_result = wait.until(EC.presence_of_element_located(*by))
        if wait_result:
            return True
        else:
            return False

    #wait for element not to exist
    else:
        wait_result = wait.until_not(EC.presence_of_element_located(*by))
        if wait_result:
            return True
        else:
            return False

希望有用吗?

您遇到的问题是您在 presence_of_element_located(*by)

上的通话

它抛出一个 TypeError,因为 *by 解包成两个元素,这比它预期的多一个。将 *by 更改为 by.

一旦你这样做,如果你在这个页面上说,

wait_for_element_to_exist(browser, (By.ID, 'question-header'))

它returns正确

wait_for_element_to_exist(browser, (By.ID, 'timeout-header')) returns 错误。

我建议您在说

后将 except 更改为 except TimeoutException
from selenium.common.exceptions import TimeoutException

当我写过类似的函数时,我将定位方法和关联的字符串作为单独的参数传递,这样可能更容易阅读和调试。