Selenium没有在IE中检测到第二个窗口

Ren*_*ith 7 java selenium selenium-webdriver internet-explorer-11 desiredcapabilities

我的应用程序打开一个单击按钮的新窗口,我需要在该窗口中执行一些操作.但是selenium webdriver的响应getWindowHandles()方法只有一个窗口id.如果在打开新窗口后调用getWindowHandles()有延迟,则会发生这种情况.硒存在已知问题. https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver#required-configuration

但即使是解决方案也不适用于我.

代码如下

DesiredCapabilities capabilities = DesiredCapabilities.internetExplorer();
RemoteWebDriver driver = new
        RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capabilities);

driver.get("https://<url>");

WebElement userName = driver.findElement(By.name("usr_name"));
userName.sendKeys("ABCD");

WebElement password = driver.findElement(By.name("usr_password"));
password.sendKeys("password");

WebElement login = driver.findElement(By.name("OK"));
login.click();  


WebElement popup= driver.findElement(By.name("popup"));
popup.click();      

Thread.sleep(1000);

Set<String> windowHandles = driver.getWindowHandles();      
System.out.println(windowHandles);
Run Code Online (Sandbox Code Playgroud)

Set" windowHandles "将只返回一个窗口:

"[fcdad457-9090-4dfd-8da1-acb9d6f73f74]" 
Run Code Online (Sandbox Code Playgroud)

但如果我取消睡眠.它将返回两个窗口ID:

[90cc6006-0679-450c-a5b3-6602bcb41a16, 7211bbfd-2616-4460-97e7-56c0e632c3bb]
Run Code Online (Sandbox Code Playgroud)

我无法移除睡眠,因为这只是一个示例程序,在实际应用程序中,它们之间会有一些延迟.请让我知道你的想法.此问题仅适用于IE11.

蓝屏 - 主页; 灰色屏幕 - 弹出窗口

在此输入图像描述

Deb*_*anB 6

在处理时,您必须注意InternetExplorer以下几项事项:

正如您在上面提到的There is a known issue with selenium那样GitHub,这些不是问题,而是Required Configuration处理时的组合InternetExplorer.如果不照顾这些设置,InternetExplorer可能无法按照预期进行操作.以下项目对于证明以下方面的正确行为至关重要InternetExplorer v11:

  • Enhanced Protected ModeIE 10及更高版本必须禁用.此选项位于对话框的Advanced选项卡中Internet Options.
  • 浏览器Zoom Level必须设置为100%,以便可以将本机鼠标事件设置为正确的坐标.
  • 您必须在显示设置中设置Change the size of text, apps, and other items100%.
  • 对于IE 11,您需要在目标计算机上设置一个注册表项,以便驱动程序可以维护与其创建的Internet Explorer实例的连接.

    For 32-bit Windows installations, the key you have to look in the registry is : 
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BFCACHE
    
    For 64-bit Windows installations, the key is :
    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BFCACHE
    
    The FEATURE_BFCACHE subkey may or may not be present, and should be created if it is not present.
    
    Run Code Online (Sandbox Code Playgroud)
  • Native Events:使用本机事件的优点是它不依赖于JavaScript沙箱,并确保在浏览器中正确传播JavaScript事件.但是,当IE浏览器窗口没有焦点,以及尝试将鼠标悬停在元素上时,鼠标事件目前存在一些问题.

  • Browser Focus :如果窗口没有焦点,IE本身似乎不完全尊重我们发送IE浏览器窗口(WM_MOUSEDOWN和WM_MOUSEUP)的Windows消息.

  • 你可以找到关于Native Events和的详细讨论.Browser Focus here

  • 现在,您必须通过DesiredCapabilitiesClass 配置所有这些参数,如下所示:

    DesiredCapabilities cap = DesiredCapabilities.internetExplorer();
    cap.setCapability("ignoreProtectedModeSettings",1);
    cap.setCapability("IntroduceInstabilityByIgnoringProtectedModeSettings",true);
    cap.setCapability("nativeEvents",true);
    cap.setCapability("browserFocus",true);
    cap.setCapability("ignoreZoomSetting", true);
    cap.setCapability("requireWindowFocus","true");
    cap.setCapability("INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS", true);
    
    Run Code Online (Sandbox Code Playgroud)
  • 按照Best Programming惯例Thread.sleep(1000);是一个巨大的不,因为它降低了Test Performance

  • 现在,正如您所知,实例Browser Clients滞后WebDriver所以我们必须经常同步它们.因此,在收集windowHandles之前,您必须WebDriverWait按如下方式进行诱导,您可以找到detailed discussion here:

    WebElement popup= driver.findElement(By.name("popup"));
    popup.click();
    new WebDriverWait(driver,5).until(ExpectedConditions.numberOfWindowsToBe(2));
    Set<String> windowHandles = driver.getWindowHandles();      
    System.out.println(windowHandles);
    
    Run Code Online (Sandbox Code Playgroud)

更新

我可以从你的评论中看到:

"Enable Enhanced Protected Mode" is unchecked in IE options. – Renjith Jan 9 at 7:26
Run Code Online (Sandbox Code Playgroud)

以下是来自@JimEvans sensetional博客的文章,Protected Mode settings and the Capabilities hack其中@JimEvans用清晰明确的术语来指导上下文:

当首次引入重写的IE驱动程序时,决定它将强制执行其所需的保护模式设置,并在未正确设置时抛出异常.保护模式设置与IE的几乎所有其他设置一样,都存储在Windows注册表中,并在实例化浏览器时进行检查.但是,一些误入歧途的IT部门使开发人员和测试人员无法在他们的计算机上设置最基本的设置.

对于那些无法设置IE设置的人来说,驱动程序需要一种解决方法,因为他们的机器被过度锁定了.这就是功能设置的用途.它只是绕过了注册表检查.但是,使用该功能并不能解决潜在的问题.如果跨越保护模式边界,则可能导致非常意外的行为,包括挂起,元素位置不起作用以及未传播的点击.为了帮助警告人们这个潜在的问题,这个能力被赋予了很多可怕的名字,如INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINSin JavaIntroduceInstabilityByIgnoringProtectedModeSettingsin .NET.我们真的认为告诉用户使用此设置会在代码中引入潜在的不良后果会阻碍其使用,但事实证明并非如此.

如果您能够设置IE的保护模式设置,并且您仍在使用该功能,那么您将面临代码稳定性的风险.不要这样做.设置设置.这并不难.

以下是您需要设置的方法Protected Mode settings:

保护模式IE


Aru*_*ash 4

窗口处理问题,主要是因为保护模式设置。为所有区域启用保护模式或为所有区域禁用保护模式并尝试。