我目前正在通过Jenkins运行多个Java程序,使用"定期构建"选项并使用H 06 * * 1-5(从星期一到星期五每天早上6点到7点之间运行)。
在某些程序中我点击链接会打开一个新窗口。因此,我使用以下代码
driver.findElement(By.xpath(".//*[@id='terms']/li[1]/a")).click();
System.out.println("Home Page is loaded Successfully and Terms of Use Link is clicked");
ArrayList<String> window1 = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(window1.get(1));
Thread.sleep(3000);
driver.close();
Thread.sleep(3000);
driver.switchTo().window(window1.get(0));
现在程序运行后,我的其他程序因为已经运行的ChromeDriver.exe进程而失败。
我尝试在上面的代码中使用driver.quit()
而不是driver.close()
,但它会关闭我的整个浏览器。
注意:我在程序结束时使用了driver.quit()
,这并没有帮助我摆脱在切换窗口时打开的正在运行的Chromedriver.exe实例。
请建议我处理这个问题的好方法。我一直在JAVA寻找这个解决方案。但主要是我看到了C#的答案。
谢谢
答案 0 :(得分:1)
由于您点击了一个打开新窗口的链接,因此我们最初必须存储父窗口的WindowHandle
,稍后我们将使用该窗口遍历回父窗口。在新窗口打开后单击链接Terms of Use
,我们将Selenium
的焦点转移到新窗口,在那里执行我们的任务,最后关闭它。然后我们必须通过父窗口句柄将Selenium
的焦点移回父窗口,如下所示:
driver.navigate().to("someurl.com");
String parent = driver.getWindowHandle();
System.out.println("Parent Window ID is : "+parent);
driver.findElement(By.xpath("Link_of_Terms_of_Use_opens_New_Window")).click();
System.out.println("Home Page is loaded Successfully and Terms of Use Link is clicked");
Set<String> allWindows = driver.getWindowHandles();
int count = allWindows.size();
System.out.println("Total Windows : "+count);
for(String child:allWindows)
{
if(!parent.equalsIgnoreCase(child))
{
driver.switchTo().window(child);
System.out.println("Child Window Title is: "+driver.getTitle());
//perform all your tasks in the new window here
driver.close();
}
}
driver.switchTo().window(parent);
System.out.println("Parent Window Title is: "+driver.getTitle());
答案 1 :(得分:0)
请勿在特定页面上使用driver.close()
,请在驱动程序工厂中使用以下代码:
//This closes the browser after each test class
@AfterClass
public void tearDown()
{
driver.quit();
}
应该有所帮助。
答案 2 :(得分:0)
根本原因可能在另一个地方。这些问题通常发生在抛出意外异常的情况下,这会阻止您的框架干净地退出会话。
由于我们无法全面了解您如何管理WebDriver会话,因此它只是一个猜谜游戏。
驱动程序本身可能会被命令行杀死,例如taskkill
(或您正在使用的任何操作系统),可通过以下方式执行: https://github.com/zeroturnaround/zt-exec图书馆。但它只是一种解决方法,它将隐藏您的架构的潜在弱点。
答案 3 :(得分:0)
在taskkill
块中使用finally
,如下所示。它将杀死任务chromedriver.exe
:
finally {
if(System.getProperty("os.name").contains("Windows")) {
Process process = Runtime. getRuntime(). exec("taskkill /F /IM chromedriver.exe /T");
process.destroy();
}
}
答案 4 :(得分:0)
我很新,还在学习。我最近发现我的可用内存即将用尽。直到那时,我才发现进程下有很多chromedriver.exe实例(对于FF,还有geckodriver.exe)。我用它来杀死我的ChromeDriver.exe实例。
Runtime.getRuntime().exec("taskkill /F /IM ChromeDriver.exe");
它很好用。