我尝试在执行此行之前检查元素是否存在:
driver.findElement(webdriver.By.id('test'));
这会引发错误"没有这样的元素"如果文档中存在标识test
,即使在try
- 块中也是如此。
我找到了Java的答案,你可以在那里查看大小是否为0,但在node-js中,这会在我检查大小之前抛出错误。
throw error;
^
NoSuchElementError: no such element
答案 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)方法?这是代码的链接:
答案 2 :(得分:1)
所选答案未按预期工作(err.state
为undefined
且始终抛出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!");
}