Selenium-webdriver (Java Script) 等待元素消失

Selenium-webdriver (Java Script) wait for element to disappear

本文关键字:等待 元素 消失 Script Java Selenium-webdriver      更新时间:2024-03-06
driver.wait(until.elementIsPresent(By.css(".popup-backdrop fade")), 15000);

我该如何做与此相反的事情?我想等到".popup-backdrop fade"叠加层消失后再单击元素。

我正在使用Selenium-webdriver(使用Javascript,而不是使用Java,Python或C#(

在代码源中未找到负等待。解决方案是实现您自己的条件:

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);

如已接受问题的评论所示,直到。条件不是硒 4 中的有效构造函数。相反,可以这样做:

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;
    });
  });
};

有关使用条件的参考,可在此处找到:https://github.com/seleniumhq/selenium/issues/2755

这是问题的另一种解决方案,更内联(但它有效,而不是接受的答案崩溃"TypeError:直到。条件不是构造函数"(:

    await this._webDriver.wait(() => {
        return this._webDriver.findElements(By.id('loadingIndicator')).then(function(found) {
            return found.length === 0;
        });
    }, 3000, 'The element should disappear');

你也可以尝试这样的事情:

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));

好消息,它现在已经内置了

看起来在给出之前的答案后,elementIsNotVisible已被添加到until中。我正在使用硒网络驱动程序4.0.0-beta.3

看看吧:

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);