【问题标题】:Actions through WebDriver will not trigger the blur event通过 WebDriver 的操作不会触发 blur 事件
【发布时间】:2013-05-10 18:26:41
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: javascript java webdriver dom-events blur


    【解决方案1】:

    这里有几个想法:

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

    您可以使用 sendKeys 方法来做到这一点:

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

    注入 javascript 来模拟 blur 方法。您已经尝试过它的样子,但您忘记了 executeScript 的一个重要方面——始终是 return 您的代码! p>

    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);
    

    【讨论】:

    • 感谢您的意见。我已经尝试过标签(请参阅我的原始帖子),但我还没有尝试添加退货。会试一试的。谢谢。
    • 在我的 javascript 字符串中添加了“return”。没有变化:没有触发模糊事件。将此添加到 OP
    • 在您的 javascript 中,请确保通过删除 .blur() 将 WebDriver 元素返回给您。您的 js 变量应该包含一个 WebDriver 元素。如果不是,这就是模糊不起作用的原因......它无法正确找到元素!如果是,我们将从那里继续。
    • 我知道该元素已找到,因为我通过从 Firebug 执行 'document.getElementById('newOrder:shipToAddressType').blur()' 对其进行了测试,它工作得很好并触发了模糊事件。
    • 您能否像我问的那样检查您是否在 WebDriver 中正确找到它?
    【解决方案2】:

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

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

    这对我有用。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2016-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-06
          • 1970-01-01
          • 2015-03-16
          • 2012-05-26
          • 1970-01-01
          相关资源
          最近更新 更多