WebDriver操作不会触发失焦事件。

5
我有一个网页,其中有两个下拉列表。通过触发的脚本,选择第一个下拉列表中的选项将更新第二个下拉列表中的选项列表。当焦点从第一个下拉列表移开时,就会触发失焦事件。在手动导航页面时,所有这些都正常工作。
然而,当通过WebDriver执行相同步骤时,失焦事件永远不会被触发,因此下拉列表永远不会被更新,导致我的脚本失败。
以下是我首先选择的下拉列表的HTML代码(拥有onblur脚本附加到它上面):
<select id="newOrder:shipToAddressType" class="fieldRequired"     onblur="PrimeFaces.ab({source:this,event:'blur',process:'newOrder:odShipData',update:'newO>rder:odShipData',partialSubmit:true,oncomplete:function(xhr,status,args)>{focusOnShipToZip();;}}, arguments[1]);" tabindex="47" size="1" name="newOrder:shipToAddressType">
<option selected="selected" value="125">Domestic</option>
<option value="126">International</option>
<option value="127">Military</option>
</select>

这是我迄今为止尝试过的方法:
导航到页面,就像我手动操作一样。我在下拉菜单中进行选择,然后在另一个字段中输入文本以将焦点移开下拉菜单,以触发模糊事件。但这并没有起作用。我还尝试了从下拉菜单中切换出去,也没有成功。
执行JavaScript来触发模糊事件。我知道JavaScript是正确的,因为我可以从firebug成功运行它:它会触发第二个下拉菜单的更新。但是,在WebDriver中似乎没有触发任何事件。
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("document.getElementById('newOrder:shipToAddressType').blur()");

有什么建议吗?感谢您的帮助。

编辑: 我尝试在脚本字符串中添加'return'。也没有起作用:

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("return document.getElementById('newOrder:shipToAddressType').blur()");
4个回答

6

以下是一些想法:

使用TAB键来进入下一个字段。 这将模拟用户按下TAB键进入下一个字段,并应该在理论上模拟浏览器的blur事件。

您可以通过使用sendKeys方法来实现这一点:

WebElement element = driver.findElement(By.id('newOrder:shipToAddressType'));
element.sendKeys("\t");

注入JavaScript模拟模糊效果。你已经尝试过这样做了,但是你忘记了executeScript的一个重要方面——始终return你的代码!

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("return document.getElementById('newOrder:shipToAddressType').blur()");

还有一件事,为了提供信息,包括你使用的浏览器会很有帮助。

更新

尝试使用以下方法将焦点直接放在元素上,然后取消焦点(模糊):

WebElement element = driver.findElement(By.id('newOrder:shipToAddressType'));
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].focus(); arguments[0].blur(); return true", element);

感谢您的输入。我已经尝试过制表符(请参阅我的原始帖子),但我还没有尝试添加回车。我会尝试一下。谢谢。 - user973718
1
在我的 JavaScript 字符串中添加了 'return'。没有变化:没有触发模糊事件。将此添加到 OP 中。 - user973718
请确保在您的JavaScript中,通过删除.blur()来返回WebDriver元素。您的js变量应该持有一个WebDriver元素。如果不是这样,那么就无法正确找到该元素,这就是为什么模糊效果不起作用的原因!如果是这样,我们将从那里继续进行。 - bbbco
我知道该元素已被找到,因为我通过在Firebug中执行“document.getElementById('newOrder:shipToAddressType').blur()”进行了测试,并且它可以正常工作并触发模糊事件。 - user973718
请问您能否检查一下是否按照我要求在WebDriver中正确找到了它? - bbbco
显示剩余3条评论

6
另一种选择是尝试在除输入框之外的其他地方(例如页面主体)触发点击事件。
driver.findElement(By.tagName("body")).click();

这对我很有效。

非常好用,我在 ->sendKeys() 之后使用它来触发发送的值上传。 - Michel Rummens

1
尝试使用Actions类,WebDriver支持使用该类进行鼠标和用户交互。类似于以下内容:
WebElement element = driver.findElement(By.id('newOrder:shipToAddressType'));
(new Actions(driver)).moveToElement(element ,500,500).build().perform();

这将移动您设置的像素并触发模糊事件。

0
通常在HTML页面中,当我们点击任何元素时,实际上是通过模糊当前元素来将焦点集中在该元素上。因此,您可以单击任何其他不会触发任何事件的元素。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接