[英]Actions through WebDriver will not trigger the blur event
我有一个带有两个下拉菜单的网页。 在一个下拉列表中选择一个选项将通过模糊事件触发的脚本更新另一个下拉列表中的选项列表。 当焦点移离第一个下拉菜单时会触发模糊事件。 手动导航页面时,这一切正常。
但是,当通过 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()");
有什么建议么? 谢谢你的帮助。
编辑:我尝试在脚本字符串中添加“返回”。 也没有用:
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 页面中,当我们单击任何元素时,我们实际上是通过模糊当前元素来关注该元素。 因此,您可以单击任何其他不会在单击时触发任何内容的元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.