Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import org.openqa.selenium.Capabilities;
- import org.openqa.selenium.chrome.ChromeDriver;
- import org.openqa.selenium.firefox.FirefoxDriver;
- import org.openqa.selenium.firefox.FirefoxOptions;
- import org.openqa.selenium.firefox.FirefoxProfile;
- import org.openqa.selenium.remote.DesiredCapabilities;
- import org.openqa.selenium.remote.RemoteWebDriver;
- import org.slf4j.Logger;
- import java.net.URL;
- import java.util.concurrent.LinkedTransferQueue;
- import java.util.concurrent.TimeUnit;
- import java.util.concurrent.atomic.AtomicBoolean;
- import java.util.concurrent.atomic.AtomicInteger;
- import static com.codeborne.selenide.WebDriverRunner.CHROME;
- import static com.codeborne.selenide.WebDriverRunner.FIREFOX;
- /**
- * Pool of {@link RemoteWebDriver} objects for reusing existing RemoteWebDriver sessions in web tests
- * The number of available nodes is taken from the file of available quotas (grid-router).
- * If the browser version is not specified, is used the default version for the specified browser
- * from the quota configuration file is taken.
- * The {@link Quota} object and internal objects were generated by pojo
- *
- * Created by Shaburov Oleg on 24.09.2017.
- * shaburov.o.a@gmail.com
- */
- public class SelenoidWebDriverPool {
- private Logger log;
- private LinkedTransferQueue<RemoteWebDriver> pool = new LinkedTransferQueue<>();
- private long timeout = 2;
- private TimeUnit unit = TimeUnit.SECONDS;
- private AtomicInteger availableNodes = new AtomicInteger(1);
- private AtomicBoolean isCanCreate = new AtomicBoolean(true);
- private AtomicBoolean hasWD = new AtomicBoolean(false);
- private URL address;
- private Capabilities capabilities;
- /**
- * The class constructor for the remote to run a Web test by means of grid-router
- */
- public SelenoidWebDriverPool(Logger logger, URL remoteAddress, Capabilities desiredCapabilities) {
- log = logger;
- address = remoteAddress;
- capabilities = desiredCapabilities;
- calculateAvailableNodes();
- }
- /**
- * The constructor for a local test run
- */
- public SelenoidWebDriverPool(Logger logger, String browser) {
- log = logger;
- try {
- log.info("Preparing a web driver for local startup: " + browser);
- switch (browser) {
- case CHROME:
- availableNodes.decrementAndGet();
- add(new ChromeDriver());
- break;
- case FIREFOX:
- FirefoxProfile firefoxProfile = new FirefoxProfile();
- firefoxProfile.setAcceptUntrustedCertificates(true);
- firefoxProfile.setAssumeUntrustedCertificateIssuer(true);
- DesiredCapabilities dc = new FirefoxOptions()
- .setProfile(firefoxProfile).addTo(DesiredCapabilities.firefox());
- availableNodes.decrementAndGet();
- add(new FirefoxDriver(dc));
- break;
- default:
- throw new TestFrameworkException("An unsupported web browser is received: " +
- BaseConfig.getBrowser());
- }
- } catch (Exception e) {
- throw new TestFrameworkException("Error initializing the web browser: " +
- BaseConfig.getBrowser(), e);
- }
- }
- /**
- * The method gets a list of available nodes from the quota file and
- * calculates the available nodes based on the browser and its version
- */
- private void calculateAvailableNodes() {
- availableNodes.set(0);
- int nodes = 0;
- Quota quota = new Quota("src/main/resources/gridrouter/quota/guest.xml");
- String browserVersion = "";
- for (Browser browser : quota.getBrowser()) {
- if (browser.getName().toLowerCase().equals(capabilities.getBrowserName().toLowerCase())) {
- for (Version version : browser.getVersion()) {
- if (capabilities.getVersion() == null || capabilities.getVersion().isEmpty()) {
- browserVersion = browser.getDefaultVersion();
- }
- if (version.getNumber().startsWith(browserVersion)) {
- for (Region region : version.getRegion()) {
- for (Host host : region.getHost()) {
- int nodeCount = Integer.valueOf(host.getCount());
- if (nodeCount > 0) {
- nodes += nodeCount;
- }
- }
- }
- }
- }
- }
- }
- availableNodes.set(nodes);
- if (availableNodes.compareAndSet(0, 0)) {
- throw new TestFrameworkException("The grid-router does not contain nodes for the " +
- capabilities.getBrowserName() + "browser version " + browserVersion);
- }
- log.info("For {} version {} is available {} nodes",
- capabilities.getBrowserName(), browserVersion, availableNodes);
- }
- /**
- * Method for obtaining a free web driver from the pool.
- */
- public RemoteWebDriver get(String methodName) {
- if (hasWD.compareAndSet(false, true)) {
- return create(methodName);
- }
- try {
- log.info("[{}] In the queue {} threads.", methodName, pool.getWaitingConsumerCount());
- log.info("[{}] Obtaining a web driver from the pool.", methodName);
- RemoteWebDriver driver = (RemoteWebDriver) pool.poll(timeout, unit);
- if (driver == null) {
- return create(methodName);
- }
- log.info("[{}] A web driver from the pool was received. SessionId={}",
- methodName, driver.getSessionId());
- return driver;
- } catch (InterruptedException e) {
- log.info("[{}] Interrupted expectation of web driver from the pool.", methodName);
- Thread.currentThread().interrupt();
- }
- return null;
- }
- /**
- * Method for creating a new web driver.
- */
- private RemoteWebDriver create(String methodName) {
- if (isCanCreate.compareAndSet(true, false)) {
- if (pool.isEmpty() && availableNodes.get() > 0) {
- try {
- log.info("[{}] Creating a New Web Driver", methodName);
- RemoteWebDriver driver = new RemoteWebDriver(address, capabilities);
- availableNodes.decrementAndGet();
- isCanCreate.set(true);
- log.info("[{}] The web driver was successfully created. SessionId={}",
- methodName, driver.getSessionId());
- return driver;
- } finally {
- isCanCreate.set(true);
- }
- } else {
- log.info("[{}] Created the maximum number of web-drivers.", methodName);
- isCanCreate.set(false);
- }
- }
- return get(methodName);
- }
- /**
- * Adds {@link RemoteWebDriver} object to the pool
- */
- private void add(RemoteWebDriver webDriver) {
- pool.add(webDriver);
- log.info("The web driver was successfully added to the pool. SessionId={}",
- webDriver.getSessionId());
- }
- /**
- * Returns a previously occupied {@link RemoteWebDriver} object to the pool
- */
- public void release(RemoteWebDriver webDriver, String method) {
- pool.add(webDriver);
- log.info("[{}] The web driver was successfully returned to the pool. " +
- "SessionId={}", method, webDriver.getSessionId());
- }
- /**
- * The method of completing all RemoteWebDriver sessions in the pool.
- */
- public void shutdown() {
- pool.forEach(wd -> {
- String sid = wd.getSessionId().toString();
- try {
- wd.quit();
- log.info("The browser is closed. SessionId={}", sid);
- } catch (Exception e) {
- log.error("Error when trying to close your web browser. SessionId={}", sid, e);
- }
- });
- }
- public void setTimeout(long timeout, TimeUnit unit) {
- this.timeout = timeout;
- this.unit = unit;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement