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

use*_*718 5 javascript java webdriver blur dom-events

我有一个有两个下拉菜单的网页.在一个下拉列表中选择一个选项将通过由blur事件触发的脚本更新另一个下拉列表中的选项列表.当焦点远离第一个下拉列表时,会触发模糊事件.这一切都可以在手动导航页面时正常工作.

但是,当通过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>
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止所尝试的:

像我手动浏览页面一样,我 在下拉列表中进行选择,然后在另一个字段中输入文本以将焦点从下拉列表中移开以触发模糊事件.这没用.我也试过跳出下拉菜单,也没有运气.

执行javascript来触发模糊事件 我知道javascript是正确的,因为我可以从firebug成功运行它:它触发第二个下拉列表的更新.但是,从WebDriver中它似乎没有触发任何东西.

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("document.getElementById('newOrder:shipToAddressType').blur()");
Run Code Online (Sandbox Code Playgroud)

有什么建议?谢谢你的帮助.

编辑:我尝试在脚本字符串中添加"return".也没工作:

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("return document.getElementById('newOrder:shipToAddressType').blur()");
Run Code Online (Sandbox Code Playgroud)

bbb*_*bco 6

以下是一些想法:

使用TAB转到下一个字段.这将模拟用户点击TAB键以继续下一个字段,理论上应该模拟浏览器的模糊事件.

您可以使用sendKeys方法执行此操作:

WebElement element = driver.findElement(By.id('newOrder:shipToAddressType'));
element.sendKeys("\t");
Run Code Online (Sandbox Code Playgroud)

注入javascript以模拟模糊方法.你已经尝试过尝试它看起来像,但你忘记了一个重要的方面executeScript- 总是return你的代码!

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("return document.getElementById('newOrder:shipToAddressType').blur()");
Run Code Online (Sandbox Code Playgroud)

最后一件事,包括您正在使用的浏览器将是有用的信息,仅供参考.

UPDATE

试试这个直接关注元素,然后解散(模糊)它:

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


tkb*_*dge 5

另一种选择是尝试触发对输入以外的其他事物的点击,例如主体。

driver.findElement(By.tagName("body")).click();
Run Code Online (Sandbox Code Playgroud)

这对我有用。