
eu.tsystems.mms.tic.testframework.webdrivermanager.DesktopWebDriverFactory Maven / Gradle / Ivy
/*
* Testerra
*
* (C) 2020, Peter Lehmann, T-Systems Multimedia Solutions GmbH, Deutsche Telekom AG
*
* Deutsche Telekom AG and all other contributors /
* copyright owners license this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this
* file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package eu.tsystems.mms.tic.testframework.webdrivermanager;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import eu.tsystems.mms.tic.testframework.common.PropertyManager;
import eu.tsystems.mms.tic.testframework.constants.Browsers;
import eu.tsystems.mms.tic.testframework.constants.Constants;
import eu.tsystems.mms.tic.testframework.constants.TesterraProperties;
import eu.tsystems.mms.tic.testframework.enums.Position;
import eu.tsystems.mms.tic.testframework.exceptions.SetupException;
import eu.tsystems.mms.tic.testframework.exceptions.SystemException;
import eu.tsystems.mms.tic.testframework.internal.Defaults;
import eu.tsystems.mms.tic.testframework.internal.Flags;
import eu.tsystems.mms.tic.testframework.internal.StopWatch;
import eu.tsystems.mms.tic.testframework.internal.utils.DriverStorage;
import eu.tsystems.mms.tic.testframework.logging.Loggable;
import eu.tsystems.mms.tic.testframework.model.NodeInfo;
import eu.tsystems.mms.tic.testframework.report.model.context.SessionContext;
import eu.tsystems.mms.tic.testframework.report.utils.ExecutionContextUtils;
import eu.tsystems.mms.tic.testframework.sikuli.SikuliWebDriver;
import eu.tsystems.mms.tic.testframework.transfer.ThrowablePackedResponse;
import eu.tsystems.mms.tic.testframework.useragents.UserAgentConfig;
import eu.tsystems.mms.tic.testframework.utils.FileUtils;
import eu.tsystems.mms.tic.testframework.utils.StringUtils;
import eu.tsystems.mms.tic.testframework.utils.Timer;
import eu.tsystems.mms.tic.testframework.utils.TimerUtils;
import eu.tsystems.mms.tic.testframework.webdrivermanager.desktop.WebDriverMode;
import net.anthavio.phanbedder.Phanbedder;
import org.openqa.selenium.Capabilities;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.Point;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeOptions;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.ie.InternetExplorerOptions;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriverService;
import org.openqa.selenium.remote.BrowserType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.HttpCommandExecutor;
import org.openqa.selenium.remote.LocalFileDetector;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.safari.SafariDriver;
import org.openqa.selenium.safari.SafariOptions;
import org.openqa.selenium.support.events.EventFiringWebDriver;
import java.io.File;
import java.lang.reflect.Constructor;
import java.net.URL;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
public class DesktopWebDriverFactory extends WebDriverFactory implements Loggable {
//public static final TimingInfosCollector STARTUP_TIME_COLLECTOR = new TimingInfosCollector();
private static File phantomjsFile = null;
@Override
protected DesktopWebDriverRequest buildRequest(AbstractWebDriverRequest request) {
DesktopWebDriverRequest finalRequest;
if (request instanceof DesktopWebDriverRequest) {
finalRequest = (DesktopWebDriverRequest) request;
} else if (request instanceof UnspecificWebDriverRequest) {
finalRequest = new DesktopWebDriverRequest();
finalRequest.setSessionKey(request.getSessionKey());
finalRequest.setBrowser(request.getBrowser());
finalRequest.setBrowserVersion(request.getBrowserVersion());
request.getBaseUrl().ifPresent(finalRequest::setBaseUrl);
} else {
throw new SystemException(request.getClass().getSimpleName() + " is not allowed here");
}
/*
set webdriver mode
*/
if (finalRequest.getWebDriverMode() == null) {
finalRequest.setWebDriverMode(WebDriverManager.getConfig().getWebDriverMode());
}
return finalRequest;
}
@Override
protected DesiredCapabilities buildCapabilities(DesiredCapabilities preSetCaps, DesktopWebDriverRequest desktopWebDriverRequest) {
return DesktopWebDriverCapabilities.createCapabilities(WebDriverManager.getConfig(), preSetCaps, desktopWebDriverRequest);
}
@Override
public WebDriver getRawWebDriver(DesktopWebDriverRequest request, DesiredCapabilities desiredCapabilities, SessionContext sessionContext) {
/*
start the session
*/
WebDriver driver = startSession(request, desiredCapabilities, sessionContext);
request.getBaseUrl().ifPresent(baseUrl -> {
try {
log().info("Opening baseUrl: " + baseUrl.toString());
StopWatch.startPageLoad(driver);
driver.get(baseUrl.toString());
} catch (Exception e) {
if (StringUtils.containsAll(e.getMessage(), true, "Reached error page", "connectionFailure")) {
throw new RuntimeException("Could not start driver session, because of unreachable url: " + baseUrl, e);
}
throw e;
}
});
return driver;
}
private WebDriver startSession(
DesktopWebDriverRequest desktopWebDriverRequest,
DesiredCapabilities desiredCapabilities,
SessionContext sessionContext
) {
/*
if there is a factories entry for the requested browser, then create the new (raw) instance here and wrap it directly in EventFiringWD
*/
if (Flags.REUSE_DATAPROVIDER_DRIVER_BY_THREAD) {
String threadName = Thread.currentThread().getId() + "";
String testMethodName = ExecutionContextUtils.getMethodNameFromCurrentTestResult();
if (testMethodName != null) {
WebDriver driver = DriverStorage.getDriverByTestMethodName(testMethodName, threadName);
if (driver != null) {
log().info("Re-Using WebDriver for " + testMethodName + ": " + threadName + " driver: " + driver);
// cleanup session
driver.manage().deleteAllCookies();
/*
Open url
*/
desktopWebDriverRequest.getBaseUrl().ifPresent(baseUrl -> {
log().info("Opening baseUrl with reused driver: " + baseUrl);
StopWatch.startPageLoad(driver);
driver.get(baseUrl.toString());
});
return driver;
} else {
return newWebDriver(desktopWebDriverRequest, desiredCapabilities, sessionContext);
}
}
} else {
/*
regular branch to create a new web driver session
*/
return newWebDriver(desktopWebDriverRequest, desiredCapabilities, sessionContext);
}
throw new SystemException("WebDriverManager is in a bad state. Please report this to the tt. developers.");
}
@Override
public void setupSession(EventFiringWebDriver eventFiringWebDriver, DesktopWebDriverRequest request) {
final String browser = request.getBrowser();
// add event listeners
eventFiringWebDriver.register(new VisualEventDriverListener());
eventFiringWebDriver.register(new EventLoggingEventDriverListener());
/*
start StopWatch
*/
StopWatch.startPageLoad(eventFiringWebDriver);
WebDriverManagerConfig config = WebDriverManager.getConfig();
WebDriver.Window window = eventFiringWebDriver.manage().window();
/*
Maximize
*/
if (config.shouldMaximizeViewport()) {
log().debug("Trying to maximize window");
try {
Dimension originWindowSize = window.getSize();
// Maximize to detect window size
window.maximize();
if (config.getMaximizePosition() != Position.CENTER) {
log().debug(String.format("Setting maximized window position to: %s", config.getMaximizePosition()));
Point targetPosition = new Point(0, 0);
switch (config.getMaximizePosition()) {
case LEFT:
targetPosition.x = -originWindowSize.width;
break;
case RIGHT:
targetPosition.x = window.getSize().width + 1;
break;
case TOP:
targetPosition.y = -originWindowSize.height;
break;
case BOTTOM:
targetPosition.y = window.getSize().height + 1;
break;
}
log().debug(String.format("Move window to: %s", targetPosition));
window.setPosition(targetPosition);
// Re-maximize
window.maximize();
}
} catch (Throwable t1) {
log().error("Could not maximize window", t1);
setWindowSizeBasedOnDisplayResolution(window, browser);
}
} else {
setWindowSizeBasedOnDisplayResolution(window, browser);
}
if (!Browsers.safari.equalsIgnoreCase(browser)) {
int pageLoadTimeout = Constants.PAGE_LOAD_TIMEOUT_SECONDS;
int scriptTimeout = PropertyManager.getIntProperty(TesterraProperties.WEBDRIVER_TIMEOUT_SECONDS_SCRIPT, 120);
try {
eventFiringWebDriver.manage().timeouts().pageLoadTimeout(pageLoadTimeout, TimeUnit.SECONDS);
} catch (Exception e) {
log().error("Could not set Page Load Timeout", e);
}
try {
eventFiringWebDriver.manage().timeouts().setScriptTimeout(scriptTimeout, TimeUnit.SECONDS);
} catch (Exception e) {
log().error("Could not set Script Timeout", e);
}
} else {
log().warn("Not setting timeouts for Safari.");
}
}
private void setWindowSizeBasedOnDisplayResolution(WebDriver.Window window, String browser) {
log().debug("Trying to set window size to: " + Defaults.DISPLAY_RESOLUTION);
String[] split = Defaults.DISPLAY_RESOLUTION.split("x");
int width = Integer.parseInt(split[0]);
int height = Integer.parseInt(split[1]);
try {
window.setSize(new Dimension(width, height));
} catch (Throwable t2) {
log().error("Could not set window size", t2);
if (Browsers.edge.equals(browser)) {
log().debug("Edge Browser was requested, trying a second workaround");
Timer timer = new Timer(500, 5000);
ThrowablePackedResponse
© 2015 - 2025 Weber Informatics LLC | Privacy Policy