driver.wait(until.elementIsPresent(By.css(".popup-backdrop fade")), 15000);
How do I do the opposite of this? I want to wait till the ".popup-backdrop fade" overlay disappears before I click on an element.
I am using Selenium-webdriver (using Javascript and not using Java or Python or C#)
driver.wait(until.elementIsPresent(By.css(".popup-backdrop fade")), 15000);
How do I do the opposite of this? I want to wait till the ".popup-backdrop fade" overlay disappears before I click on an element.
I am using Selenium-webdriver (using Javascript and not using Java or Python or C#)
Share Improve this question asked Apr 7, 2016 at 18:10 SUMSUM 1,6614 gold badges34 silver badges58 bronze badges5 Answers
Reset to default 6Haven't found the negative wait in the code source. A solution would be to implement your own condition:
var webdriver = require('selenium-webdriver');
var until = webdriver.until;
var By = webdriver.By;
until.elementIsNotPresent = function elementIsNotPresent(locator) {
return new until.Condition('for no element to be located ' + locator, function(driver) {
return driver.findElements(locator).then(function(elements) {
return elements.length == 0;
});
});
};
driver.wait(until.elementIsNotPresent(By.css(".popup-backdrop fade")), 15000);
As indicated on the ment to the accepted question, until.Condition is not a valid constructor in Selenium 4. Instead, one can do this:
const { By, until, Condition } = require('selenium-webdriver');
until.elementIsNotPresent = function elementIsNotPresent(locator) {
return new Condition('for no element to be located ' + locator, function(driver) {
return driver.findElements(locator).then(function(elements) {
return elements.length === 0;
});
});
};
The reference to using Condition can be found here: https://github./seleniumhq/selenium/issues/2755
This is another solution of the problem, more inline (but it works, as opposed to the accepted answer which crashes with "TypeError: until.Condition is not a constructor"):
await this._webDriver.wait(() => {
return this._webDriver.findElements(By.id('loadingIndicator')).then(function(found) {
return found.length === 0;
});
}, 3000, 'The element should disappear');
You could also try something like:
let faderElement = webdriver.By.css('.fader');
driver.wait(webdriver.until.elementLocated(faderElement));
let faderElementFound = driver.findElement(faderElement);
driver.wait(webdriver.until.elementIsVisible(faderElementFound));
driver.wait(webdriver.until.elementIsNotVisible(faderElementFound));
Good news, it's built in now
It looks like elementIsNotVisible
has been added to until
after the previous answers were given. I'm using selenium webdriver 4.0.0-beta.3
Check it out:
const timeout = 60 * 1000; // 60 seconds
const element = await driver.findElement(By.id(elementId));
// this is the important line
await driver.wait(until.elementIsNotVisible(element), timeout);