WebDriver:更改事件未触发

loe*_*sak 11 javascript testing webdriver knockout.js

我有一个使用KnockoutJS的应用程序,我正在尝试编写一些测试表单的测试.如果您不了解KnockoutJS,那么它的简短故事就是它提供了从我的视图到我的数据模型的绑定.这意味着当我在输入字段中键入值时,我的基础对象会自动使用该输入字段值进行更新.默认情况下,这是通过更改事件完成的.

我遇到的问题是,当我的WebDriver测试在字段中键入时,更改事件未触发,因此我的基础数据模型没有适当的值.这会导致我的表单验证失败.

我做了我能在互联网上找到的所有工作.我有:

  1. 发送了tab键
  2. 单击远离表单域
  3. 发送JavaScript代码以激活焦点并模糊事件(在模糊时进行验证)
  4. 在键入之前单击表单域
  5. 设置等待只是因为这是一个时间问题
  6. 更改KnockoutJS以更新afterkeydown上的输入字段

这些都不适合我.我需要一些帮助.

此外,我已经验证这不是一个事件冒泡问题,因为我明确删除了所有其他事件,只留下了KnockoutJS更改事件.

对于我正在寻找的解决方案是适用于所有浏览器驱动程序的解决方案(...至少主要是IE,FF,Chrome,Safari)并且不需要使用jQuery.

任何帮助将不胜感激.

这是我用于在字段中键入值的相关代码:

// find element
WebElement input = this.element.findElement(By.className("controls"))
                               .findElement(By.tagName("input"));

// to set focus?
input.click();

// erase any existing value (because clear does not send any events
for (int i = 0; i < input.getAttribute("value").length(); i++) {
    input.sendKeys(Keys.BACK_SPACE);
}

// type in value
input.sendKeys(text);

// to fire change & blur? (doesnt fire change)
//input.sendKeys(Keys.TAB);

// to fire change & blur? (doesnt fire change)
driver.findElement(By.tagName("body")).click();
Run Code Online (Sandbox Code Playgroud)

loe*_*sak 5

因此,我现在已经找到解决此问题的方法,但是到目前为止,我相信这是正确的解决方案。这确实违反了我关于不使用jQuery的规则,但是我觉得这对我来说还可以,因为KnockoutJS需要加载jQuery。可能有一种简单的JavaScript方法可以做到这一点。我已经用FireFox,Safari和PhantomJS测试过。我认为它在Chrome中也能正常工作。我对Internet Explorer没有任何承诺。

不会将此答案标记为正确答案。正确的解决方案应该是通过WebDriver浏览器触发适当的事件。仅当我认为无法通过WebDriver实现时,才将其标记为正确答案。

// find element in question
WebElement input = this.element.findElement(By.className("controls"))
                               .findElement(By.tagName("input"));

// click it to fire focus event
input.click();

// erase any existing value
for (int i = 0; i < input.getAttribute("value").length(); i++) {
    input.sendKeys(Keys.BACK_SPACE);
}

// enter in desired text
input.sendKeys(text);

// fire on change event (WebDriver SHOULD DO THIS)
((JavascriptExecutor) driver).executeScript(
        "$(arguments[0]).change(); return true;"
    , input);

// click away to fire blur event
driver.findElement(By.tagName("body")).click();
Run Code Online (Sandbox Code Playgroud)


loe*_*sak 4

所以我相信我已经找到了我的问题。我完全承认这是 PEBKAC。我忘记了如果浏览器窗口没有在机器上处于活动焦点,WebDriver 就会出现问题(这对我来说仍然很奇怪)。当我调试问题时,我使用编辑器单步执行代码。通过正常运行代码并且不从浏览器中移除焦点,事件可以使用所有三种解决方案(选项卡、点击离开和 JavaScript)按预期触发。

我有一个示例项目显示了所有三种方法,但是我是 git 和 github 的主要菜鸟,并且在交付项目时遇到问题。一旦我弄清楚了,我将与大家分享该项目。

编辑:在 GitHub 上获取示例代码(https://github.com/loesak/knockout.webdriver.change.event.test)。您可以将项目作为服务器中的 Web 应用程序启动并手动运行测试,也可以通过 maven ( mvn clean install) 运行测试。我并没有付出太多的努力来让它稳定地工作,因此假设您安装了 Firefox 并且端口0808 8080 已打开。

编辑:固定指定的端口号