我的应用程序在单击按钮时打开一个新窗口,我需要在该窗口中执行一些操作。但是SeleniumWebDriver的响应getWindowHandles()方法中只有一个窗口id。如果在打开新窗口后调用getWindowHandles()时出现延迟,则会发生这种情况。硒有一个已知的问题。https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver#required-配置
但即使是解决这个问题的办法也不适合我。
代码如下
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);
设置“windowHandles”将只返回一个窗口:
"[fcdad457-9090-4dfd-8da1-acb9d6f73f74]"
但是如果我不睡觉。它将返回两个窗口ID:
[90cc6006-0679-450c-a5b3-6602bcb41a16, 7211bbfd-2616-4460-97e7-56c0e632c3bb]
我无法删除睡眠,因为这只是一个示例程序,在实际应用程序中,这两者之间会有一些延迟。请让我知道你的想法。此问题仅适用于IE11。
蓝屏-主页;灰色屏幕-弹出窗口
不知道设置了什么,但我使用以下代码进行了测试
while (true)
{
int qw = ololo.WindowHandles.Count;
string[] wh = ololo.WindowHandles.ToArray();
ololo.FindElement(By.LinkText("Помощь")).Click();
Thread.Sleep(1000);
}
它完美地工作了。
窗口处理问题,主要是由于保护模式设置。为所有区域启用保护模式,或为所有区域禁用保护模式,然后重试。
在处理InternetExplorer
时,您必须注意以下几点:
正如您所提到的,在GitHub中记录的selenium存在一个已知的问题,这些问题本身并不是问题,而是处理InternetExplorer时所需配置的组合集。如果不注意这些设置InternetExplorer
可能无法按照预期进行操作。以下项目对于演示InternetExplorer v11的正确行为至关重要:
>
Internet选项
对话框的高级
选项卡中
文本、应用程序和其他项目的大小设置为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
:使用Native Events的优点是它不依赖于JavaScript沙盒,并且可以确保在浏览器中正确传播JavaScript事件。但是,当IE浏览器窗口没有焦点时,以及当尝试将鼠标悬停在元素上时,当前存在一些鼠标事件问题。
浏览器焦点
:如果IE浏览器窗口没有焦点,IE本身似乎不完全尊重我们发送给IE浏览器窗口的消息(WM_MOUSEDOWN和WM_MOUSEUP)。
您可以在这里找到关于
Native Events
和Browser Focus
的详细讨论。
现在,您必须通过以下方式配置所有这些参数:
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);
按照
最佳编程
实践线程。睡眠(1000)
是一个巨大的“否”,因为它会降低测试性能
现在,正如您所知,
浏览器客户端
滞后于WebDriver
实例,因此我们必须经常同步它们。因此,在收集WindowHandle之前,您必须归纳如下WebDriverWait
,您可以在此处找到详细讨论
:
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博客关于
保护模式设置和hack
功能的文章,其中@JimEvans用一个清晰明确的术语明确了上下文:
当重写的IE驱动程序首次引入时,它决定强制执行其所需的保护模式设置,并在设置不正确时引发异常。受保护模式设置,像IE的几乎所有其他设置一样,存储在Windows注册表中,并在浏览器实例化时进行检查。然而,一些被误导的信息技术部门使得开发人员和测试人员不可能在他们的机器上设置甚至最基本的设置。
司机需要为那些因为机器过度锁定而无法设置IE设置的人提供解决方案。这就是功能设置的目的。它只是绕过注册表检查。不过,使用该功能并不能解决根本问题。如果跨越受保护模式边界,可能会导致非常意外的行为,包括挂起、元素位置不工作以及未传播的单击。为了帮助提醒人们注意这个潜在的问题,该功能被冠以听起来很吓人的名字,比如
在
Java
中忽略安全域,在
中忽略受保护的代码设置
来引入片状。NET
。我们真的认为,告诉用户使用此设置会在他们的代码中引入潜在的不好因素会阻止其使用,但事实并非如此。
如果您能够设置IE的受保护模式设置,并且仍在使用该功能,则会危及代码的稳定性。不要这样做。设置设置。没那么难。
下面是您需要如何设置
保护模式设置
:
这里是另一个关于seleniumieserverdriver没有为IE9找到新窗口的讨论,解决方案是打开兼容模式
我正在尝试打开两个或更多单独的窗口。 我跑着打开了第一扇窗户 现在,我试图通过简单地重复最后一行(来打开第二个窗口,但它返回了 所以我尝试了 这次它又回来了 我该怎么解决这个问题?
这真的很烦人,还有人面对过这个问题吗?有解决办法吗?
所以我一直在为openGL课程玩土壤,我的项目遇到了一个奇怪的问题。我将显示两个窗口,每个窗口包含三个视口,在其中绘制一个带纹理的立方体或椭圆体,以展示我对深度和面剔除的理解。现在,所有形状都正确绘制,并且当单独测试时,它看起来完全符合预期,但是一旦我同时启用两个窗口,纹理就会在第一个窗口中禁用。我之前已经发布了类似的问题,所以只是为了澄清,如果我禁用窗口二,或者如果我在窗口二中使用窗口一绘制功能
问题内容: 我正在有限的时间里进行学校项目,导致代码混乱和混乱。我正在尝试打开两个jFrame,一个显示聊天界面,另一个显示图像。从第一个窗口调用时,我想调用一个方法,该方法多次更改第二个窗口上的图像,并且之间有一些延迟。但是,图像不会改变。 我认为我的问题是由于在文本窗口中使用了一些示例代码,并试图合并我自己的修改而没有完全理解前者。在尝试查找此问题时,我仅发现人们根据计时器和in来更新其jFr
这是我的Java代码: 当我运行它时,会出现以下错误: 我正在使用IntelliJ,安装了chrome驱动程序,但没有解决它,所以任何人都知道这个问题的解决方案??
问题内容: 我尝试结合检查两种情况: 如果启动检查失败,我们将提供一个重试按钮: 否则,startupcheck成功后,我们将在自定义对象中收到一个pin输入请求: 如何将其合并为一项检查而不必同时检查两项:我尝试了以下方法: 但是仅检查第一条语句。 问题答案: 您可以通过lambda表达式合并对using子句的两个元素的组合检查,如下所示: 替代解决方案是: 作为替代方案,您可以使用等效的css