5

我有一个带有两个下拉菜单的网页。在一个下拉列表中选择一个选项将通过由 blur 事件触发的脚本更新另一个下拉列表中的选项列表。当焦点离开第一个下拉菜单时,会触发 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()");
4

4 回答 4

6

这里有几个想法:

使用 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);
于 2013-05-11T04:02:38.220 回答
5

另一种选择是尝试触发对输入之外的其他内容的点击,例如身体。

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

这对我有用。

于 2017-05-26T16:23:04.560 回答
1

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

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

这将移动您设置的尽可能多的像素并触发模糊事件

于 2015-01-13T13:12:40.407 回答
0

通常在 html 页面中,当我们单击任何元素时,我们实际上通过模糊当前元素来关注该元素。因此,您可以简单地点击任何其他不会触发任何点击的元素。

于 2020-10-06T12:58:07.553 回答