【问题标题】:Selenium-webdriver (Java Script) wait for element to disappearSelenium-webdriver (Java Script) 等待元素消失
【发布时间】:2016-07-28 19:11:18
【问题描述】:
driver.wait(until.elementIsPresent(By.css(".popup-backdrop fade")), 15000);

我该如何做相反的事情?我想等到“.popup-backdrop fade”覆盖消失后再点击一个元素。

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

【问题讨论】:

    标签: javascript selenium-webdriver


    【解决方案1】:

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

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

    【讨论】:

    • 从 selenium 4 开始,until.Condition 不是构造函数。
    【解决方案2】:

    正如对已接受问题的评论所述,直到.Condition 不是 Selenium 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;
        });
      });
    };
    

    使用 Condition 的参考可以在这里找到: https://github.com/seleniumhq/selenium/issues/2755

    【讨论】:

      【解决方案3】:

      这是该问题的另一种解决方案,更内联(但它有效,而不是接受的答案因“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');
      

      【讨论】:

        【解决方案4】:

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

        在给出之前的答案后,elementIsNotVisible 似乎已添加到 until。我正在使用 selenium webdriver 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);
        

        【讨论】:

          【解决方案5】:

          你也可以试试:

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

          【讨论】:

          • 请解释这段代码如何完成 OP 的要求
          • 代码在某种程度上是不言自明的,但是:前 4 行确保推子被发现并且可见。很多时候推子不是立即可见或可识别的,这就是为什么等待元素被定位然后可见的原因。只有在第 5 行时,我们才等待元素淡出或消失。如果假设推子确实隐藏了一个按钮,那么现在可以点击该按钮了。
          猜你喜欢
          • 2016-12-25
          • 1970-01-01
          • 2018-07-31
          • 2012-03-26
          • 1970-01-01
          • 1970-01-01
          • 2012-07-28
          • 2013-08-06
          • 1970-01-01
          相关资源
          最近更新 更多