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

时间:2014-10-07 17:11:38

标签: javascript selenium selenium-webdriver ui-automation

有人知道如何在WebDriverJS中点击WebElement吗? 我已经知道如何等待元素"可见",但我需要它可以点击" ...类似于Python绑定中的expectable conditions。 我还没能在Webdriver Js API中找到类似的东西。

3 个答案:

答案 0 :(得分:8)

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

  1. 该元素可见。

  2. 已启用。

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

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

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

答案 1 :(得分:1)

UNTIL似乎是webdriver js中最接近的东西:

检查: https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/until.html

那里已经定义了等待条件。 我不知道哪一个应该被认为是可以解决的。

答案 2 :(得分:1)

如果您不关心点击该对象 **,那么您可以执行以下操作:

function clickWhenClickable(locator, timeout){
  driver.wait(function(){
    return driver.findElement(locator).then(function(element){
      return element.click().then(function(){
        return true;
      }, function(err){
        return false;
      })
    }, function(err){
      return false;
    });
  }, timeout, 'Timeout waiting for ' + locator.value);    ;
}

**如果只是想检查该元素是否可点击而不必点击,那么此代码段不适合您。在那种情况下,我会说webdriver js没有提供这样做的手段。 (或者至少我还没有找到,欢迎见解:))