我有一个带有各种选项的选择框的页面,我正在编写验收测试,以检查页面首次加载时是否选择了正确的选项。我希望使用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” - 有什么想法吗?
答案 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();
});
});