如何清除 Intern JS 中的输入字段?

How do I clear input field in Intern JS?

我已经编写了一小段用于内联编辑 table 字段的代码。当用户单击时,该元素将被删除,并在其位置创建一个 input 字段。修改完成后,删除 input 字段并创建具有新值的 span 元素。让我展示一些背景代码。

html 点击前代码:

<div>
 <table id='mytable'>
 <thead>
...
 </thead>
 <tbody id='mybody'>
 ...
 <tr class="tr-edit even" role="row">
  <td>escape substitution</td>
  <td>TEXT</td>
  <td>4</td>
  <td id="268435506">
   <span class="td-span-edit">hola</span>
  </td>
 </tr>
 ...
 </tbody>
 </table>
</div>

html点击后代码:

<div>
 <table id='mytable'>
 <thead>
...
 </thead>
 <tbody id='mybody'>
 ...
 <tr class="tr-edit even" role="row">
  <td>escape substitution</td>
  <td>TEXT</td>
  <td>4</td>
  <td id="268435506">
   <input class="td-input-edit" type="text" value='hola'/>
  </td>
 </tr>
 ...
 </tbody>
 </table>
</div>

当输入失焦,blur,或按下 ENTER_KEY 时,修改后的值被发送到服务器。

另一方面,我在 intern js 中编写了一个功能测试来模拟这种内联编辑。我的功能测试如下所示:

tdd.test('inline editing',function(){
return this.remote
 .findById('268435506')
     .then(function(param){
        return this.parent
            .moveMouseTo(param)
            ;
    })
    .click()
    .clearValue()
    .type('666')
    .executeAsync(function(done){
        promise
            .then(function(){
                done();
            });
    })
    .getVisibleText()
    .then(function(text){
        assert.strictEqual(text,
            '666',
            'typed value should be stored');
    })
 .end()
;
)};

问题是测试失败,在 chrome 和 firefox 上都有异常。

  1. chrome: InvalidElementState: invalid element state: Element must be user-editable in order to clear it
  2. 火狐:UnknownError: Element must be user-editable in order to clear it.

我有 screenshot 当异常发生并且输入字段明确聚焦时。所以你应该能够编辑它。我试图从链中删除 .clearValue() 调用,但随后,正如预期的那样,断言失败了。

问题:如何测试这个内联编辑?

尝试将文本字段属性 "value" 设置为空白而不是使用 clearValue() 然后键入新值

.setAttribute("value", "")

您看到的问题是因为您尝试 clearValue() 错误的元素,例如id 为 268435506td 元素。当用户单击 td 元素时,单击处理程序会删除原始 span 元素并放置一个 input 元素,以便用户可以键入新值。当发生这种情况时,您应该使用 find* 到 'select' 适当的元素并执行相应的操作。让我用你的初始代码来说明这一点:

tdd.test('inline editing',function(){
 return this.remote
 .findById('268435506')
    .then(function(param){
        return this.parent
            .moveMouseTo(param)
            ;
    })
    .click()
    .findByClassName('td-input-edit')
        .clearValue()
        .type('666\uE007')//enter button to end or click outside
        .executeAsync(function(done){
            promise
                .then(function(){
                    done();
                });
        })
    .end()
    .findByClassName('td-span-edit')
        .getVisibleText()
        .then(function(text){
            assert.strictEqual(text,
                '666',
                'typed value should be stored');
        })
    .end()
 .end()
    ;
)};