如果元素不存在,如何使用Selenium find_element_by没有等待时间的函数?

时间:2014-04-15 18:42:16

标签: python selenium selenium-webdriver webdriver

有时你想对页面中可能存在或不存在的对象进行操作,显然你只想在页面上存在对象时执行操作,但是如果对象不存在则是也没关系,但你不希望自动化中断。现在,我一直以两种不同的方式处理这种情况:

使用find_elements_by_something方法和if:

my_var = driver.find_elements_by_xpath(some_xpath)
if len(my_var) > 0:
    # the element is present so do the action

使用find_element_by_something方法和try:

try:
    my_var =  driver.find_element_by_id(some_id)
    # do the action
except:
    # do something else

上面提到的两种方法都有效,但它们有一个很大的问题,它们都会使自动化变慢,因为它们都试图使用驱动程序超时来查找元素,因此可能需要一段时间。

有没有办法在不使用任何超时的情况下尝试查找元素?如果那个元素在那个时刻不存在就好了,我不希望selenium等待一段时间,我只是想知道元素是否存在。

解决方案:

基于@grumpasaurus的回复

driver.implicitly_wait(0)
try:
    my_var =  driver.find_element_by_id(some_id)
    # do the action
except:
    # do something else
driver.implicitly_wait(old_wait_time)

2 个答案:

答案 0 :(得分:2)

我相信您正在研究明确/隐含的等待情况。

http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp

Selenium允许您在进行测试时更改隐式等待,以更改您希望等待元素显示的时间。从技术上讲,如果你不想让你的测试失败,你可以将它改为0有一个救援条款。

答案 1 :(得分:1)

在使用上述任何方法之前,您只需确保它位于页面来源中。

例如:

str1 = 'id="'+some_id+'"'
str2 = "id='"+some_id+"'"
page_source = driver.page_source
if str1 in page_source or str2 in page_source:
    try:
        my_var = driver.find_element_by_id(some_id)
        # do the action
    except:
        # do something else

这应该会显着减少您尝试查找不在DOM中的元素的次数(假阴性)。当然,如果元素是动态添加到客户端的DOM(使用Javascript),那么你可能会在它实际存在的时候撤销尝试(假阳性)。

因此,在选择应用此方法之前,您应该仔细检查网页...