Selenium InternetExplorerDriver没有聚焦在窗口上

时间:2018-08-07 11:51:18

标签: java selenium selenium-webdriver selenium-iedriver desiredcapabilities

我的项目包括Selenium Webdriver,JAVA,Maven,TestNG,Jenkins,Allure(报告)。我有几套包含100多个测试用例的测试,并通过3种不同的浏览器进行了迭代(测试使用TestNG并行运行)。

除非我实际上正在观察窗口并查看测试运行,否则无法通过一项测试。

我将解释:我要测试什么?我们的JS开发人员创建了一项功能,只有当用户将焦点放在窗口上时,图像幻灯片才会开始移动和更改图像。

在Firefox和Chrome上,它可以顺利通过-我不需要查看测试。焦点可以放在其他选项卡或浏览器上,驱动程序将模拟所有内容。在IEdriver上不是这样!

我试图为驱动程序添加许多功能,但仍然一无所获(其中一些解决了我一些其他问题):

}else if (browser.equalsIgnoreCase("ie")) {

    String exeServiceIEdriver = Consts.ieDriverPath;
    System.setProperty("webdriver.ie.driver", exeServiceIEdriver);
      DesiredCapabilities ieCapabilities = DesiredCapabilities.internetExplorer();
      ieCapabilities.setCapability("nativeEvents", false);
      ieCapabilities.setCapability("unexpectedAlertBehaviour", "accept");
      ieCapabilities.setCapability("ignoreProtectedModeSettings", true);
      ieCapabilities.setCapability("disable-popup-blocking", true);
      ieCapabilities.setCapability("enablePersistentHover", true);
      ieCapabilities.setCapability("ignoreZoomSetting", true);
        //ieCapabilities.setCapability("version", "12"); does it work?? don't think so..
      ieCapabilities.setCapability("requireWindowFocus", true);
        //ieCapabilities.setCapability("browser_version", "9.0");  // Does NOT work. need user agent
      ieCapabilities.setCapability("IE_ENSURE_CLEAN_SESSION", true);  // Does NOT work. need user agent
      ieCapabilities.setCapability("browserAttachTimeout",5000);
      ieCapabilities.setCapability(CapabilityType.ACCEPT_INSECURE_CERTS,true);
      ieCapabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS,true);
      ieCapabilities.setCapability(CapabilityType.SUPPORTS_APPLICATION_CACHE,false);

    driver = new InternetExplorerDriver(ieCapabilities);
    Log.info("\n*** Starting IE Browser ***");

1 个答案:

答案 0 :(得分:1)

似乎您已选择添加所有与 InternetExplorerDriver 相关的功能。

Browser Focus

  

挑战在于,如果窗口没有焦点,则IE本身似乎并不完全尊重我们发送到IE浏览器窗口的Windows消息(WM_MOUSEDOWNWM_MOUSEUP)。具体来说,被单击的元素将在其周围收到一个焦点窗口,但单击不会被该元素处理。可以说,我们根本不应该发送消息。相反,我们应该使用SendInput() API,但是该API明确要求窗口具有焦点。 WebDriver 项目有两个相互矛盾的目标。

     

因此,首先,我们努力尽可能模拟用户。这意味着使用本机事件,而不是使用 JavaScript 模拟事件。

     

第二,我们不希望浏览器窗口自动聚焦。这意味着仅将浏览器窗口强制为前台是次优的。

     

另一个要考虑的问题是,可能有多个IE实例在多个 WebDriver 实例下运行,这意味着任何此类 bring the window to the foreground 解决方案都必须包装在某些解决方案中IE驱动程序的C ++代码中的一种同步构造(可能是mutex)。即使这样,例如,如果用户在将IE置于前台并执行本机事件的驱动程序之间将另一个窗口置于前台,则此代码仍将受竞争条件的约束。

     

有关驱动程序需求以及如何确定这两个相互冲突的目标的优先级的讨论正在进行中。当前流行的观点是优先考虑前者,并证明使用IE驱动程序时您的计算机将无法执行其他任务。但是,该决定还远没有最终确定,实现该决定的代码可能相当复杂。

解决方案

作为临时解决方案,您可以添加以下功能:

ieCapabilities.setCapability("requireWindowFocus", false);