【问题标题】:Selenium InternetExplorerDriver doesn't get focus on the windowSelenium InternetExplorerDriver 没有在窗口上获得焦点
【发布时间】:2019-01-14 12:07:05
【问题描述】:

我的项目包括 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 ***");

【问题讨论】:

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


    【解决方案1】:

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

    Browser Focus

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

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

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

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

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

    解决方案

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

    ieCapabilities.setCapability("requireWindowFocus", false);
    

    【讨论】:

    • 如果您要引用某些内容,请确保使用正确的 Markdown 符号 > 来表示您正在引用。
    • 感谢@DebanjanB,它有效!我已经具备了这种能力,但它被设置为“true”(不知道为什么)。我希望它不会干扰我的其他测试(点击等)。
    猜你喜欢
    • 2011-03-10
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    相关资源
    最近更新 更多