我正在测试的网页正在使用 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上运行。

任何帮助,将不胜感激!

最佳答案

Firefox的bug可以防止在浏览器窗口不清晰时执行某些事件。当您运行自动化测试时,这可能是一个问题-即使窗口没有聚焦,它也可能正在键入。

关键是,通过change事件触发了 knockout 模型更新(默认情况下)。如果未执行,则其基础模型不会是最新的。

为了解决此问题,我“手动”触发了更改事件,将javascript注入(inject)了我的测试中:

//suppose "element" is an input field
element.sendKeys("value");
JavascriptExecutor jsExecutor = (JavascriptExecutor) driver;
jsExecutor.executeScript("$(arguments[0]).change();", element);

您可能已经注意到,我正在使用jQuery触发change事件。如果您未在应用程序上使用jQuery,则可以检查here如何使用原始javascript触发它。

希望能帮助到别人。

10-05 20:43
查看更多