0

我有一个测试来检查 HTML5 范围输入的值。

return this.remote
  // etc.
  .findById('range') 
  .getAttribute("value")
  .then(function(val){
      expect(parseInt(val)).to.equal(2);  
  });

当我检查它的初始值时该值是正确的,但是如果我更改该值然后检查,它还没有被更新。我发现开发人员工具中的值也没有更新。我尝试使用

  .sleep(3000)

在更改值和调用之间

  .getAttribute('value')

但这似乎不是问题所在。

在此JSfiddle中,使用浏览器的开发人员工具检查 range 元素将显示标题更改,但值不会更改(即使文本框中的值已正确更改)。所以这可能是webdriver的问题,但我想知道是否有人遇到过这个问题。

这与测试未能获得更新值有关吗?我可以使用另一种方法来读取值(属性)吗?

编辑:似乎浏览器的 onchange/oninput 事件没有正确触发(类似的问题:WebDriver: Change event not fire and Why does the jquery change event not trigger when I set the value of a select using val()?),和webdriver 也可能无法做到。我是否必须添加 Jquery 作为我的测试的定义,即使我只需要使用trigger()?还是有其他解决方案?

Edit2:我添加了一个更好的例子来说明我如何在这个新的JSfiddle中使用范围输入。我添加了加号/减号按钮,它们无法触发应该更新范围输入的值属性的更改事件(并且无法将值输入到文本框中)。

4

1 回答 1

0

您可以在测试中手动触发更改事件。我能够在您的 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');

这经常出现,以至于我在我的基础测试类(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')总是返回硬编码的值属性(即默认值或初始值),而不是输入的当前值。 document.querySelector('#range').value返回当前值。

于 2015-07-22T21:37:44.463 回答