使用 Selenium、JavaScript 和 Node.js 检查元素是否存在

新手上路,请多包涵

我试图在执行此行之前检查元素是否存在:

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

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

throw error; ^ NoSuchElementError: no such element

原文由 F. Rakes 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 356
2 个回答

您可以利用 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);
        }
    });

我找不到它在文档中明确说明,但从 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) {

原文由 Aaron Silverman 发布,翻译遵循 CC BY-SA 3.0 许可协议

Aaron Silverman 的回答 没有按预期工作( 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

原文由 Arthur Weborg 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题