Check if element exists - selenium / javascript / node-js
The selected answer did not work as expected (err.state
was undefined
and a NoSuchElementError
was always thrown) -- though the concept of using the optional callbacks still works.
Since I was getting the same error as the OP is referencing, I believe NoSuchElementError
should be referenced when determining if the targeted element exists or not. As it's name implies is the error that is thrown when an element does not exist. So the condition in the errorCallback should be:
err instanceof webdriver.error.NoSuchElementError
So the complete code block would be as follows (I also am using async
/await
for those taking advantage of that syntax):
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
Why not just use the isElementPresent(locatorOrElement) method? here's a link to the code:
http://selenium.googlecode.com/git/docs/api/javascript/source/lib/webdriver/webdriver.js.src.html#l777
You can leverage the optional error handler argument of 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);
}
});
I couldn't find it explicitly stated in the documentation, but determined this from the function definition in webdriver/promise.js
in the selenium-webdriver
module source:
/**
* 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) {