javascript - WebDriver:更改事件未触发

标签 javascript testing knockout.js webdriver

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

我遇到的问题是,当我的 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();

最佳答案

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

不会将此答案标记为正确答案。正确的解决方案应该是通过 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();

关于javascript - WebDriver:更改事件未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16845311/

相关文章:

ruby-on-rails - 如何使用 MongoDB 和 Mongoid 在 Rails 3 上进行适当的数据库测试 (TDD)

linux - 手动卡住 X 服务器

javascript - 如何更新 knockoutjs 可观察数组项

javascript - Gsheet 由于脚本而超时

javascript - 纯 WebGL 虚线

javascript - 尝试打开新的浏览器窗口时如何避免 Javascript 超时异常?

data-binding - Knockout.js - 单击绑定(bind)参数获取事件发送者的文本

javascript - knockout 加载和保存 View 模型

javascript - 获取类中的所有静态 getter

javascript - 我可以让这个函数定义更短吗?