Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging 使用带FirefoxDriver的Selenium2关闭Liferay弹出窗口(在新浏览器窗口中)?_Debugging_Firefox_Popup_Selenium Webdriver_Liferay - Fatal编程技术网

Debugging 使用带FirefoxDriver的Selenium2关闭Liferay弹出窗口(在新浏览器窗口中)?

Debugging 使用带FirefoxDriver的Selenium2关闭Liferay弹出窗口(在新浏览器窗口中)?,debugging,firefox,popup,selenium-webdriver,liferay,Debugging,Firefox,Popup,Selenium Webdriver,Liferay,我正在尝试使用Selenium 2在Liferay portal服务器上自动化一些测试用例。许多Liferay操作会打开新的浏览器窗口弹出窗口(如用户模拟)。下面是一个示例链接(请注意target=“\u blank”): 切换到弹出窗口上下文相当直接: String currentWindowHandle=driver.getWindowHandle(); if(log.isDebugEnabled())log.debug(“currentWindowHandle=”“+currentWi

我正在尝试使用Selenium 2在Liferay portal服务器上自动化一些测试用例。许多Liferay操作会打开新的浏览器窗口弹出窗口(如用户模拟)。下面是一个示例链接(请注意
target=“\u blank”
):


切换到弹出窗口上下文相当直接:

String currentWindowHandle=driver.getWindowHandle();
if(log.isDebugEnabled())log.debug(“currentWindowHandle=”“+currentWindowHandle+””);
对于(字符串windowHandle:driver.getWindowHandles()){
如果(!windowHandle.equals(currentWindowHandle)){
布尔模拟成功=false;
if(log.isDebugEnabled())log.debug(“检查“+”windowHandle+“”模拟警报通知”);
driver.switchTo().window(windowHandle);
试一试{
//等待正文以确保页面已加载,然后检查其模拟页面是否已加载。
WebElement body=waitForElement(驱动程序,By.xpath(“//body”);
WebElement noticeMessage=正文.findElement(
通过.xpath(“div[@class='popup-alert-notice'和a='再次做你自己]]/span[@class='notice-message']);
if(noticeMessage.getText().indexOf(“您正在模拟”+user.firstName+“”+user.lastName)>=0){
模拟成功=真;
打破
}
}
捕获(无接触元素例外e){
if(log.isDebugEnabled()){
调试(“未找到模拟窗口“'+windowHandle+””);
}
}
最后{
如果(!impersonationSuccess){
driver.switchTo().window(currentWindowHandle);
}
}
}
}
返回窗口句柄;
但是,当我完成模拟时,我需要关闭弹出窗口。根据WebDriver.close()的api,它将:

关闭当前窗口,退出 浏览器,如果它是最后一个窗口 目前开放

如果我读对了,那么它应该只关闭弹出窗口,而不是Firefox实例(只要我打开了另一个窗口,我就会这样做,因为这只是一个弹出窗口)。但是,当我从弹出窗口的上下文调用close时,它总是失败:

org.openqa.selenium.WebDriverException:  
org.apache.http.conn.HttpHostConnectException: 
Connection to http://localhost:7055 refused
我在FirefoxDriver中发现了一些关于这是一个bug的引用。有人有什么建议或解决办法吗?我想我可以让弹出窗口保持打开状态,直到整个测试用例完成,但是随着在我的测试套件中导致弹出窗口的操作数量的增加,这可能很快变得不可行

-----------编辑-----------------

一个极其简化的测试用例:

@测试
公共void testPopupClose(){
WebDriver=newfirefoxdriver();
驱动程序。获取(“http://lucastheisen.com/test/lucas_test_page.html" );
driver.findElement(By.id(“弹出链接”))。单击();
字符串mainWindowHandle=driver.getWindowHandle();
System.out.println(“currentWindowHandle=”“+mainWindowHandle+””);
布尔值=假;
对于(字符串windowHandle:driver.getWindowHandles()){
如果(!windowHandle.equals(mainWindowHandle)){
System.out.println(“检查“+”窗口句柄“+”表示嘲弄”);
driver.switchTo().window(windowHandle);
试一试{
驾驶人(通过身份证(“嘲弄”);
foundPopup=true;
打破
}
捕获(无接触元素例外e){
System.out.println(“'”+windowHandle+“'不是嘲弄窗口”);
}
最后{
如果(!foundPopup){
driver.switchTo().window(mainWindowHandle);
}
}
}
}
如果(弹出窗口){
System.out.println(“找到我的弹出窗口,现在尝试关闭它…”);
driver.close();
}
System.out.println(“现在尝试在原始窗口中继续工作”);
driver.switchTo().window(mainWindowHandle);
driver.findElement(按.id(“弹出链接”);
driver.close();
资产真实(真实);
}
似乎表明FirefoxDriver并没有真正的问题。这表明,仅仅创建一个弹出窗口,切换到它,然后关闭它,然后在主窗口中继续工作并不会导致firefox崩溃。这意味着原因要复杂得多,我想不出创建简单测试用例的方法。我真正的代码基本上是一个使用Liferay的框架。它旨在成为我所有测试用例的基类,提供诸如impersonateUser(LiferayUser)之类的实用方法。我将在这里发布我的代码,但非常怀疑是否有人愿意投入精力来研究这个问题。现在我有一个解决办法,我可以关闭原来的窗口,然后继续在弹出窗口中工作。如果我拿出一个简化的测试用例来演示这个问题,我将再次编辑这篇文章

------编辑2---------

我现在认为这与调试器有关。我使用的是eclipse,如果我正在调试,并且在close()和switchTo()之间单步执行代码,那么它会一直失败。您应该能够通过在我上面的简化示例测试用例中的这一行插入断点来进行复制:

System.out.println(“现在尝试在原始窗口中继续工作”);
当代码为该断点停止时,您会得到错误。。。不知道该怎么办,因为可能会提交一个bug。有什么建议吗

------编辑3---------

出于跟踪目的,以下是我在这个问题上打开的bug:


Hello Liferay弹出窗口不是一个单独的firefix弹出窗口,您可以关闭它。这是一个div