我们在基础架构中运行,有时会陷入困境。我们看到发生的事情是,当我们进行remotewebdriver调用时,启动了firefox.exe,但由于机器速度很慢而且我们有15秒超时,因此创建webdriver不会成功。所以我们失败了,但现在我们有一个使用内存的胭脂firefox进程 - 在对我们的远程selenium机器开始大量的构建后,我们看到数百个剩余的firefox进程坐在那里。我不能关闭或退出驱动程序 - 我没有驱动程序,因为调用remotewebdriver失败....我怎么知道我们刚刚创建的firefox进程杀了它?这是应该用硒清理的吗?我们正在使用java。
答案 0 :(得分:0)
正如您提到的firefox.exe is started but because the machine is so slow and we have a 15 second timeout, creating the webdriver does not succeed
和see hundreds of leftover firefox processes sitting out there
,我有一个 4 点解决方案,可能适合您。
15 second timeout
只会使我们尝试启动Application live以启动测试过程失败。因此,更好的选择是让WebDriver
实例正常启动应用程序,以便Selenium
从Document.readyState == complete
获得干净的DOM tree
Test Bed
配置了必需的Hardware (CPU, RAM, ROM, Cache) and Software (Selenium, WebDriver, WebBrowser versions) resources
。确保运行Test Machines
和Automation Script
的{{1}}与其他用户互动隔离。Testcases
后立即与WebElements
进行交互,那么您可以考虑调整 pageLoadStrategy
< / strong>即可。 pageLoadStrategy
的默认设置为 normal
,我们可以将其更改为 eager
。将 pageLoadStrategy
设置为 eager
表示只要WebElements
加载HTML DOM
并且 interactive
,您的脚本将继续执行。现在,您可以通过将阻止程序部分代码保留在hundreds of leftover firefox processes sitting out there
块中来处理try
的主要问题。如果try
内的代码块成功,我们的脚本就会继续。如果try
失败,我们将在quit()
块中调用catch()
,以便Firefox浏览器实例和WebDriver
实例正常退出。代码块的蓝色打印如下:
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class Q45703729_firefox_process {
public static void main(String[] args) {
System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
try {
driver.get("https://stackoverflow.com");
System.out.println("Application opened");
} catch (Exception e) {
System.out.println("Unable to open Application. Quiting ...");
driver.quit();
}
System.out.println("Page Title is : "+driver.getTitle());
//Do other tasks
driver.quit();
}
}
答案 1 :(得分:0)
为避免此类问题,您应确保在不再需要浏览器时调用driver.quit()
。
假设Java堆栈,很可能您正在使用TestNG或JUnit框架。资源释放的最佳位置可以是@After...
方法之一(取决于所选的会话管理策略),也可以是特殊的侦听器。例如:
@AfterMethod
public void tearDown() {
if (driver != null)
driver.quit();
}