我正在测试的网页正在使用淘汰赛。在我们网站上目前没有使用淘汰赛的其他网页上,我没有遇到同样的问题。我的方案是页面打开的位置,我输入各种必填字段并单击保存按钮。在它输入最后一个文本字段中的值和单击保存按钮之间的某个时刻之前,先前具有值的字段将被清除,因此脚本无法继续。以下是我正在运行的代码示例:
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)的隐式等待。它们似乎都没有任何区别。
我正在运行selenium服务器的2.13版本,我的所有测试都在Firefox 8上运行。
对此的任何帮助将不胜感激!
答案 0 :(得分:5)
Firefox有bug,可防止在浏览器窗口失焦时执行某些事件。当您运行自动化测试时,这可能是一个问题 - 即使窗口没有聚焦,也可能会打字。
关键是使用change
事件触发(默认情况下)淘汰模型更新。如果它没有被执行,它的底层模型将不会是最新的。
要解决此问题,我“手动”触发了更改事件,将javascript注入我的测试中。:
//suppose "element" is an input field
element.sendKeys("value");
JavascriptExecutor jsExecutor = (JavascriptExecutor) driver;
jsExecutor.executeScript("$(arguments[0]).change();", element);
您可能已经注意到,我正在使用jQuery来触发更改事件。如果你没有在你的应用上使用jQuery,你可以检查here如何使用vanilla javascript触发它。
希望能帮助某人。
答案 1 :(得分:1)
我遇到了完全相同的问题。我猜也是你的代码在Chrome中运行良好而不是firefox,并且当你手动执行它时它总是有效吗?
无论如何,问题可能是Selenium的行为与真实用户的行为方式不同,并且不会触发相同的事件。当您“提交”表单时,它有时不会在文本区域执行“更改”事件,这意味着它不会更改。
我在测试Backbone.modelbinding时遇到了同样的问题,它使用“更改”事件从表单更新模型。 Knockout也使用“更改”事件,但幸运的是它也可以使用“keyup”事件。见valueUpdate in the docs:
<input data-bind="value: someValue, valueUpdate: 'keyup'" />
无论如何,这可以为我重复解决它,并且一旦我完成了它就不需要任何睡眠。缺点是你要在生产中运行超过必要的事件,以使测试工作。另一个缺点是,如果你想在值发生变化时运行一些代码,你现在每个按键会得到一个事件,而不是每个字段更改一次,这有时会很糟糕。
还有另一个解决方案,就是让Selenium自己解决更改事件,例如:Selenium IE change event not fired。它也不是最理想的,但你能做什么。
您还可以在单击按钮之前尝试将焦点放在按钮上。不知道这是否有效,我还没试过。
答案 2 :(得分:0)
我在使用 JavaScriptExecutor 将键发送到文本字段时遇到了同样的问题。
在 IE 中使用以下代码(相同的代码适用于 chrome):
(JavascriptExecutor) driver.executeScript("arguments[0].value = '" + value + "';", element);
将代码更新为简单的“sendKeys()”方法后,它解决了我的问题:
element.sendKeys("some text");