检查元素是否存在 – selenium / javascript / node-js

我试图检查是否存在一个元素之前,我可以执行此行:

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

如果文档中不存在id test ,即使在try block中,也会抛出“没有这样的元素”的错误。 我find了Java的答案,在那里你可以检查大小是否为0,但在node-js这会引发错误,然后才能检查大小。

throw error; ^ NoSuchElementError: no such element

您可以利用then()的可选error handling程序参数。

 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); } }); 

我找不到它在文档中明确指出,但是从selenium-webdriver模块源代码中的webdriver/promise.js中的函数定义中确定:

  /** * 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) { 

为什么不使用isElementPresent(locatorOrElement)方法? 这里是代码的链接:

http://selenium.googlecode.com/git/docs/api/javascript/source/lib/webdriver/webdriver.js.src.html#l777

所选的答案没有按预期工作( err.state undefined ,总是抛出NoSuchElementError ) – 尽pipe使用可选callback的概念仍然有效。

由于我得到相同的错误,因为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 

听起来就像你想检查你的属性是否存在,首先:

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