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

时间:2013-05-10 18:26:41

标签: java javascript javascript-events webdriver blur

我有一个有两个下拉列表的网页。在一个下拉列表中选择一个选项将通过由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>

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

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

执行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 个答案:

答案 0 :(得分:5)

以下是一些想法:

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

您可以使用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);

答案 1 :(得分:2)

另一种选择是尝试触发输入之外的其他内容,例如正文。

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

这对我有用。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

通常在html页面中,当我们单击任何元素时,我们实际上会通过模糊当前元素来专注于该元素。因此,您只需单击任何其他元素,这些元素都不会在单击时触发任何东西。