【发布时间】:2011-01-14 10:13:55
【问题描述】:
我正在输入一些值,在更改时进行总计。但不知何故,这个事件并没有被 selenium 类型命令触发。
我也试过 typeKey 和 typeAt ..但没有成功。有什么解决方法吗?
【问题讨论】:
标签: selenium automated-tests selenium-ide
我正在输入一些值,在更改时进行总计。但不知何故,这个事件并没有被 selenium 类型命令触发。
我也试过 typeKey 和 typeAt ..但没有成功。有什么解决方法吗?
【问题讨论】:
标签: selenium automated-tests selenium-ide
要触发 onchange 事件,请尝试在 Selenium IDE 中添加此命令:
fireEvent targetID blur
【讨论】:
sendKeys 一起使用,而不是type。非常感谢@trex。
Firefox 有一个bug,它可以防止在浏览器窗口失焦时执行某些事件。当您运行自动化测试时,这可能是一个问题 - 即使窗口失焦,它也可能正在输入。
为了解决这个问题,我“手动”触发了更改事件,将 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 来触发它。
希望对某人有所帮助。
【讨论】:
如果您使用的是 Selenium 1.x,则可以使用 fireEvent 命令在输入值后手动触发 onChange 事件。也许这会解决你的问题?
【讨论】:
您的解决方案通常可以通过查看 JavaScript 代码找到。
您始终可以选择输入值并从代码中手动触发实际的 OnChange 事件。
关于这个link text有一个未解决的问题 FireFox Windows 未处于活动状态并阻止触发 OnChange 的问题。
在使用 typeKeys 命令之前试试这个:
selenium.selectWindow(null);
【讨论】:
这在 IDE 中对我有用 按顺序执行以下3个命令
Typekeys targetID input
FireEvent targetID focus
Type targetID input
来源看起来像这样(输入是字母r)
<tr>
<td>typeKeys</td>
<td>//form/input</td>
<td>r</td>
</tr>
<tr>
<td>fireEvent</td>
<td>//form/input</td>
<td>focus</td>
<tr>
<td>fireEvent</td>
<td>//form/input</td>
<td>focus</td>
</tr>
<tr>
<td>type</td>
<td>//form/input</td>
<td>r</td>
</tr>
</tr>
<tr>
<td>type</td>
<td>//form/input</td>
<td>r</td>
</tr>
【讨论】:
看起来“sendKeys”命令是为了纠正这个问题:
https://code.google.com/p/selenium/issues/detail?id=5451
这对我有用。
<tr>
<td>sendKeys</td>
<td>id=Quantity</td>
<td>Type stuff here</td>
</tr>
【讨论】:
我遇到了类似的问题,使用 Ajax 制作了一个下拉列表。
当用户在字段中键入时,系统会显示 AJAX divw 并带有多个选项,每个选项都作为与 target='#' 的链接
更糟糕的是,在 onChange() 上调用了一个函数来填充系统标志,并且该标志将用作 form.submit() 的验证 (哦,痛苦)
无论如何,我的解决方案是:
1 - Selenium sendKeys 命令,这样 Ajax div 就会出现
<tr>
<td>sendKeys</td>
<td>id=txtTipoDocumento</td>
<td>ipsum lorem</td>
</tr>
2 - 等待带有预期选项的链接出现
<tr>
<td>waitForElementPresent</td>
<td>link=ipsum lorem</td>
<td></td>
</tr>
3 - selenium clickAt 链接
<tr>
<td>clickAt</td>
<td>link=ipsum lorem</td>
<td>10,20</td>
</tr>
4 - 这是其中的一个问题:手动触发 onChange() 和 blur 事件。另外,请让浏览器将焦点设置在 不同 字段上
<tr>
<td>fireEvent</td>
<td>id=txtTipoDocumento</td>
<td>blur</td>
</tr>
<tr>
<td>fireEvent</td>
<td>id=selSerie</td>
<td>change()</td>
</tr>
<tr>
<td>fireEvent</td>
<td>id=selSerie</td>
<td>blur</td>
</tr>
<tr>
<td>focus</td>
<td>id=imgDataElaboracao</td>
<td></td>
</tr>
5 - 最后,可以肯定的是,我让 Selenium 在表单的提交按钮上执行 ClickAt() 命令,在 mouseDown 和 MouseUp 命令之间
<tr>
<td>mouseDown</td>
<td>id=btnSalvar</td>
<td></td>
</tr>
<tr>
<td>focus</td>
<td>id=btnSalvar</td>
<td></td>
</tr>
<tr>
<td>clickAt</td>
<td>id=btnSalvar</td>
<td>10,20</td>
</tr>
不优雅,但很有效。
【讨论】:
我遇到了同样的问题,但能够解决这个问题。下面的代码用于在输入字段中输入文本并触发 onchange 事件。
WebElement textBox = driver.findElement(By.xpath(xpath));
textBox.sendKeys("Test");
((JavascriptExecutor) driver).executeScript("arguments[0].onchange",
Arrays.asList(textBox));
希望它会起作用!
【讨论】: