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

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

解决方法

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

正如您所提到的,github中记录了selenium的已知问题,这些问题不是问题,而是处理InternetExplorer时的Required Configuration组合.如果不考虑这些设置,InternetExplorer可能不会按预期运行.以下各项对于演示InternetExplorer v11的正确行为至关重要:

>对于IE 10及更高版本,必须禁用增强保护模式.此选项位于“Internet选项”对话框的“高级”选项卡中.
>浏览器缩放级别必须设置为100%,以便可以将本机鼠标事件设置为正确的坐标.
>您必须在显示设置中将文本,应用和其他项目的大小更改为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 Events和browser Focus here的详细讨论.
>现在,您必须通过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);

>根据最佳编程实践Thread.sleep(1000);是一个巨大的否,因为它降低了测试性能
>现在,您知道浏览器客户端滞后于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 sensetional博客于Protected Mode settings and the Capabilities hack发表的文章,其中@JimEvans以清晰明确的术语指出了背景:

When the rewritten IE driver was first introduced,it was decided that it would enforce its required Protected Mode settings,and throw an exception if they were not properly set. Protected Mode settings,like almost all other settings of IE,are stored in the Windows registry,and are checked when the browser is instantiated. However,some misguided IT departments make it impossible for developers and testers to set even the most basic settings on their machines.

The driver needed a workaround for people who Couldn’t set those IE settings because their machine was overly locked down. That’s what the capability setting is intended to be used for. It simply bypasses the registry check. Using the capability doesn’t solve the underlying problem though. If a Protected Mode boundary is crossed,very unexpected behavior including hangs,element location not working,and clicks not being propagated,Could result. To help warn people of this potential problem,the capability was given big scary-sounding names like INTRODUCE_FLAKInesS_BY_IGnorING_Security_DOMAINS in Java and IntroduceInstabilityByIgnoringProtectedModeSettings in .NET. We really thought that telling the user that using this setting would introduce potential badness in their code would discourage its use,but it turned out not to be so.

If you are able to set the Protected Mode settings of IE,and you are still using the capability you are risking the stability of your code. Don’t do it. Set the settings. It’s not that hard.

以下是设置保护模式设置的方法:

>这是Selenium IEServerDriver not finding new windows for IE9的另一个讨论,其中解决方案是打开兼容模式

java – Selenium没有检测到IE中的第二个窗口的更多相关文章

  1. 适用于iOS和Android设备的自动验收测试

    我正在开展一个网络项目,很明显,进行一些Selenium类型的自动验收测试会非常有帮助.但该项目是移动/手持设备的网站,而非Selenium支持的桌面浏览器.谷歌搜索一下,发现iOS为Frank,Android为Robotium.这些是使用的两种工具吗?或者有什么好的或更好的东西可能允许我使用Android和iOS的一个工具?不确定这对于移动设备上的Web测试有何用处.

  2. 如何在android上使用selenium或appium自动化Chrome浏览器?

    我想在Android设备上自动化AndroidChrome浏览器(不只是webview或其他浏览器,而是Chrome浏览器).我认为这可以通过这个链接https://sites.google.com/a/chromium.org/chromedriver/getting-started/getting-started—android,但它自动化我的PC浏览器浏览器.我也试过Appium,但日志后没

  3. 如何在Android和IOS上运行量角器脚本?

    我认为您可以通过在配置的功能部分指定平台来请求iOS和Android设备.如果您不想使用SauceLabs,可以查看使用Selenium的Grid功能.您可以获得适用于iOS和Android的Selenium驱动程序,并将它们连接到运行Protractor方案的集中式Selenium服务器,只需将配置文件中的seleniumAddress更改为指向中央服务器即可.基本上,您必须远程连接到设备,最简单的方法如上所述.

  4. 移除Selenium中window.navigator.webdriver值

    这篇文章主要为大家介绍了如何正确的移除Selenium中window.navigator.webdriver的值方法步骤,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  5. 如何防止IE缓存jsp文件

    1,使用java提供的方法,在jsp或者servlet中都可以2,使用HTML标记,如下面:

  6. Selenium执行JavaScript脚本的方法示例

    这篇文章主要介绍了Selenium执行JavaScript脚本的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  7. 使用Selenium控制当前已经打开的chrome浏览器窗口

    有时通过selenium打开网站时,发现有些网站需要扫码登录,就很头疼,导致爬虫进展不下去,下面这篇文章主要给大家介绍了关于使用Selenium控制当前已经打开的chrome浏览器窗口的相关资料,需要的朋友可以参考下

  8. selenium执行js并绕过webdriver监测常见方法

    这篇文章主要为大家介绍了selenium执行js并绕过webdriver监测常见方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪

  9. selenium 与 chrome 进行qq登录并发邮件操作实例详解

    这篇文章主要介绍了selenium 与 chrome 进行qq登录并发邮件操作实例详解的相关资料,需要的朋友可以参考下

  10. 测试IE浏览器对JavaScript的AngularJS的兼容性

    这篇文章主要介绍了测试IE浏览器对JavaScript的AngularJS的兼容性的方法,尽管随着Windows10的近期上市,IE浏览器即将成为历史...需要的朋友可以参考下

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部