@Override public Void call() throws Exception { WebDriver driver = getDriver(); if (driver == null) { return null; } try { LoggingManager.perSessionLogHandler().fetchAndStoreLogsFromDriver(getSessionId(), driver); } catch (Throwable ignored) { // A failure to retrieve logs should not cause a test to fail. // Silently ignore this exception. } driver.quit(); // Yes, this is funky. See javadocs on PerSessionLogHandler#clearThreadTempLogs for details. final PerSessionLogHandler logHandler = LoggingManager.perSessionLogHandler(); /* We may be storing logging information on 2 different threads, the servlet container thread and the thread executing commands All this ugliness would go away if we just handled create and delete of sessions fully inside ResultConfig because then we could avoid switching threads and there will not be logevents that do not have a session present Additionally; if we ever get non-session bound logging here, it will come in the incorrect order. But that should only happen on create/delete, right ? */ logHandler.transferThreadTempLogsToSessionLogs(getSessionId()); return null; }
void checkExpiry() { for (SessionId sessionId : driverSessions.getSessions()) { Session session = driverSessions.get(sessionId); if (session != null) { boolean useDeleteSession = false; boolean killed = false; boolean inUse = session.isInUse(); if (!inUse && session.isTimedOut(clientGoneTimeout)) { useDeleteSession = true; log.info("Session " + session.getSessionId() + " deleted due to client timeout"); } if (inUse && session.isTimedOut(insideBrowserTimeout)) { WebDriver driver = session.getDriver(); if (driver instanceof EventFiringWebDriver){ driver = ((EventFiringWebDriver)driver).getWrappedDriver(); } if (driver instanceof Killable) { //session.interrupt(); ((Killable) driver).kill(); killed = true; log.warning("Browser killed and session " + session.getSessionId() + " terminated due to in-browser timeout."); } else { useDeleteSession = true; log.warning("Session " + session.getSessionId() + " deleted due to in-browser timeout. " + "Terminating driver with DeleteSession since it does not support Killable, " + "the driver in question does not support selenium-server timeouts fully"); } } if (useDeleteSession) { DeleteSession deleteSession = new DeleteSession(session); try { deleteSession.call(); } catch (Exception e) { throw new RuntimeException(e); } } if (useDeleteSession || killed) { driverSessions.deleteSession(sessionId); final PerSessionLogHandler logHandler = LoggingManager.perSessionLogHandler(); logHandler.transferThreadTempLogsToSessionLogs(sessionId); logHandler.removeSessionLogs(sessionId); } } } }