knockout.js WebDriver:未激发更改事件

ru9i0ody  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(210)

我有一个使用KnockoutJS的应用程序,我正在尝试写一些测试表单的测试。如果你不知道KnockoutJS,简单来说,它提供了从我的视图到我的数据模型的绑定。这意味着当我在输入字段中键入一个值时,我的底层对象会自动更新为该输入字段的值。默认情况下,这是通过change事件完成的。
我遇到的问题是,当我的WebDriver测试在字段中键入内容时,没有触发change事件,因此我的基础数据模型没有相应的值。这导致我的表单验证在不应该失败的时候失败。
我已经做了一切我能找到在互联网上使这个工作。我已经:
1.已发送Tab键
1.在离开表单域的位置单击
1.发送JavaScript代码以激发focus和blur事件(在blur时进行验证)
1.在键入前单击了表单域
1.设置等待,以防出现计时问题
1.更改了KnockoutJS以在按下按键后更新输入字段
这些都不适合我。
此外,我已经验证了这不是一个事件冒泡问题,因为我显式删除了所有其他事件,只留下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();
e37o9pze

e37o9pze1#

所以现在我找到了一种方法来解决这个问题,但是到目前为止我相信这是正确的解决方案。这确实打破了我关于不使用jQuery的规则,但是我觉得这对我来说是可以的,因为KnockoutJS需要加载jQuery。可能有一种简单的老JavaScript方法来做这件事。我已经用FireFox、Safari还有PhantomJS。我想它在Chrome中也能很好地工作。我对InternetExplorer不给予任何承诺。
打算将此答案标记为正确答案。正确的解决方案应该是通过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();
hec6srdp

hec6srdp2#

所以我相信我已经找到了我的问题。我完全承认这是PEBKAC。我忘记了如果浏览器窗口不是在机器上的活动焦点,WebDriver就会有问题(这对我来说仍然很奇怪)。当我在调试这个问题时,我正在使用我的编辑器来单步调试代码。通过正常运行代码,并且不从浏览器中删除焦点,使用所有三种解决方案(Tab、click-away和JavaScript),事件如预期地激发。
我有一个展示了所有三种方法的示例项目,但是我是一个git和github的新手,在交付项目时遇到了问题。一旦我弄清楚了,我会和大家分享这个项目。

EDIT:在GitHub(https://github.com/loesak/knockout.webdriver.change.event.test)上获得了示例代码。您可以在服务器上以Web应用程序的形式启动项目,然后手动运行测试,也可以通过maven(mvn clean install)运行测试。我没有花太多精力让它运行得很好,所以假设您安装了Firefox,并且打开了0808 8080端口。
EDIT:固定的指定端口号

相关问题