2013-11-22 85 views
7

我试图检查元素是否存在,我才可以执行此行:检查是否存在元素 - 硒/ JavaScript的/节点JS

driver.findElement(webdriver.By.id('test'));

这将引发错误“没有这样的元素”如果文档中不存在id test,即使在try-区块中。 我找到了Java的答案,您可以检查大小是否为0,但是在node-js中,在检查大小之前会抛出错误。

throw error; ^ NoSuchElementError: no such element

+0

你不能只用这个:if(webdriver.By.id('test')){driver.findElement(webdriver.By.id('test')); }。 – JeffreyZ

+0

findElements()和size() – epascarello

+0

@ user2389688 webdriver.by.id(“anything”)似乎总是导致true。 –

回答

24

您可以利用的then()可选的错误处理程序参数。

driver.findElement(webdriver.By.id('test')).then(function(webElement) { 
     console.log('Element exists'); 
    }, function(err) { 
     if (err.state && err.state === 'no such element') { 
      console.log('Element not found'); 
     } else { 
      webdriver.promise.rejected(err); 
     } 
    }); 

我找不到它的文件中明确规定,但在webdriver/promise.jsselenium-webdriver模块源确定这个从函数定义:

/** 
    * Registers a callback on this Deferred. 
    * @param {Function=} opt_callback The callback. 
    * @param {Function=} opt_errback The errback. 
    * @return {!webdriver.promise.Promise} A new promise representing the result 
    *  of the callback. 
    * @see webdriver.promise.Promise#then 
    */ 
    function then(opt_callback, opt_errback) { 
+3

这应该是被接受的答案,因为它是唯一演示如何确定是否存在使用NodeJS Web驱动程序的元素。 – mcranston18

+2

除非操作系统误用python而不是javascript,否则这应该是正确的答案。投票! – mekdev

+0

在我的情况下,'err'对象没有“状态”道具。它会返回这个,如果我控制台登录错误'{NoSuchElementError:没有这样的元素:无法找到元素:{“method”:“css selector”,“selector”:“img”}'。第二个条件返回'TypeError:无法读取未定义的'承诺' – RZKY

-2

听起来像是你要检查是否存在你的属性,第一:

if (webdriver.By.id) { 
    driver.findElement(webdriver.By.id('test')); 
} else { 
    console.error("Whoa, webdriver.By.id is not actually a function!"); 
} 
1

如预期所选择的答案没有工作(err.stateundefinedNoSuchElementError总是抛出) - 尽管使用可选回调的概念,仍然有效。

由于我得到的是与OP引用相同的错误,因此在确定目标元素是否存在时,我认为应该引用NoSuchElementError。因为它的名字暗示的是元素不存在时抛出的错误。所以在errorCallback的条件应该是:

err instanceof webdriver.error.NoSuchElementError

所以完整的代码块将如下(我也是使用那些服用这种语法的优势async/await):

var existed = await driver.findElement(webdriver.By.id('test')).then(function() { 
    return true;//it existed 
}, function(err) { 
    if (err instanceof webdriver.error.NoSuchElementError) { 
     return false;//it was not found 
    } else { 
     webdriver.promise.rejected(err); 
    } 
}); 
//handle value of existed appropriately here