【问题标题】:Selenium not detecting the second window in IESelenium 没有检测到 IE 中的第二个窗口
【发布时间】:2018-01-09 06:58:00
【问题描述】:

我的应用程序会在单击按钮时打开一个新窗口,我需要在该窗口中执行一些操作。但是 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);

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

"[fcdad457-9090-4dfd-8da1-acb9d6f73f74]" 

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

[90cc6006-0679-450c-a5b3-6602bcb41a16, 7211bbfd-2616-4460-97e7-56c0e632c3bb]

我无法移除睡眠,因为这只是一个示例程序,在实际应用程序中会有一些延迟。请告诉我您的想法。此问题仅适用于 IE11。

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

【问题讨论】:

  • 您能否给出您弹出窗口的完整屏幕截图?我想确定它是一个实际的新浏览器窗口/选项卡或模拟弹出窗口
  • @yong 添加截图
  • 你说的弹窗是哪一个?灰色背景的大窗户?还是最前面的那个小白底?
  • 灰色背景的大窗口。您在其后面看到的(蓝色背景)是父窗口。
  • 试试这篇文章中的解决方案。如果不能解决您的问题,请尝试使用最新的 IEDriver

标签: java selenium selenium-webdriver internet-explorer-11 desiredcapabilities


【解决方案1】:

在处理InternetExplorer 时需要注意以下几点:

正如您在 GitHub 中提到的There is a known issue with selenium,这些不是问题,而是Required Configuration 在处理 时的组合InternetExplorer。如果不注意这些设置 InternetExplorer 可能不会按预期运行。以下项目对于证明 InternetExplorer v11 的正确行为至关重要:

  • 对于 IE 10 及更高版本,Enhanced Protected Mode 必须禁用。此选项位于Internet Options 对话框的Advanced 选项卡中。
  • 浏览器 Zoom Level 必须设置为 100%,以便可以将本机鼠标事件设置为正确的坐标。
  • 您必须在显示设置中将Change the size of text, apps, and other items 设置为100%
  • 对于 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.
    
  • Native Events :使用原生事件的优点是它不依赖于 JavaScript 沙箱,并且可以确保在浏览器中正确传播 JavaScript 事件。但是,当 IE 浏览器窗口没有焦点以及尝试将鼠标悬停在元素上时,当前存在一些鼠标事件问题。

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

  • 您可以在Native EventsBrowser Focushere找到详细讨论。

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

    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);
    
  • 根据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);
    

更新

我可以从你的 cmets 看到:

"Enable Enhanced Protected Mode" is unchecked in IE options. – Renjith Jan 9 at 7:26

这是来自@JimEvans 感性博客Protected Mode settings and the Capabilities hack 的努力,其中@JimEvans 用清晰明确的术语指出了上下文:

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

驱动程序需要一个解决方法来解决那些因为机器被过度锁定而无法设置这些 IE 设置的人。这就是功能设置的用途。它只是绕过注册表检查。但是,使用该功能并不能解决根本问题。如果跨越保护模式边界,可能会导致非常意外的行为,包括挂起元素位置不起作用点击不传播。为了提醒人们注意这个潜在问题,该功能被赋予了听起来很吓人的名字,例如Java 中的INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS.NET 中的IntroduceInstabilityByIgnoringProtectedModeSettings。我们确实认为告诉用户使用此设置会在他们的代码中引入潜在的错误会阻止其使用,但事实并非如此。

如果您能够设置 IE 的保护模式设置,并且您仍在使用该功能,那么您的代码的稳定性就会受到威胁。不要这样做。设置设置。没那么难。

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

【讨论】:

  • 我尝试了所有这些,但效果很好。我同意“Thread.sleep()”不是一个好习惯。我试图使用 sleep() 模拟实际代码中的延迟。 (我在问题中给出的是用于测试的示例代码,而不是生产中的实际代码)。我什至删除了“sleep()”并在两者之间保留了一个扫描仪,因此其余代码仅在接收我的输入时才起作用。当访问第二个窗口有延迟时,看起来 webdriver 正在丢失第二个窗口。
  • “启用增强保护模式”位于高级选项卡中。我和 IT 部门谈过设置“启用保护模式”,但他们说很难。
  • desiredCapabilites 是否保留在打开的新窗口中? 或者需要一些额外的配置。
  • 某些功能略有不正确。使用:cap.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);cap.setCapability("ignoreProtectedModeSettings",true);
【解决方案2】:

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

【讨论】:

  • “启用增强保护模式”在 IE 选项中未选中。
  • 我无法为本地 Intranet 和受信任的站点区域启用它。它是公司提供的笔记本电脑,这些是根据用户组设置的。还有其他解决方案吗?
  • 别无他法。它的一切都必须相同。在您的组织中提出例外并获得批准。这是必需的配置,而不是可用的配置。
  • 将您的测试切换到 Google Chrome。我避免像瘟疫一样使用 IE。
【解决方案3】:

不知道 Set 是什么,但我使用以下代码进行了测试

while (true)
            {
                int qw = ololo.WindowHandles.Count;
                string[] wh = ololo.WindowHandles.ToArray();
                ololo.FindElement(By.LinkText("Помощь")).Click();
                Thread.Sleep(1000);
            }

而且效果很好。

【讨论】:

    【解决方案4】:

    在 IE11 上,浏览器上的“启用保护模式”设置是关键 - 可以是 ON 或 OFF(适用于所有区域)。

    驱动程序功能的其他设置无关紧要(在我的情况下) - 以下工作同样正常:

    		caps.setCapability("ignoreZoomSetting", false);
    		caps.setCapability("nativeEvents", false); 
    		caps.setCapability("ignoreProtectedModeSettings", false);

    【讨论】:

      猜你喜欢
      • 2021-10-04
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多