Selenium InternetExplorerDriver没有关注窗口

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

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

我会解释一下: 我想测试什么? 我们的JS开发人员创建了一个function,只有当用户关注窗口时,图像幻灯片才会开始移动并更改图像。

在Firefox和Chrome上它传递得很好 – 我不需要看到测试。 重点可以放在其他选项卡或浏览器上,驱动程序将模拟所有内容。 在IEdriver上它不是那样的!!

我试图向驱动程序添加许多function但仍然没有(其中一些解决了我其他一些问题):

}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 ***"); 

似乎您已选择添加所有InternetExplorerDriver相关function。

Browser Focus

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

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

其次,我们希望不要求将浏览器窗口的焦点自动化。 这意味着仅强制浏览器窗口到达前景是次优的。

另外一个考虑因素是在多个WebDriver实例下运行多个IE实例的可能性,这意味着任何此类bring the window to the foreground解决方案都必须包含在IE驱动程序的C ++代码中的某种同步构造(可能是mutex )中。 即便如此,如果用户在将IE带到前台并执行本机事件的驱动程序之间带来另一个窗口,则此代码仍然会受到竞争条件的影响。

围绕驾驶员要求以及如何确定这两个冲突目标的优先顺序的讨论正在进行中。 目前流行的智慧是将前者优先于后者,并记录在使用IE驱动程序时您的机器将无法用于其他任务。 但是,这个决定还远没有最终确定,实现它的代码可能相当复杂。

作为临时解决方案,您可以添加function:

 ieCapabilities.setCapability("requireWindowFocus", false);