selenium webdriver在sendKeys之前填充后清除字段

Geo*_*old 5 selenium webdriver knockout.js

我正在测试的网页正在使用淘汰赛.在我们网站上目前没有使用淘汰赛的其他网页上我没有遇到同样的问题.我的方案是页面打开的位置,我输入各种必填字段并单击保存按钮.在它输入最后一个文本字段中的值和单击保存按钮之间的某个时刻之前,先前具有值的字段将被清除,因此脚本无法继续.这是我正在运行的代码示例:

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();
Run Code Online (Sandbox Code Playgroud)

就像我说的那样,在它输入最后一个字段中的文本和它点击的时间之间保存之前有文本的字段被清除掉,因此我的测试失败了.问题是它并不总是发生.有时测试运行正常,有时则没有.

我试过把Thread.sleep(x); 到处查看是否暂停某些点可以解决问题.我也尝试使用javascript在后台等待可能正在运行的任何ajax.还有driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS)的隐式等待.它们似乎都没有任何区别.

我正在运行selenium服务器的2.13版本,我的所有测试都在Firefox 8上运行.

任何有关这方面的帮助将不胜感激!

Mar*_*des 5

Firefox有一个错误,可以防止在浏览器窗口失焦时执行某些事件.当您运行自动化测试时,这可能是一个问题 - 即使窗口没有聚焦,也可能会打字.

重点是,change事件触发(默认情况下)淘汰模型更新.如果它没有被执行,它的底层模型将不会是最新的.

为了解决这个问题,我"手动"触发了更改事件,将javascript注入到我的测试中:

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

您可能已经注意到,我正在使用jQuery来触发更改事件.如果你没有在你的应用程序上使用jQuery,你可以在这里查看如何使用vanilla javascript触发它.

希望能帮到别人.


Pau*_*gar 1

我有同样的问题。我还猜测你的代码在 Chrome 中运行良好,但在 Firefox 中运行不佳,并且当你手动执行时它总是可以运行?

不管怎样,问题很可能是 Selenium 的行为方式与真实用户不同,并且不会触发相同的事件。当您“提交”表单时,它有时不会在文本区域上执行“更改”事件,这意味着它不会发生更改。

我在测试 Backbone.modelbinding 时遇到了同样的问题,它使用“change”事件从表单更新模型。Knockout 也使用了“change”事件,但幸运的是它还可以使用“keyup”事件。请参阅文档中的 valueUpdate

<input data-bind="value: someValue, valueUpdate: 'keyup'" />
Run Code Online (Sandbox Code Playgroud)

不管怎样,这为我重复地解决了这个问题,完成后不需要任何睡眠。缺点是为了使测试正常工作,您运行的事件会超出生产中所需的数量。另一个缺点是,如果您想在值更改时运行一些代码,现在每次按键都会收到一个事件,而不是每次字段更改都会收到一个事件,这有时很糟糕。

还有另一种解决方案,就是让 Selenium 自己触发更改事件,例如:Selenium IE Change event not returned。这也不是最理想的,但是你能做什么呢?

您还可以尝试在单击按钮之前将焦点放在按钮上。不知道行不行,我没试过。