实习生测试 returns 范围输入的值不正确
Intern test returns incorrect value for range input
我有一个检查 HTML5 范围输入值的测试。
return this.remote
// etc.
.findById('range')
.getAttribute("value")
.then(function(val){
expect(parseInt(val)).to.equal(2);
});
当我检查它的初始值时,该值是正确的,但是如果我更改值再检查,它并没有更新。我发现该值也不会在开发人员工具中更新。我尝试使用
.sleep(3000)
在更改值和调用之间
.getAttribute('value')
但这似乎不是问题所在。
在此 JSfiddle 中,使用浏览器的开发人员工具检查范围元素会显示标题更改,但值不会(即使文本框中的值已正确更改)。所以这可能是 webdriver 的问题,但我想知道是否有人 运行 遇到过这个问题。
是否与测试获取不到更新值有关?我可以使用另一种方法来读取值(属性)吗?
编辑:
似乎浏览器的 onchange/oninput 事件没有正确触发(类似问题:WebDriver: Change event not firing and Why does the jquery change event not trigger when I set the value of a select using val()?),webdriver 也可能无法触发。我是否必须添加 Jquery 作为测试的定义,即使我只需要使用 trigger()
?或者有其他解决方案吗?
Edit2:我在这个新 JSfiddle 中添加了一个更好的示例,说明我如何使用范围输入。我添加了 plus/minus 按钮,这些按钮无法触发应该更新范围输入的值属性的更改事件(并且无法将值输入文本框)。
您可以在测试中手动触发更改事件。我能够在你的 JSFiddle 中获得 'textValue' 输入来更新这种方式,我想它在你的测试中可能会以类似的方式工作。
rangeBar = document.querySelector('#range');
function myFire(element, eventType) {
var myEvent = document.createEvent('UIEvent');
myEvent.initEvent(
eventType, // event type
true, // can bubble?
true // cancelable?
);
element.dispatchEvent(myEvent);
}
myFire(rangeBar, 'change');
这种情况经常出现,我的基础测试中有一个帮手 class (Java)
public enum SeleniumEvent
{blur,change,mousedown,mouseup,click,reset,select,submit,abort,error,load,mouseout,mouseover,unload,keyup,focus}
public void fireEvent(WebElement el, SeleniumEvent event)
{
((JavascriptExecutor) getDriver()).executeScript(""+
"var element = arguments[0];" +
"var eventType = arguments[1];" +
"var myEvent = document.createEvent('UIEvent');\n" +
"myEvent.initEvent(\n" +
" eventType, // event type\n" +
" true, // can bubble?\n" +
" true // cancelable?\n" +
");\n" +
"element.dispatchEvent(myEvent);", el, event.toString());
}
另一个想法。 getAttribute("value")
可能没有达到您的预期。在 JavaScript 中,document.querySelector('#range').getAttribute('value')
总是 returns 硬编码值属性(即默认值或初始值),而不是输入的当前值。
document.querySelector('#range').value
returns 当前值。
我有一个检查 HTML5 范围输入值的测试。
return this.remote
// etc.
.findById('range')
.getAttribute("value")
.then(function(val){
expect(parseInt(val)).to.equal(2);
});
当我检查它的初始值时,该值是正确的,但是如果我更改值再检查,它并没有更新。我发现该值也不会在开发人员工具中更新。我尝试使用
.sleep(3000)
在更改值和调用之间
.getAttribute('value')
但这似乎不是问题所在。
在此 JSfiddle 中,使用浏览器的开发人员工具检查范围元素会显示标题更改,但值不会(即使文本框中的值已正确更改)。所以这可能是 webdriver 的问题,但我想知道是否有人 运行 遇到过这个问题。
是否与测试获取不到更新值有关?我可以使用另一种方法来读取值(属性)吗?
编辑:
似乎浏览器的 onchange/oninput 事件没有正确触发(类似问题:WebDriver: Change event not firing and Why does the jquery change event not trigger when I set the value of a select using val()?),webdriver 也可能无法触发。我是否必须添加 Jquery 作为测试的定义,即使我只需要使用 trigger()
?或者有其他解决方案吗?
Edit2:我在这个新 JSfiddle 中添加了一个更好的示例,说明我如何使用范围输入。我添加了 plus/minus 按钮,这些按钮无法触发应该更新范围输入的值属性的更改事件(并且无法将值输入文本框)。
您可以在测试中手动触发更改事件。我能够在你的 JSFiddle 中获得 'textValue' 输入来更新这种方式,我想它在你的测试中可能会以类似的方式工作。
rangeBar = document.querySelector('#range');
function myFire(element, eventType) {
var myEvent = document.createEvent('UIEvent');
myEvent.initEvent(
eventType, // event type
true, // can bubble?
true // cancelable?
);
element.dispatchEvent(myEvent);
}
myFire(rangeBar, 'change');
这种情况经常出现,我的基础测试中有一个帮手 class (Java)
public enum SeleniumEvent
{blur,change,mousedown,mouseup,click,reset,select,submit,abort,error,load,mouseout,mouseover,unload,keyup,focus}
public void fireEvent(WebElement el, SeleniumEvent event)
{
((JavascriptExecutor) getDriver()).executeScript(""+
"var element = arguments[0];" +
"var eventType = arguments[1];" +
"var myEvent = document.createEvent('UIEvent');\n" +
"myEvent.initEvent(\n" +
" eventType, // event type\n" +
" true, // can bubble?\n" +
" true // cancelable?\n" +
");\n" +
"element.dispatchEvent(myEvent);", el, event.toString());
}
另一个想法。 getAttribute("value")
可能没有达到您的预期。在 JavaScript 中,document.querySelector('#range').getAttribute('value')
总是 returns 硬编码值属性(即默认值或初始值),而不是输入的当前值。
document.querySelector('#range').value
returns 当前值。