如何在WebDriverJS中等待元素可点击?

Chr*_*dam 9 javascript selenium ui-automation selenium-webdriver

有人知道如何在WebDriverJS中等待WebElement可点击吗?我已经知道如何等待元素"可见",但我需要它是"可点击的"..类似于Python绑定中可预期的条件.我无法在Webdriver Js API中找到类似的东西.

Lou*_*uis 8

似乎没有相当于Python的条件selenium.webdriver.support.expected_conditions.element_to_be_clickable.但是,查看该条件的来源,我发现它会进行两项检查:

  1. 元素是可见的.

  2. 它已启用.

所以你可以等待这两个条件成为现实.以下代码说明了如何完成.它首先使元素不可见并禁用它,设置一些超时以使其可见并启用它,然后等待这两个条件发生.

var webdriver = require('selenium-webdriver');

var driver = new webdriver.Builder().
   withCapabilities(webdriver.Capabilities.chrome()).
   build();

driver.get('http://www.google.com');

// This script allows testing the wait. We make the element invisible
// and disable it and then set timeouts to make it visible and enabled.
driver.executeScript("\
var q = document.getElementsByName('q')[0];\
q.style.display = 'none';\
q.disabled = true;\
setTimeout(function () {\
    q.style.display = '';\
}, 2000);\
setTimeout(function () {\
    q.disabled = false;\
}, 3000);\
");
driver.findElement(webdriver.By.name('q')).then(function (element) {
    driver.wait(function () {
        return element.isDisplayed().then(function (displayed) {
            if (!displayed)
                return false;

            return element.isEnabled();
        });
    });
    element.sendKeys('webdriver');
});
driver.findElement(webdriver.By.name('btnG')).click();
driver.wait(function() {
 return driver.getTitle().then(function(title) {
   return title === 'webdriver - Google Search';
 });
}, 1000);

driver.quit();
Run Code Online (Sandbox Code Playgroud)

由于我们正在使用promises,因此代码可能看起来有点奇怪.并非承诺本质上是奇怪的,但是当他们习惯使用Python时,他们需要一些时间习惯.