8

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

蓝屏 - 主页;灰屏 - 弹出

在此处输入图像描述

4

4 回答 4

7

处理时需要注意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.
    
  • 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);
    
  • 根据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);
    

更新

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

"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 设置的人。这就是功能设置的用途。它只是绕过注册表检查。但是,使用该功能并不能解决根本问题。如果跨越保护模式边界,可能会导致非常意外的行为,包括挂起元素位置不工作点击不传播。为了帮助警告人们这个潜在的问题,该功能被赋予了听起来很吓人的名字,比如INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINSinJavaIntroduceInstabilityByIgnoringProtectedModeSettingsin.NET. 我们真的认为告诉用户使用此设置会在他们的代码中引入潜在的错误会阻止其使用,但事实并非如此。

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

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

保护模式 IE

于 2018-01-12T05:21:18.467 回答
4

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

于 2018-01-09T07:07:19.437 回答
2

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

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

它工作得很好。

于 2018-01-17T11:20:01.013 回答
0

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

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

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

于 2020-01-16T23:59:37.387 回答