我正在测试的网页使用了knockout。在我们网站上目前没有使用knockout的其他网页上,我没有遇到同样的问题。我遇到的情况是,在打开网页时,我输入各种必填字段,然后单击保存按钮。在最后一个文本字段输入值和单击保存按钮之间的某个时间点上,以前有值的字段会被清除。因此脚本无法继续运行。下面是我正在运行的代码的一个示例:
driver.findElement(By.id("sku")).clear();
driver.findElement(By.id("sku")).sendKeys(itemNo);
driver.findElement(By.id("desktopThankYouPage")).clear();
driver.findElement(By.id("desktopThankYouPage")).sendKeys(downloadUrl);
driver.findElement(By.id("mobileThankYouPage")).clear();
driver.findElement(By.id("mobileThankYouPage")).sendKeys(mobileDownloadUrl);
driver.findElement(By.id("initialPrice")).clear();
driver.findElement(By.id("initialPrice")).sendKeys(initialPrice);
driver.findElement(By.id("submitSiteChanges")).click();
就像我说的,在最后一个字段中输入文本和点击保存之前有文本的字段都被清除了,因此我的测试失败了。问题是这种情况并不总是发生。有时测试运行良好,有时则不然。
我试过把Thread.sleep(x);我也尝试过使用javascript在后台等待任何可能正在运行的 AJAX 。还有driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS)的隐式等待。看起来没有任何区别。
我运行的是2.13版的Selenium服务器,我的所有测试都在Firefox 8上运行。
任何关于这方面的帮助都将不胜感激!
3条答案
按热度按时间rekjcdws1#
Firefox有一个bug,当浏览器窗口没有焦点时,它会阻止一些事件的执行。当你运行自动化测试时,这可能是一个问题--即使窗口没有焦点,也可能是在输入。
关键是淘汰模型的更新是由
change
事件触发的(默认情况下),如果它没有被执行,它的底层模型就不会是最新的。为了解决这个问题,我“手动”触发了change事件,将javascript注入到我的测试中:
你可能已经注意到了,我使用jQuery来触发change事件,如果你的应用没有使用jQuery,你可以查看here如何使用vanilla javascript来触发它。
希望这对大家有帮助。
bpzcxfmw2#
我也遇到了同样的问题。我也猜你的代码在Chrome中工作正常,但在Firefox中不是,而且当你手动操作时,它总是工作的?
无论如何,问题很可能是Selenium的行为方式与真实用户不同,并且不会触发相同的事件。当您“提交”表单时,它有时不会在文本区域执行“change”事件,这意味着它不会发生更改。
我在测试Backbone.modelbinding时也遇到了同样的问题,它使用“change”事件从表单更新模型。Knockout也使用“change”事件,但幸运的是它也可以使用“keyup”事件。请参见valueUpdate in the docs:
无论如何,这对我来说是可重复的解决了这个问题,而且一旦我完成了,就不需要任何睡眠了。缺点是,为了使测试工作,你会运行比生产中所需的更多的事件。另一个缺点是,如果你想在值改变时运行一些代码,你现在会在每次按键时得到一个事件,而不是每次字段改变时得到一个事件,这有时很糟糕。
还有另一个解决方案,那就是让Selenium自己触发change事件,例如:Selenium IE change event not fired。它也不是最佳的,但是您能做什么呢?
你也可以在点击按钮之前把焦点放在按钮上。我不知道这是否有效,我还没有试过。
dw1jzc5e3#
我在使用JavaScriptExecutor向文本字段发送键时也遇到了同样的问题。
在IE中使用以下代码(相同代码可用于chrome):
在将代码更新为简单的“sendKeys()”方法后,它解决了我的问题: