通过WebDriver的操作不会触发模糊事件

Actions through WebDriver will not trigger the blur event

本文关键字:模糊 事件 WebDriver 操作 通过      更新时间:2023-09-26

我有一个有两个下拉菜单的网页。在一个下拉菜单中选择一个选项,将通过由blur事件触发的脚本更新另一个下拉菜单中的选项列表。当焦点离开第一个下拉框时触发模糊事件。当手动导航页面时,这一切都很好。

然而,当通过WebDriver执行相同的步骤时,blur事件从未触发,因此下拉菜单从未更新,导致我的脚本失败。

下面是我首先选择的下拉菜单的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触发blur事件
我知道Javascript是正确的,因为我可以成功地从firebug运行它:它触发了第二个下拉列表的更新。然而,从WebDriver中,它似乎没有触发任何东西。

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

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

编辑:我试着在脚本字符串中添加"返回"。也没有工作:

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

这里有几个想法:

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

你可以使用sendKeys方法:

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

注入javascript来模拟blur方法。你已经尝试过这样做了,但你忘记了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);

另一个选择是尝试触发点击输入以外的东西,比如正文。

driver.findElement(By.tagName("body")).click();

尝试使用Actions类,WebDriver支持使用该类进行鼠标和用户交互像这样:

WebElement element = driver.findElement(By.id('newOrder:shipToAddressType'));
(new Actions(driver)).moveToElement(element ,500,500).build().perform();

这会根据你的设置移动多少像素并触发模糊事件

通常在html页面中,当我们点击任何元素时,我们实际上通过模糊当前元素来关注该元素。所以你可以点击任何不触发任何点击的元素