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

时间:2013-11-22 15:45:12

标签: javascript node.js selenium

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

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

这会引发错误"没有这样的元素"如果文档中存在标识test,即使在try - 块中也是如此。 我找到了Java的答案,你可以在那里查看大小是否为0,但在node-js中,这会在我检查大小之前抛出错误。

throw error; ^ NoSuchElementError: no such element

8 个答案:

答案 0 :(得分: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.js模块源selenium-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) { 

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

所选答案未按预期工作(err.stateundefined且始终抛出NoSuchElementError - 尽管使用可选回调的概念仍然有效。

由于我收到与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

答案 3 :(得分:1)

接受的答案并不完全适合我,尽管其中的某些部分很有帮助。上面 Arthur Weborg 的回答对我有用,尽管有些部分引起了问题:https://stackoverflow.com/a/45273140/5648143

“检查元素是否存在”的典型用例是当我想单击元素时,仅当它存在时,因为如果它不存在,它会因错误而导致程序崩溃。我想要的只是让应用程序注意到它不存在,然后继续。所以我要做的是:

await driver.findElement(By.id("test")).then(found => {
  driver.findElement(By.id("test")).click()
}, error => {
  if (error instanceof webdriver.error.NoSuchElementError) {
    console.log('Element not found.');
  }
});

只是一个简单的控制台日志,然后按照我想要的方式继续执行程序的其余部分。

答案 4 :(得分:0)

要在UI上查找元素之前,要检查元素是否存在。     您可以等到元素位于UI上,然后才能执行find元素操作。

Ex:下面的代码等待直到找到元素,然后它将执行find元素。

<?php 
$pc = rp_user_data_func("pc", "1");
if (empty($pc))
    $pc = '0';

function myfnc($pc2) {
$user_id = 1;
update_user_meta($user_id, 'pc', $pc2);
$pct = rp_user_data_func("pc", "1");
unset($_POST);
}

if (isset($_POST['submit']) && !empty($_POST['pc'])) {
myfnc($_POST['pc']);
}
?>
<html>
<head>
    <script type="text/javascript">
        var pc = <?php echo $pc; ?>;

        function pc_add() {
            pc = pc + 1;
            alert(pc);
            document.getElementById('pc').setAttribute('value',pc);
        }
        function pc_sub() {
            pc = pc - 1;
            alert(pc);
            document.getElementById('pc').setAttribute('value',pc);
        }
    </script>
    <style> 
        .square_add{ width: 100px; height: 100px; Background-color: green; float: left;}
        .square_sub{ width: 100px; height: 100px; Background-color: red; float: left;}
    </style>
</head>
<body>
    <div class="square_add" onclick="pc_add();">ADD</div>
    <div class="square_sub" onclick="pc_sub();">SUB</div>
    <form action="." method="post">
        <input type="hidden" name="pc" id="pc" value="" />
        <input type="submit" name="submit" value="submit">          
    </form>
</body>

答案 5 :(得分:0)

我知道这有点晚了,但这是对我有用的代码。

var assert = require('assert');
var expect = require('chai').expect;
var should = require('chai').should();
var chai = require('chai');
var chaiAsPromised = require('chai-as-promised');

chai.use(chaiAsPromised);
chai.should();

var webdriver = require('selenium-webdriver');
By = webdriver.By;
until = webdriver.until;

describe('checking if an element id exists', function() {

  it.only('element id exists', function () {
    var driver = new webdriver.Builder().forBrowser('chrome').build();
    driver.get('http://localhost:3000');
    this.timeout(6000);

    return driver.wait(until.elementLocated(By.id('idWeWantToTest')), 5 * 1000).then( (e) => {
    }, function(err) {
      throw {
        msg: "element not found"
      }
    }).then( () => {
      driver.quit();
    });     
  });
})

答案 6 :(得分:0)

这是像我这样的新手的摘要;-)

here所述:

为了与其他Selenium语言绑定保持一致,已弃用WebDriver#isElementPresent()WebElement#isElementPresent()。这些方法将在v3.0中删除。使用findElements命令测试元素的存在:

  driver.findElements(By.css('.foo')).then(found => !!found.length);

答案 7 :(得分:-2)

听起来你想检查你的房产是否存在,首先:

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