getText()无法从下拉列表中选择

时间:2014-02-24 17:09:15

标签: javascript selenium selenium-webdriver

我有一个带有各种选项的选择框的页面,我正在编写验收测试,以检查页面首次加载时是否选择了正确的选项。我希望使用WebdriverJs这样做但由于某种原因,getText()总是返回一个空字符串。

在加载时,我希望页面看起来像这样:

<select class='nav-menu'>
  <option value="global" selected="selected">WORLDWIDE</option>
  <option value="us">USA</option>
  <option value="uk">UNITED KINGDOM</option>
  <option value="au">AUSTRALIA</option>
  <option value="ca">CANADA</option>
  <option value="de">GERMANY</option>
  <option value="es">SPAIN</option>
  <option value="fr">FRANCE</option>
</select>

然后我尝试找出当前所选选项的值,如下所示:

browser.findElement(webdriver.By.css('.nav-menu option[selected="selected"]')).getText().then(function(selectedText){
  console.log("selectedText: " + selectedText);
  next();
});

但是,这也是一个空字符串。

使用Chrome开发者工具调用JavaScript等效工具正在返回“WORLDWIDE” - 有什么想法吗?

3 个答案:

答案 0 :(得分:1)

我不使用WebDriverJS,所以我无法证明我的理论,但我想这是因为Selenium getText()只适用于可见元素?

  • 尝试使用getAttribute("textContent")

  • 首先点击.nav-menu,然后点击getText()

答案 1 :(得分:1)

嗯,有些玩游戏表明CSS选择工作正常,但是getText()方法无法正常工作。

目前,我已经使用innerHTML属性

browser.findElement(webdriver.By.css('.nav-menu option[selected="selected"]')).getAttribute('innerHTML').then(function(selectedText){
  console.log("selectedText: " + selectedText);
  next();
});

所以CSS选择器似乎可靠,但我也会尝试使用user1177636中的textContent建议。

答案 2 :(得分:0)

我发现通过css +所选属性选择'option'元素是不可靠的。

以下适用于我:

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

var dd = driver.findElement(By.id('myId'));
dd.findElements(By.tagName('option')).then(function (options) {
    options.forEach(function(option) {
        option.isSelected().then(function(selected) {
            if (selected) {
                option.getText().then(function(text) {
                    console.log(text);
                    done(); //mocha async callback
                });
            }
        });         
    });
});

你可以将它包装成一个函数,例如:

var wd = require('selenium-webdriver'),
    By = wd.By;

function getFirstSelected(selectList) {
    var d = wd.promise.defer();

    selectList.findElements(wd.By.tagName('option')).then(function (options) {
        options.forEach(function(option) {
            option.isSelected().then(function(isSelected) {
               if (isSelected) {
                   d.fulfill(option);
               }
            });
        });
    });

    return d.promise;
}

并使用它:

var sl = driver.findElement(wd.By.id('myId'));

getFirstSelected(sl).then(function(option) {
    option.getText().then(function(text) {
        console.log(text);
        done();
    });
});