javascript - Selenium-webdriver JS - 如何等到元素可见

标签 javascript selenium selenium-webdriver xpath webdriver

使用 selenium-webdriver ( api docs here ),你怎么能等待一个元素可见?

我有以下功能,是一组自制测试助手的一部分,第一个可以工作,但第二个失败(例如,即使存在,它也会超时并且元素可见 - 正如第一个所证实的那样有效的功能 - 并且是可见的 - 由页面 html/css/js 的所有可以想象的测试和检查所证实)。

他们来了:

/**
 * Wait for an element to exist
 * 
 * @param  {object} locator
 * @param  {int} timeout (ms)
 * 
 * @return {Promise<element>}
 */
// !! THIS WORKS OK
exports.waitForElement = function (locator, timeout) {
  var waitTimeout = timeout || DEFAULT_TIMEOUT;

  return this.wait(until.elementLocated(locator), waitTimeout)
    .then(() => {

        return this.findElement(locator);
      });
};


/**
 * Wait for an element to exist and then wait for it to be visible
 *
 * IMPORTANT: this is probable what you want to use instead of
 *   waitForVisibleElement most of the time.
 * 
 * @param  {hash} locator
 * @param  {number} timeout
 * 
 * @return {Promise<element>}
 */
// !! THIS FAILS TO WORK AS EXPECTED
exports.waitForVisibleElement = function (locator, timeout) {
  var waitTimeout = timeout || DEFAULT_TIMEOUT;

  return this.waitForElement(locator, waitTimeout) 
    .then(el => {
      console.log('--- element found:', el);
      return this.wait(until.elementIsVisible(el), waitTimeout)

        .then(() => {
          console.log('--- element visible!');
          // this is to make sure we are returning the same kind of
          // promise as waitForElement
          return this.findElement(locator);
        });

    });
};

...我在多个上下文中进行了测试,所以这不是问题的其他原因,然后是 waitForVisibleElement 中的代码但我似乎找不到它为什么不起作用的任何原因!

作为澄清,this因为该代码最终成为 new webdriver.Builder().withCapabilities(webdriver.Capabilities.chrome()).build() 之后的 webdriver 实例(augment 的结果)方法monkeypatches一个给定的webdriver对象......可能是一个有问题的设计模式,但这里没有我的问题的原因:)

更新:显然这只发生在 XPath 定位器上,例如 { xpath: '//*[contains(text(), "first name")]' } ...并不是说它现在更有意义了。此外,Firefox 也是如此,所以它不是一个奇怪的 chrome-webdriver 东西......

最佳答案

这很可能是一个 Promise 问题。
试试这个:

exports.waitForElement = function (locator, timeout) {
  var timeout = timeout || DEFAULT_TIMEOUT;
  return this.wait(until.elementLocated(locator), timeout);
};

exports.waitForVisibleElement = function (locator, timeout) {
  var timeout = timeout || DEFAULT_TIMEOUT;
  var element = this.wait(until.elementLocated(locator), timeout);
  return this.wait(new until.WebElementCondition('for element to be visible ' + locator, function() {
    return element.isDisplayed().then(v => v ? element : null);
  }), timeout);
};

用法:
driver.get("...");

driver.waitForElement(By.id("..."), 2000).getText().then(function(text){
  console.log(text);
});

driver.waitForVisibleElement(By.id("..."), 2000).getText().then(function(text){
  console.log(text);
});

关于javascript - Selenium-webdriver JS - 如何等到元素可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36309529/

相关文章:

java - Maven/Netbeans具有不同的测试配置文件和环境变量

java - SoapUI项目执行后WebDriver异常

java - 如何使用 Selenium WebDriver 和 Java 获得选定的选项

python - 等待未知的弹出窗口

node.js - 等效于ExpectedConditions。的 Node ,或等待许多元素之一

javascript - 不明白为什么forEach无法访问Array的循环

javascript - 如何通过Webpack将版本哈希附加到样式文件?

javascript - 为什么在未发出双击时我会进入 dblclick 处理程序?

javascript - nodejs 服务器抵御 DOS 攻击

javascript - 如何使用 Selenium Webdriver 处理从 DOM 中删除的 Web 元素?