我一直使用硒rc运行我的硒测试约6个月,并且当测试结束时,firefox windows selenium突然打开时不会关闭。
我正在使用特定的firefox配置文件,并且没有更新我的selenium rc jar。我认为也许最新版本的firefox可能是问题但是我又回到了firefox 2并且windows仍然保持打开状态。
我正在 Windows 框中运行测试。
我注意到其他人似乎遇到了这个问题 - 只是想知道是否有人有解决方案?
谢谢, Gearoid。
答案 0 :(得分:9)
我的解决方案是使用driver.quit()
(这将自动关闭Firefox浏览器)而不是driver.close()
- 即使只有一个Firefox窗口打开,AFAIK。
答案 1 :(得分:6)
最后非常简单的解决方案 - 刚刚调用SeleniumTestCase的tearDown()方法(即我们从我们的基础测试类调用super.tearDown();)
成功关闭所有浏览器窗口。
答案 2 :(得分:3)
我们遇到了这个问题,经过一些调查我们修好了。
在Selenium RC中,您有文件“grid_configuration.yml”,其中包含浏览器列表及其各自的标识符,例如“* firefox”。 执行“firefox”时,根据您的环境,您可能会调用firefox可执行文件的包装器,别名或符号链接。 当Selenium启动时,它会为浏览器创建一些fork进程,并且根据你是直接调用firefox可执行文件还是包装器,这些进程的创建是不同的,当它试图在tearDown()中杀死进程时它实际上杀死子进程并保持父亲活着,所以tearDown()不会关闭浏览器。
解决方案是编辑“grid_configuration.yml”文件,将“* firefox”更改为浏览器可执行文件的绝对路径(始终以*开头)
答案 3 :(得分:0)
我们使用微软免费提供的sysinternals pskill工具来杀死浏览器(包括firefox)。
执行会杀死FireFox窗口的pskill "firefox.exe"
。
如果需要在远程计算机上执行该操作,可以使用[psexec][3]
。同时对于两者都有命令开关自动接受EULA(-accepteula),所以你不必。
答案 4 :(得分:0)
Gearóid:我看不出这会如何解决这个问题。 super.tearDown()在每个测试用例之后以任何方式自动调用,因此进行额外的调用只会使它运行两次。
我注意到在Selenium服务器停止之前浏览器窗口不会关闭。因此,在我的情况下,如果有100次硒测试,我会打开200个Firefox窗口,然后在Selenium服务器退出时最终关闭。
(我正在运行Fedora 13和Firefox 3.6.7)
答案 5 :(得分:0)
使用TestNG,您可以在teardown()
功能之前添加@AfterMethod
或@AfterTest
注释,而不是@AfterClass
。
答案 6 :(得分:0)
如果你在tearDown结束时使用python,请使用super(unittest2.TestCase,self).tearDown()
答案 7 :(得分:0)
使用MSTest,我在TestCleanup中调用了driver.Quit(),但我最终在测试结束时打开了一堆Firefox窗口。
我发现NoSuchElementException似乎阻止了驱动程序成功调用quit,因此用try / finally包装了TestCleanup:
[TestCleanup]
public void TestCleanUp()
{
try
{
driver.FindElement(By.Id("ctl00_btnClearSession")).Click();
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until((d) => { return d.FindElement(By.Id("ctl00_btnClearSession")).Displayed; });
}
finally {
driver.Quit();
}
}
这与我一直存在的问题有关,但可能就是我必须用try / finally's包装所有的TestMethods。这远非理想,但是当我这样做时,我似乎不再打开窗户了。
答案 8 :(得分:0)
我有同样的问题。我正在运行Selenium作为我的Visual Studio单元测试的一部分,并且在测试结束时没有关闭的Firefox浏览器遇到了同样的问题。
为我解决了两件事:
1)我使用最新版本更新了网站下的/ core文件夹。
2)我发现selenium在基类中调用了我的Set Up方法两次。反直觉(至少对我而言)似乎selenium会自动调用父类中的set up方法。如果你尝试在子类的设置中调用它(例如使用类似base.setup()),它将运行两次,并打开它无法关闭的Firefox窗口。我删除了对base.setup()的调用,并解决了所有额外的窗口问题。
答案 9 :(得分:0)
从问题的第3个生日开始,我提交了另一个不起眼的解决方案:
我的Firefox位于自定义位置。因为每次我在本地运行Selenium测试时我都不想保持自定义JVM参数,所以我在/usr/local/bin
中添加了一个直通脚本。据推测,Selenium正在杀死它开始的进程(我的脚本),而不是浏览器。
所以我又回到了将JVM参数用于自定义浏览器位置:
-Dwebdriver.firefox.bin="/path/to/firefox"
答案 10 :(得分:0)
在测试运行后Firefox浏览器无法完全关闭时,我遇到了类似的问题。
最终,我发现它是由其中一个测试模块中过多的driver = webdriver.Firefox()
行引起的。
我的环境在Mac OS上使用Python和Firefox的Selenium。