我设置了一个java HttpServlet代码来运行Selenium chromedriver(Ubuntu 16.4),如果同时调用超过30次,我发现一些chromedriver进程不退出,并且异常显示“没有这样的会话”,我希望有一种方法可以退出所有的chromedriver进程并提高并发性。谢谢
WebDriver driver = null;
try {
DesiredCapabilities caps = DesiredCapabilities.chrome();
ChromeOptions options = new ChromeOptions();
options.addArguments("ignore-certificate-errors");
options.addArguments("disable-gpu");
options.addArguments("no-sandbox");
options.addArguments("--disable-impl-side-painting");//Paint content on the main thread instead of the compositor thread.
options.addArguments("--test-type", "--start-maximized", "no-default-browser-check");
caps.setCapability("chrome.switches", Arrays.asList("--start-maximized"));
caps.setCapability(ChromeOptions.CAPABILITY, options);
driver = new ChromeDriver(caps);
driver.get(url);
webDriverWait = (WebDriverWait) new WebDriverWait(driver, timeOutInSeconds, interval);
} catch (Exception e) { //can not catch
PageSource = e.getMessage();
System.err.println(PageSource);
} finally {
if(null != driver){
driver.close();
driver.quit();
driver = null;
}
}
答案 0 :(得分:0)
使用进程杀手从OS进程调度程序中清除孤立的chromedriver.exe。前 -
pkill chrome
将其保存在ubuntu计算机上的shell文件中。调用driver.quit();
后远程调用它答案 1 :(得分:0)
您需要注意以下几项事项:
您的脚本中有一些永远不会使用的冗余代码,您可以考虑删除它们:
.env
您的计划永远不会在webDriverWait = (WebDriverWait) new WebDriverWait(driver, timeOutInSeconds, interval);
内移动,因为不会有任何例外。因此, PageSource 永远不会在控制台中打印出来。
catch{}
和driver.close();
听起来相似,但它们之间存在显着差异,您需要根据用例 / 要求使用它们 。您会找到详细的讨论here。如果您的程序成功跨越了新的 ChromeDriver 进程和 ChromeBrowser 实例,则在driver.quit()
块中,您只需要调用{{1}如下:
finally{}
如果您仍然发现悬空 ChromeDriver 进程,则可能需要采取额外步骤来清理它们。您将找到详细的讨论here。
答案 2 :(得分:0)
使用Chrome 66和chromedriver 2.38,我们在Windows机器上遇到了类似的问题。在测试套件之后,chromedriver将正常关闭(driver.quit),但仍有许多Chrome.exe进程正在运行。
在我们的示例中,修复方法是删除 no-sandbox 选项。不建议使用此选项,我们不应该首先使用它。这是一个来自网络示例的愚蠢的复制/粘贴。删除选项后,所有进程都将关闭。
我建议您尝试删除选项列表中的 no-sandbox 参数。