diff --git a/selenium/che-selenium-core/bin/webdriver.sh b/selenium/che-selenium-core/bin/webdriver.sh
index 36d9640a99d..df84fef0795 100755
--- a/selenium/che-selenium-core/bin/webdriver.sh
+++ b/selenium/che-selenium-core/bin/webdriver.sh
@@ -830,7 +830,7 @@ storeTestReport() {
if [[ -f ${TMP_SUITE_PATH} ]]; then
cp ${TMP_SUITE_PATH} target/suite;
fi
- zip -qr ${report} target/screenshots target/htmldumps target/workspace-logs target/site target/failsafe-reports target/log target/bin target/suite
+ zip -qr ${report} target/screenshots target/htmldumps target/workspace-logs target/webdriver-logs target/site target/failsafe-reports target/log target/bin target/suite
echo -e "[TEST] Tests results and reports are saved to ${BLUE}${report}${NO_COLOUR}"
echo "[TEST]"
diff --git a/selenium/che-selenium-core/pom.xml b/selenium/che-selenium-core/pom.xml
index 9d439b44cde..ef0f8786184 100644
--- a/selenium/che-selenium-core/pom.xml
+++ b/selenium/che-selenium-core/pom.xml
@@ -90,6 +90,10 @@
org.eclipse.che.core
che-core-commons-annotations
+
+ org.eclipse.che.core
+ che-core-commons-json
+
org.eclipse.che.core
che-core-commons-lang
diff --git a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/SeleniumWebDriver.java b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/SeleniumWebDriver.java
index a381aef2ba2..2f4b3eb04a5 100644
--- a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/SeleniumWebDriver.java
+++ b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/SeleniumWebDriver.java
@@ -255,7 +255,8 @@ private RemoteWebDriver doCreateDriver(URL webDriverUrl) {
switch (browser) {
case GOOGLE_CHROME:
LoggingPreferences loggingPreferences = new LoggingPreferences();
- loggingPreferences.enable(LogType.BROWSER, Level.SEVERE);
+ loggingPreferences.enable(LogType.PERFORMANCE, Level.ALL);
+ loggingPreferences.enable(LogType.BROWSER, Level.ALL);
ChromeOptions options = new ChromeOptions();
options.addArguments("--no-sandbox");
diff --git a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/inject/SeleniumTestHandler.java b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/inject/SeleniumTestHandler.java
index 1f0f58b03c4..c7f021c1364 100644
--- a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/inject/SeleniumTestHandler.java
+++ b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/inject/SeleniumTestHandler.java
@@ -41,6 +41,7 @@
import java.util.stream.Stream;
import javax.annotation.PreDestroy;
import javax.validation.constraints.NotNull;
+import org.eclipse.che.commons.json.JsonParseException;
import org.eclipse.che.commons.lang.NameGenerator;
import org.eclipse.che.selenium.core.SeleniumWebDriver;
import org.eclipse.che.selenium.core.client.TestGitHubServiceClient;
@@ -50,6 +51,7 @@
import org.eclipse.che.selenium.core.pageobject.PageObjectsInjector;
import org.eclipse.che.selenium.core.user.InjectTestUser;
import org.eclipse.che.selenium.core.user.TestUser;
+import org.eclipse.che.selenium.core.webdriver.log.WebDriverLogsReaderFactory;
import org.eclipse.che.selenium.core.workspace.InjectTestWorkspace;
import org.eclipse.che.selenium.core.workspace.TestWorkspace;
import org.eclipse.che.selenium.core.workspace.TestWorkspaceLogsReader;
@@ -93,6 +95,10 @@ public abstract class SeleniumTestHandler
@Named("tests.htmldumps_dir")
private String htmldumpsDir;
+ @Inject
+ @Named("tests.webdriverlogs_dir")
+ private String webDriverLogsDir;
+
@Inject
@Named("tests.workspacelogs_dir")
private String workspaceLogsDir;
@@ -128,6 +134,7 @@ public abstract class SeleniumTestHandler
@Inject private TestGitHubServiceClient gitHubClientService;
@Inject private TestWorkspaceLogsReader testWorkspaceLogsReader;
@Inject private SeleniumTestStatistics seleniumTestStatistics;
+ @Inject private WebDriverLogsReaderFactory webDriverLogsReaderFactory;
private final Injector injector;
private final Map runningTests = new ConcurrentHashMap<>();
@@ -302,6 +309,7 @@ private void onTestFinish(ITestResult result) {
captureScreenshot(result);
captureHtmlSource(result);
captureTestWorkspaceLogs(result);
+ storeWebDriverLogs(result);
}
}
@@ -464,6 +472,32 @@ private void captureScreenshotsFromOpenedWindows(
});
}
+ private void storeWebDriverLogs(ITestResult result) {
+ Set webDrivers = new HashSet<>();
+ Object testInstance = result.getInstance();
+ collectInjectedWebDrivers(testInstance, webDrivers);
+ webDrivers.forEach(webDriver -> storeWebDriverLogs(result, webDriver));
+ }
+
+ private void storeWebDriverLogs(ITestResult result, SeleniumWebDriver webDriver) {
+ String testReference = getTestReference(result);
+
+ try {
+ String filename = NameGenerator.generate(testReference + "_", 4) + ".log";
+ Path webDriverLogsDirectory = Paths.get(webDriverLogsDir, filename);
+ Files.createDirectories(webDriverLogsDirectory.getParent());
+ Files.write(
+ webDriverLogsDirectory,
+ webDriverLogsReaderFactory
+ .create(webDriver)
+ .getAllLogs()
+ .getBytes(Charset.forName("UTF-8")),
+ StandardOpenOption.CREATE);
+ } catch (WebDriverException | IOException | JsonParseException e) {
+ LOG.error(format("Can't store web driver logs related to test %s.", testReference), e);
+ }
+ }
+
private void dumpHtmlCodeFromTheCurrentPage(ITestResult result, SeleniumWebDriver webDriver) {
String testReference = getTestReference(result);
String filename = NameGenerator.generate(testReference + "_", 8) + ".html";
diff --git a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/utils/BrowserLogsUtil.java b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/utils/BrowserLogsUtil.java
deleted file mode 100644
index e448bd7f1a0..00000000000
--- a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/utils/BrowserLogsUtil.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2012-2018 Red Hat, Inc.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Red Hat, Inc. - initial API and implementation
- */
-package org.eclipse.che.selenium.core.utils;
-
-import static org.openqa.selenium.logging.LogType.BROWSER;
-
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.net.URL;
-import java.util.List;
-import org.eclipse.che.selenium.core.SeleniumWebDriver;
-import org.openqa.selenium.logging.LogEntry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Read and store browser logs to the test logs. Log level and type are defined in {@link
- * org.eclipse.che.selenium.core.SeleniumWebDriver#doCreateDriver(URL)}
- */
-@Singleton
-public class BrowserLogsUtil {
- private final SeleniumWebDriver seleniumWebDriver;
- private final Logger LOG = LoggerFactory.getLogger(BrowserLogsUtil.class);
-
- @Inject
- public BrowserLogsUtil(SeleniumWebDriver seleniumWebDriver) {
- this.seleniumWebDriver = seleniumWebDriver;
- }
-
- /**
- * read logs from browser console
- *
- * @return log messages from browser console
- */
- public List getLogs() {
- return seleniumWebDriver.manage().logs().get(BROWSER).getAll();
- }
-
- /** store browser logs to the test logs */
- public void storeLogs() {
- getLogs().forEach(logEntry -> LOG.info("{} {}", logEntry.getLevel(), logEntry.getMessage()));
- }
-}
diff --git a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Log.java b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Log.java
new file mode 100644
index 00000000000..cf91f7cfa89
--- /dev/null
+++ b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Log.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2012-2018 Red Hat, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.selenium.core.webdriver.log;
+
+import static java.lang.String.format;
+import static org.eclipse.che.selenium.core.webdriver.log.WebDriverLogsReader.LOG_TIME_FORMAT;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * This class deals with web driver log entry.
+ *
+ * @author Dmytro Nochevnov
+ */
+public class Log {
+ private Message message;
+ private long timestamp;
+
+ public Message getMessage() {
+ return message;
+ }
+
+ public void setMessage(Message message) {
+ this.message = message;
+ }
+
+ boolean isNetworkLog() {
+ return isNetworkRequest()
+ || isNetworkResponse()
+ || isWebsocketCreated()
+ || isWebsocketRequest()
+ || isWebsocketResponse();
+ }
+
+ private boolean isNetworkRequest() {
+ return "Network.requestWillBeSent".equals(getMessage().getMethod());
+ }
+
+ private boolean isNetworkResponse() {
+ return "Network.responseReceived".equals(getMessage().getMethod());
+ }
+
+ private boolean isWebsocketCreated() {
+ return "Network.webSocketCreated".equals(getMessage().getMethod());
+ }
+
+ private boolean isWebsocketRequest() {
+ return "Network.webSocketFrameSent".equals(getMessage().getMethod());
+ }
+
+ private boolean isWebsocketResponse() {
+ return "Network.webSocketFrameReceived".equals(getMessage().getMethod());
+ }
+
+ public String getUrl() {
+ if (hasRequest()) {
+ return getMessage().getParams().getRequest().getUrl();
+
+ } else if (hasResponse()) {
+ return getMessage().getParams().getResponse().getUrl();
+
+ } else if (hasParams() && getMessage().getParams().getUrl() != null) {
+ return getMessage().getParams().getUrl();
+ }
+
+ return "";
+ }
+
+ public String getRequestId() {
+ if (hasParams()) {
+ return getMessage().getParams().getRequestId();
+ }
+
+ return "";
+ }
+
+ public long getTimestamp() {
+ return timestamp;
+ }
+
+ public void setTimestamp(long timestamp) {
+ this.timestamp = timestamp;
+ }
+
+ private String getRequestMethod() {
+ if (hasRequest()) {
+ return getMessage().getParams().getRequest().getMethod();
+ }
+
+ return "";
+ }
+
+ private String getResponseStatus() {
+ if (hasResponse()) {
+ return getMessage().getParams().getResponse().getStatus();
+ }
+
+ return "";
+ }
+
+ private String getPayloadData() {
+ if (hasResponse()) {
+ return getMessage().getParams().getResponse().getPayloadData();
+ }
+
+ return "";
+ }
+
+ private boolean hasRequest() {
+ return hasParams() && getMessage().getParams().getRequest() != null;
+ }
+
+ private boolean hasResponse() {
+ return hasParams() && getMessage().getParams().getResponse() != null;
+ }
+
+ private boolean hasParams() {
+ return getMessage() != null && getMessage().getParams() != null;
+ }
+
+ private String formatTime(long timestamp) {
+ return new SimpleDateFormat(LOG_TIME_FORMAT).format(new Date(timestamp));
+ }
+
+ @Override
+ public String toString() {
+ String prefix = format("%s (id: %s)", formatTime(getTimestamp()), getRequestId());
+
+ if (isNetworkRequest()) {
+ return format("%s [REQUEST] %s %s\n", prefix, getRequestMethod(), getUrl());
+
+ } else if (isNetworkResponse()) {
+ return format("%s [RESPONSE] %s %s\n", prefix, getResponseStatus(), getUrl());
+
+ } else if (isWebsocketCreated()) {
+ return format("%s [WEBSOCKET_CREATED] %s\n", prefix, getUrl());
+
+ } else if (isWebsocketRequest()) {
+ return format("%s [WEBSOCKET_REQUEST] %s\n", prefix, getPayloadData());
+
+ } else if (isWebsocketResponse()) {
+ return format("%s [WEBSOCKET_RESPONSE] %s\n", prefix, getPayloadData());
+ }
+
+ return super.toString();
+ }
+}
diff --git a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Message.java b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Message.java
new file mode 100644
index 00000000000..c61006bda06
--- /dev/null
+++ b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Message.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2012-2018 Red Hat, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.selenium.core.webdriver.log;
+
+/**
+ * This is POJO to extract message from web driver network log entry
+ *
+ * @author Dmytro Nochevnov
+ */
+public interface Message {
+ String getMethod();
+
+ void setMethod(String method);
+
+ Params getParams();
+
+ void setParams(Params params);
+}
diff --git a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Params.java b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Params.java
new file mode 100644
index 00000000000..bd217b0385e
--- /dev/null
+++ b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Params.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2012-2018 Red Hat, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.selenium.core.webdriver.log;
+
+/**
+ * This is POJO to extract 'params' value from web driver network log entry
+ *
+ * @author Dmytro Nochevnov
+ */
+public interface Params {
+ String getRequestId();
+
+ void setRequestId(String requestId);
+
+ String getUrl();
+
+ void setUrl(String url);
+
+ Request getRequest();
+
+ void setRequest(Request request);
+
+ Response getResponse();
+
+ void setResponse(Response request);
+
+ String getTimestamp();
+
+ void setTimestamp(String timestamp);
+}
diff --git a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Request.java b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Request.java
new file mode 100644
index 00000000000..43fda93558d
--- /dev/null
+++ b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Request.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2012-2018 Red Hat, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.selenium.core.webdriver.log;
+
+/**
+ * This is POJO to extract `request` value from web driver network log entry.
+ *
+ * @author Dmytro Nochevnov
+ */
+public interface Request {
+ String getUrl();
+
+ void setUrl(String url);
+
+ String getMethod();
+
+ void setMethod(String method);
+
+ String getWallTime();
+
+ void setWallTime(String wallTime);
+}
diff --git a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Response.java b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Response.java
new file mode 100644
index 00000000000..87aa275b283
--- /dev/null
+++ b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/Response.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2012-2018 Red Hat, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.selenium.core.webdriver.log;
+
+/**
+ * This is POJO to extract 'response' value from web driver network log entry.
+ *
+ * @author Dmytro Nochevnov
+ */
+public interface Response {
+ String getUrl();
+
+ void setUrl(String url);
+
+ String getStatus();
+
+ void setStatus(String status);
+
+ String getPayloadData();
+
+ void setPayloadData(String payloadData);
+}
diff --git a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/WebDriverLogsReader.java b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/WebDriverLogsReader.java
new file mode 100644
index 00000000000..1a1a6cc2b87
--- /dev/null
+++ b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/WebDriverLogsReader.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 2012-2018 Red Hat, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.selenium.core.webdriver.log;
+
+import static java.lang.String.format;
+import static org.openqa.selenium.logging.LogType.BROWSER;
+import static org.openqa.selenium.logging.LogType.PERFORMANCE;
+
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+import com.google.inject.name.Named;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.che.commons.json.JsonHelper;
+import org.eclipse.che.commons.json.JsonParseException;
+import org.eclipse.che.selenium.core.SeleniumWebDriver;
+import org.openqa.selenium.logging.LogEntries;
+import org.openqa.selenium.logging.LogEntry;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class WebDriverLogsReader {
+ public static final String LOG_TIME_FORMAT = "yyyy-MM-dd hh:mm:ss,SSS";
+ private static final Logger LOG = LoggerFactory.getLogger(WebDriverLogsReader.class);
+
+ private final SeleniumWebDriver seleniumWebDriver;
+ private final String cheHost;
+
+ @Inject
+ public WebDriverLogsReader(
+ @Named("che.host") String cheHost, SeleniumWebDriver seleniumWebDriver) {
+ this.seleniumWebDriver = seleniumWebDriver;
+ this.cheHost = cheHost;
+ }
+
+ @AssistedInject
+ public WebDriverLogsReader(
+ @Assisted SeleniumWebDriver seleniumWebDriver, @Named("che.host") String cheHost) {
+ this.seleniumWebDriver = seleniumWebDriver;
+ this.cheHost = cheHost;
+ }
+
+ /**
+ * Reads logs of browser from web driver.
+ *
+ * @return log messages from browser console
+ */
+ private LogEntries readBrowserLogs() {
+ return seleniumWebDriver.manage().logs().get(BROWSER);
+ }
+
+ /**
+ * Reads performance logs from web driver.
+ *
+ * @return all types of performance logs
+ */
+ private LogEntries readPerformanceLogs() {
+ return seleniumWebDriver.manage().logs().get(PERFORMANCE);
+ }
+
+ /**
+ * Gets all logs of web driver.
+ *
+ * @return logs from browser console and Eclipse Che network logs
+ */
+ public String getAllLogs() throws JsonParseException {
+ return prepareBrowserLogs() + "\n" + prepareCheNetworkLogs();
+ }
+
+ private String prepareBrowserLogs() {
+ StringBuilder browserLogsOutput =
+ new StringBuilder("Browser console logs:\n").append("---------------------\n");
+
+ readBrowserLogs()
+ .forEach(
+ logEntry ->
+ browserLogsOutput.append(
+ format(
+ "%s %s %s\n\n",
+ formatTime(logEntry.getTimestamp()),
+ logEntry.getLevel(),
+ logEntry.getMessage())));
+
+ return browserLogsOutput.toString();
+ }
+
+ /** filter data and get requests/responses that have been sent on CHE URL */
+ private String prepareCheNetworkLogs() throws JsonParseException {
+ StringBuilder networkLogsOutput =
+ new StringBuilder("Eclipse Che network logs: \n").append("-------------------------\n");
+ Map> networkLogs = new HashMap<>();
+ for (LogEntry logEntry : readPerformanceLogs()) {
+ Log log = JsonHelper.fromJson(logEntry.getMessage(), Log.class, null);
+ if (log.isNetworkLog()) {
+ log.setTimestamp(logEntry.getTimestamp());
+ if (networkLogs.containsKey(log.getRequestId())) {
+ networkLogs.get(log.getRequestId()).add(log);
+ } else {
+ ArrayList logs = new ArrayList<>();
+ logs.add(log);
+ networkLogs.put(log.getRequestId(), logs);
+ }
+
+ if (isLogFromCheTraffic(log.getRequestId(), networkLogs)) {
+ networkLogsOutput.append(log.toString());
+ } else {
+ networkLogs.remove(log.getRequestId());
+ }
+ }
+ }
+
+ return networkLogsOutput.toString();
+ }
+
+ /**
+ * Go through the {@code networkLogs} related to the certain {@code requestId} and return {@code
+ * true} if at least one of them has url from Che traffic.
+ */
+ private boolean isLogFromCheTraffic(String requestId, Map> networkLogs) {
+ return networkLogs
+ .get(requestId)
+ .stream()
+ .filter(log -> isUrlFromCheTraffic(log.getUrl()))
+ .count()
+ > 0;
+ }
+
+ private boolean isUrlFromCheTraffic(String url) {
+ return url != null
+ && (url.matches(format("https?://%s[:\\d]*/api/.*", cheHost))
+ || url.matches(format("wss?://%s[:\\d]*/(api|connect|wsagent).*", cheHost)));
+ }
+
+ private String formatTime(long timestamp) {
+ return new SimpleDateFormat(LOG_TIME_FORMAT).format(new Date(timestamp));
+ }
+}
diff --git a/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/WebDriverLogsReaderFactory.java b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/WebDriverLogsReaderFactory.java
new file mode 100644
index 00000000000..f575c5511b9
--- /dev/null
+++ b/selenium/che-selenium-core/src/main/java/org/eclipse/che/selenium/core/webdriver/log/WebDriverLogsReaderFactory.java
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2012-2018 Red Hat, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.selenium.core.webdriver.log;
+
+import org.eclipse.che.selenium.core.SeleniumWebDriver;
+
+/** @author Dmytro Nochevnov */
+public interface WebDriverLogsReaderFactory {
+
+ WebDriverLogsReader create(SeleniumWebDriver webdriver);
+}
diff --git a/selenium/che-selenium-test/src/main/java/org/eclipse/che/selenium/core/CheSeleniumSuiteModule.java b/selenium/che-selenium-test/src/main/java/org/eclipse/che/selenium/core/CheSeleniumSuiteModule.java
index 1a98e05b6b6..289ae3ec642 100644
--- a/selenium/che-selenium-test/src/main/java/org/eclipse/che/selenium/core/CheSeleniumSuiteModule.java
+++ b/selenium/che-selenium-test/src/main/java/org/eclipse/che/selenium/core/CheSeleniumSuiteModule.java
@@ -49,6 +49,7 @@
import org.eclipse.che.selenium.core.user.CheDefaultTestUser;
import org.eclipse.che.selenium.core.user.TestUser;
import org.eclipse.che.selenium.core.user.TestUserFactory;
+import org.eclipse.che.selenium.core.webdriver.log.WebDriverLogsReaderFactory;
import org.eclipse.che.selenium.core.workspace.CheTestWorkspaceUrlResolver;
import org.eclipse.che.selenium.core.workspace.TestWorkspace;
import org.eclipse.che.selenium.core.workspace.TestWorkspaceProvider;
@@ -97,6 +98,7 @@ public void configure() {
install(new FactoryModuleBuilder().build(TestWorkspaceServiceClientFactory.class));
install(new FactoryModuleBuilder().build(TestUserFactory.class));
install(new FactoryModuleBuilder().build(TestUserServiceClientFactory.class));
+ install(new FactoryModuleBuilder().build(WebDriverLogsReaderFactory.class));
bind(PageObjectsInjector.class).to(PageObjectsInjectorImpl.class);
diff --git a/selenium/che-selenium-test/src/main/java/org/eclipse/che/selenium/pageobject/ProjectExplorer.java b/selenium/che-selenium-test/src/main/java/org/eclipse/che/selenium/pageobject/ProjectExplorer.java
index 87d708b6f1f..36b1935a72d 100644
--- a/selenium/che-selenium-test/src/main/java/org/eclipse/che/selenium/pageobject/ProjectExplorer.java
+++ b/selenium/che-selenium-test/src/main/java/org/eclipse/che/selenium/pageobject/ProjectExplorer.java
@@ -58,7 +58,6 @@
import org.eclipse.che.selenium.core.constant.TestProjectExplorerContextMenuConstants.ContextMenuCommandGoals;
import org.eclipse.che.selenium.core.constant.TestProjectExplorerContextMenuConstants.ContextMenuFirstLevelItems;
import org.eclipse.che.selenium.core.constant.TestProjectExplorerContextMenuConstants.ContextMenuItems;
-import org.eclipse.che.selenium.core.utils.BrowserLogsUtil;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Keys;
@@ -82,7 +81,6 @@ public class ProjectExplorer {
private final NavigateToFile navigateToFile;
private final CodenvyEditor editor;
private final TestWebElementRenderChecker testWebElementRenderChecker;
- private final BrowserLogsUtil browserLogsUtil;
private final SeleniumWebDriverHelper seleniumWebDriverHelper;
private final WebDriverWaitFactory waitFactory;
private final int DEFAULT_TIMEOUT;
@@ -95,7 +93,6 @@ public ProjectExplorer(
NavigateToFile navigateToFile,
CodenvyEditor editor,
TestWebElementRenderChecker testWebElementRenderChecker,
- BrowserLogsUtil browserLogsUtil,
SeleniumWebDriverHelper seleniumWebDriverHelper,
WebDriverWaitFactory webDriverWaitFactory) {
this.seleniumWebDriver = seleniumWebDriver;
@@ -104,7 +101,6 @@ public ProjectExplorer(
this.navigateToFile = navigateToFile;
this.editor = editor;
this.testWebElementRenderChecker = testWebElementRenderChecker;
- this.browserLogsUtil = browserLogsUtil;
this.seleniumWebDriverHelper = seleniumWebDriverHelper;
this.waitFactory = webDriverWaitFactory;
this.DEFAULT_TIMEOUT = LOAD_PAGE_TIMEOUT_SEC;
@@ -255,7 +251,6 @@ public void waitProjectExplorer(int timeout) {
} catch (TimeoutException ex) {
// remove try-catch block after issue has been resolved
if (seleniumWebDriverHelper.isVisible(By.id("ide-loader-progress-bar"))) {
- browserLogsUtil.storeLogs();
fail("Known issue https://github.com/eclipse/che/issues/8468", ex);
}
diff --git a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/editor/autocomplete/AutocompleteProposalJavaDocTest.java b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/editor/autocomplete/AutocompleteProposalJavaDocTest.java
index 71fc733a9ed..d5905fb1736 100644
--- a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/editor/autocomplete/AutocompleteProposalJavaDocTest.java
+++ b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/editor/autocomplete/AutocompleteProposalJavaDocTest.java
@@ -18,7 +18,6 @@
import java.nio.file.Paths;
import org.eclipse.che.selenium.core.client.TestProjectServiceClient;
import org.eclipse.che.selenium.core.project.ProjectTemplates;
-import org.eclipse.che.selenium.core.utils.BrowserLogsUtil;
import org.eclipse.che.selenium.core.workspace.TestWorkspace;
import org.eclipse.che.selenium.pageobject.CodenvyEditor;
import org.eclipse.che.selenium.pageobject.Ide;
@@ -51,7 +50,6 @@ public class AutocompleteProposalJavaDocTest {
@Inject private CodenvyEditor editor;
@Inject private NotificationsPopupPanel notificationsPopupPanel;
@Inject private TestProjectServiceClient testProjectServiceClient;
- @Inject private BrowserLogsUtil browserLogsUtil;
@BeforeClass
public void setup() throws Exception {
@@ -217,7 +215,6 @@ private void launchAutocompleteAndWaitContainer() throws Exception {
logExternalLibraries();
logProjectTypeChecking();
logProjectLanguageChecking();
- browserLogsUtil.storeLogs();
// remove try-catch block after issue has been resolved
fail("Known issue https://github.com/eclipse/che/issues/7161", ex);
diff --git a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/editor/autocomplete/AutocompleteWithInheritTest.java b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/editor/autocomplete/AutocompleteWithInheritTest.java
index cd45ade6b3e..1a232430ffb 100644
--- a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/editor/autocomplete/AutocompleteWithInheritTest.java
+++ b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/editor/autocomplete/AutocompleteWithInheritTest.java
@@ -20,7 +20,6 @@
import org.eclipse.che.commons.lang.NameGenerator;
import org.eclipse.che.selenium.core.client.TestProjectServiceClient;
import org.eclipse.che.selenium.core.project.ProjectTemplates;
-import org.eclipse.che.selenium.core.utils.BrowserLogsUtil;
import org.eclipse.che.selenium.core.workspace.TestWorkspace;
import org.eclipse.che.selenium.pageobject.CodenvyEditor;
import org.eclipse.che.selenium.pageobject.CodenvyEditor.MarkerLocator;
@@ -60,7 +59,6 @@ public class AutocompleteWithInheritTest {
@Inject private CodenvyEditor editor;
@Inject private MavenPluginStatusBar mavenPluginStatusBar;
@Inject private TestProjectServiceClient testProjectServiceClient;
- @Inject private BrowserLogsUtil browserLogsUtil;
@BeforeClass
public void prepare() throws Exception {
@@ -123,7 +121,6 @@ private void waitErrorMarkerInPosition() throws Exception {
logExternalLibraries();
logProjectTypeChecking();
logProjectLanguageChecking();
- browserLogsUtil.storeLogs();
// remove try-catch block after issue has been resolved
fail("Known issue https://github.com/eclipse/che/issues/7161", ex);
diff --git a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/editor/autocomplete/ShowHintsCommandTest.java b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/editor/autocomplete/ShowHintsCommandTest.java
index 03ae5da724d..de4b16e841d 100644
--- a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/editor/autocomplete/ShowHintsCommandTest.java
+++ b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/editor/autocomplete/ShowHintsCommandTest.java
@@ -18,7 +18,6 @@
import org.eclipse.che.commons.lang.NameGenerator;
import org.eclipse.che.selenium.core.client.TestProjectServiceClient;
import org.eclipse.che.selenium.core.project.ProjectTemplates;
-import org.eclipse.che.selenium.core.utils.BrowserLogsUtil;
import org.eclipse.che.selenium.core.workspace.TestWorkspace;
import org.eclipse.che.selenium.pageobject.CodenvyEditor;
import org.eclipse.che.selenium.pageobject.CodenvyEditor.MarkerLocator;
@@ -62,7 +61,6 @@ public class ShowHintsCommandTest {
@Inject private CodenvyEditor editor;
@Inject private TestProjectServiceClient testProjectServiceClient;
@Inject private Consoles console;
- @Inject private BrowserLogsUtil browserLogsUtil;
@BeforeClass
public void prepare() throws Exception {
@@ -123,7 +121,6 @@ private void waitErrorMarkerInPosition() throws Exception {
logExternalLibraries();
logProjectTypeChecking();
logProjectLanguageChecking();
- browserLogsUtil.storeLogs();
// remove try-catch block after issue has been resolved
fail("Known issue https://github.com/eclipse/che/issues/7161", ex);
diff --git a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/factory/CheckFactoryWithPerUserCreatePolicyTest.java b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/factory/CheckFactoryWithPerUserCreatePolicyTest.java
index 83cb42ca5a4..d7eaa550b7b 100644
--- a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/factory/CheckFactoryWithPerUserCreatePolicyTest.java
+++ b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/factory/CheckFactoryWithPerUserCreatePolicyTest.java
@@ -20,7 +20,6 @@
import org.eclipse.che.selenium.core.factory.FactoryTemplate;
import org.eclipse.che.selenium.core.factory.TestFactory;
import org.eclipse.che.selenium.core.factory.TestFactoryInitializer;
-import org.eclipse.che.selenium.core.utils.BrowserLogsUtil;
import org.eclipse.che.selenium.pageobject.NotificationsPopupPanel;
import org.eclipse.che.selenium.pageobject.ProjectExplorer;
import org.eclipse.che.selenium.pageobject.dashboard.Dashboard;
@@ -38,7 +37,6 @@ public class CheckFactoryWithPerUserCreatePolicyTest {
@Inject private NotificationsPopupPanel notificationsPopupPanel;
@Inject private TestFactoryInitializer testFactoryInitializer;
@Inject private SeleniumWebDriver seleniumWebDriver;
- @Inject private BrowserLogsUtil browserLogsUtil;
private TestFactory testFactory;
private final Logger LOG = LoggerFactory.getLogger(CheckFactoryWithPerUserCreatePolicyTest.class);
@@ -74,7 +72,6 @@ public void checkFactoryAcceptingWithPerUserPolicy() throws Exception {
try {
seleniumWebDriver.switchFromDashboardIframeToIde();
} catch (TimeoutException ex) {
- browserLogsUtil.storeLogs();
LOG.info(
String.format(
CheckFactoryWithPerUserCreatePolicyTest.class.getSimpleName(),
diff --git a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/opendeclaration/Eclipse0093Test.java b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/opendeclaration/Eclipse0093Test.java
index ee8651820bf..90c14b8cbcd 100644
--- a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/opendeclaration/Eclipse0093Test.java
+++ b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/opendeclaration/Eclipse0093Test.java
@@ -19,7 +19,6 @@
import org.eclipse.che.commons.lang.NameGenerator;
import org.eclipse.che.selenium.core.client.TestProjectServiceClient;
import org.eclipse.che.selenium.core.project.ProjectTemplates;
-import org.eclipse.che.selenium.core.utils.BrowserLogsUtil;
import org.eclipse.che.selenium.core.workspace.TestWorkspace;
import org.eclipse.che.selenium.pageobject.CodenvyEditor;
import org.eclipse.che.selenium.pageobject.Ide;
@@ -47,7 +46,6 @@ public class Eclipse0093Test {
@Inject private ProjectExplorer projectExplorer;
@Inject private CodenvyEditor editor;
@Inject private TestProjectServiceClient testProjectServiceClient;
- @Inject private BrowserLogsUtil browserLogsUtil;
@BeforeClass
public void prepare() throws Exception {
@@ -74,12 +72,10 @@ private void waitMarkerInPosition() throws Exception {
try {
editor.waitMarkerInPosition(WARNING, 12);
} catch (TimeoutException ex) {
+ // remove try-catch block after issue has been resolved
logExternalLibraries();
logProjectTypeChecking();
logProjectLanguageChecking();
- browserLogsUtil.storeLogs();
-
- // remove try-catch block after issue has been resolved
fail("Known issue https://github.com/eclipse/che/issues/7161", ex);
}
}
diff --git a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/opendeclaration/Eclipse0115Test.java b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/opendeclaration/Eclipse0115Test.java
index ac469532727..d14dce49d46 100644
--- a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/opendeclaration/Eclipse0115Test.java
+++ b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/opendeclaration/Eclipse0115Test.java
@@ -19,7 +19,6 @@
import org.eclipse.che.commons.lang.NameGenerator;
import org.eclipse.che.selenium.core.client.TestProjectServiceClient;
import org.eclipse.che.selenium.core.project.ProjectTemplates;
-import org.eclipse.che.selenium.core.utils.BrowserLogsUtil;
import org.eclipse.che.selenium.core.workspace.TestWorkspace;
import org.eclipse.che.selenium.pageobject.CodenvyEditor;
import org.eclipse.che.selenium.pageobject.Ide;
@@ -47,7 +46,6 @@ public class Eclipse0115Test {
@Inject private ProjectExplorer projectExplorer;
@Inject private CodenvyEditor editor;
@Inject private TestProjectServiceClient testProjectServiceClient;
- @Inject private BrowserLogsUtil browserLogsUtil;
@BeforeClass
public void prepare() throws Exception {
@@ -76,7 +74,6 @@ private void waitMarkerInPosition() throws Exception {
logExternalLibraries();
logProjectTypeChecking();
logProjectLanguageChecking();
- browserLogsUtil.storeLogs();
// remove try-catch block after issue has been resolved
fail("Known issue https://github.com/eclipse/che/issues/7161", ex);
diff --git a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/opendeclaration/Eclipse0121Test.java b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/opendeclaration/Eclipse0121Test.java
index 7bbc5a67a95..fea11c56d73 100644
--- a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/opendeclaration/Eclipse0121Test.java
+++ b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/opendeclaration/Eclipse0121Test.java
@@ -18,7 +18,6 @@
import org.eclipse.che.commons.lang.NameGenerator;
import org.eclipse.che.selenium.core.client.TestProjectServiceClient;
import org.eclipse.che.selenium.core.project.ProjectTemplates;
-import org.eclipse.che.selenium.core.utils.BrowserLogsUtil;
import org.eclipse.che.selenium.core.workspace.TestWorkspace;
import org.eclipse.che.selenium.pageobject.CodenvyEditor;
import org.eclipse.che.selenium.pageobject.Ide;
@@ -47,7 +46,6 @@ public class Eclipse0121Test {
@Inject private ProjectExplorer projectExplorer;
@Inject private CodenvyEditor editor;
@Inject private TestProjectServiceClient testProjectServiceClient;
- @Inject private BrowserLogsUtil browserLogsUtil;
@BeforeClass
public void prepare() throws Exception {
@@ -72,7 +70,6 @@ public void test0121() throws Exception {
logExternalLibraries();
logProjectTypeChecking();
logProjectLanguageChecking();
- browserLogsUtil.storeLogs();
// remove try-catch block after issue has been resolved
fail("Known issue https://github.com/eclipse/che/issues/7161", ex);
diff --git a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/projectexplorer/CreateNewPackagesWithHelpCreationJavaClassTest.java b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/projectexplorer/CreateNewPackagesWithHelpCreationJavaClassTest.java
index 702e4a18442..bba70f1a939 100644
--- a/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/projectexplorer/CreateNewPackagesWithHelpCreationJavaClassTest.java
+++ b/selenium/che-selenium-test/src/test/java/org/eclipse/che/selenium/projectexplorer/CreateNewPackagesWithHelpCreationJavaClassTest.java
@@ -20,7 +20,6 @@
import org.eclipse.che.selenium.core.constant.TestMenuCommandsConstants;
import org.eclipse.che.selenium.core.project.ProjectTemplates;
import org.eclipse.che.selenium.core.provider.TestApiEndpointUrlProvider;
-import org.eclipse.che.selenium.core.utils.BrowserLogsUtil;
import org.eclipse.che.selenium.core.workspace.TestWorkspace;
import org.eclipse.che.selenium.pageobject.AskForValueDialog;
import org.eclipse.che.selenium.pageobject.CodenvyEditor;
@@ -52,7 +51,6 @@ public class CreateNewPackagesWithHelpCreationJavaClassTest {
@Inject private TestProjectServiceClient testProjectServiceClient;
@Inject private HttpJsonRequestFactory httpJsonRequestFactory;
@Inject private TestApiEndpointUrlProvider testApiEndpointUrlProvider;
- @Inject private BrowserLogsUtil browserLogsUtil;
@BeforeClass
public void setUp() throws Exception {
@@ -100,7 +98,6 @@ public void createNewPackageFromContextMenuTest() throws Exception {
projectExplorer.waitVisibilityByName("TestClass2.java");
} catch (TimeoutException ex) {
// remove try-catch block after issue has been resolved
- browserLogsUtil.storeLogs();
fail("Known issue https://github.com/eclipse/che/issues/8122");
}
}
diff --git a/selenium/che-selenium-test/src/test/resources/conf/selenium.properties b/selenium/che-selenium-test/src/test/resources/conf/selenium.properties
index c539382aae4..8d6aed62fec 100644
--- a/selenium/che-selenium-test/src/test/resources/conf/selenium.properties
+++ b/selenium/che-selenium-test/src/test/resources/conf/selenium.properties
@@ -13,6 +13,7 @@
tests.screenshots_dir=target/screenshots
tests.htmldumps_dir=target/htmldumps
tests.workspacelogs_dir=target/workspace-logs
+tests.webdriverlogs_dir=target/webdriver-logs
# Workspace default size
workspace.default_memory_gb=2