Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2017
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.17 KB | None | 0 0
  1. import org.openqa.selenium.Capabilities;
  2. import org.openqa.selenium.chrome.ChromeDriver;
  3. import org.openqa.selenium.firefox.FirefoxDriver;
  4. import org.openqa.selenium.firefox.FirefoxOptions;
  5. import org.openqa.selenium.firefox.FirefoxProfile;
  6. import org.openqa.selenium.remote.DesiredCapabilities;
  7. import org.openqa.selenium.remote.RemoteWebDriver;
  8. import org.slf4j.Logger;
  9.  
  10. import java.net.URL;
  11. import java.util.concurrent.LinkedTransferQueue;
  12. import java.util.concurrent.TimeUnit;
  13. import java.util.concurrent.atomic.AtomicBoolean;
  14. import java.util.concurrent.atomic.AtomicInteger;
  15.  
  16. import static com.codeborne.selenide.WebDriverRunner.CHROME;
  17. import static com.codeborne.selenide.WebDriverRunner.FIREFOX;
  18.  
  19. /**
  20. * Pool of {@link RemoteWebDriver} objects for reusing existing RemoteWebDriver sessions in web tests
  21. * The number of available nodes is taken from the file of available quotas (grid-router).
  22. * If the browser version is not specified, is used the default version for the specified browser
  23. * from the quota configuration file is taken.
  24. * The {@link Quota} object and internal objects were generated by pojo
  25. *
  26. * Created by Shaburov Oleg on 24.09.2017.
  27. * shaburov.o.a@gmail.com
  28. */
  29. public class SelenoidWebDriverPool {
  30.  
  31. private Logger log;
  32.  
  33. private LinkedTransferQueue<RemoteWebDriver> pool = new LinkedTransferQueue<>();
  34. private long timeout = 2;
  35. private TimeUnit unit = TimeUnit.SECONDS;
  36.  
  37. private AtomicInteger availableNodes = new AtomicInteger(1);
  38. private AtomicBoolean isCanCreate = new AtomicBoolean(true);
  39. private AtomicBoolean hasWD = new AtomicBoolean(false);
  40.  
  41. private URL address;
  42. private Capabilities capabilities;
  43.  
  44. /**
  45. * The class constructor for the remote to run a Web test by means of grid-router
  46. */
  47. public SelenoidWebDriverPool(Logger logger, URL remoteAddress, Capabilities desiredCapabilities) {
  48. log = logger;
  49. address = remoteAddress;
  50. capabilities = desiredCapabilities;
  51. calculateAvailableNodes();
  52. }
  53.  
  54. /**
  55. * The constructor for a local test run
  56. */
  57. public SelenoidWebDriverPool(Logger logger, String browser) {
  58. log = logger;
  59. try {
  60. log.info("Preparing a web driver for local startup: " + browser);
  61. switch (browser) {
  62. case CHROME:
  63. availableNodes.decrementAndGet();
  64. add(new ChromeDriver());
  65. break;
  66. case FIREFOX:
  67. FirefoxProfile firefoxProfile = new FirefoxProfile();
  68. firefoxProfile.setAcceptUntrustedCertificates(true);
  69. firefoxProfile.setAssumeUntrustedCertificateIssuer(true);
  70. DesiredCapabilities dc = new FirefoxOptions()
  71. .setProfile(firefoxProfile).addTo(DesiredCapabilities.firefox());
  72. availableNodes.decrementAndGet();
  73. add(new FirefoxDriver(dc));
  74. break;
  75. default:
  76. throw new TestFrameworkException("An unsupported web browser is received: " +
  77. BaseConfig.getBrowser());
  78. }
  79. } catch (Exception e) {
  80. throw new TestFrameworkException("Error initializing the web browser: " +
  81. BaseConfig.getBrowser(), e);
  82. }
  83. }
  84.  
  85. /**
  86. * The method gets a list of available nodes from the quota file and
  87. * calculates the available nodes based on the browser and its version
  88. */
  89. private void calculateAvailableNodes() {
  90. availableNodes.set(0);
  91. int nodes = 0;
  92. Quota quota = new Quota("src/main/resources/gridrouter/quota/guest.xml");
  93. String browserVersion = "";
  94. for (Browser browser : quota.getBrowser()) {
  95. if (browser.getName().toLowerCase().equals(capabilities.getBrowserName().toLowerCase())) {
  96. for (Version version : browser.getVersion()) {
  97. if (capabilities.getVersion() == null || capabilities.getVersion().isEmpty()) {
  98. browserVersion = browser.getDefaultVersion();
  99. }
  100. if (version.getNumber().startsWith(browserVersion)) {
  101. for (Region region : version.getRegion()) {
  102. for (Host host : region.getHost()) {
  103. int nodeCount = Integer.valueOf(host.getCount());
  104. if (nodeCount > 0) {
  105. nodes += nodeCount;
  106. }
  107. }
  108. }
  109. }
  110. }
  111. }
  112. }
  113. availableNodes.set(nodes);
  114. if (availableNodes.compareAndSet(0, 0)) {
  115. throw new TestFrameworkException("The grid-router does not contain nodes for the " +
  116. capabilities.getBrowserName() + "browser version " + browserVersion);
  117. }
  118. log.info("For {} version {} is available {} nodes",
  119. capabilities.getBrowserName(), browserVersion, availableNodes);
  120. }
  121.  
  122. /**
  123. * Method for obtaining a free web driver from the pool.
  124. */
  125. public RemoteWebDriver get(String methodName) {
  126. if (hasWD.compareAndSet(false, true)) {
  127. return create(methodName);
  128. }
  129. try {
  130. log.info("[{}] In the queue {} threads.", methodName, pool.getWaitingConsumerCount());
  131. log.info("[{}] Obtaining a web driver from the pool.", methodName);
  132. RemoteWebDriver driver = (RemoteWebDriver) pool.poll(timeout, unit);
  133. if (driver == null) {
  134. return create(methodName);
  135. }
  136. log.info("[{}] A web driver from the pool was received. SessionId={}",
  137. methodName, driver.getSessionId());
  138. return driver;
  139. } catch (InterruptedException e) {
  140. log.info("[{}] Interrupted expectation of web driver from the pool.", methodName);
  141. Thread.currentThread().interrupt();
  142. }
  143. return null;
  144. }
  145.  
  146. /**
  147. * Method for creating a new web driver.
  148. */
  149. private RemoteWebDriver create(String methodName) {
  150. if (isCanCreate.compareAndSet(true, false)) {
  151. if (pool.isEmpty() && availableNodes.get() > 0) {
  152. try {
  153. log.info("[{}] Creating a New Web Driver", methodName);
  154. RemoteWebDriver driver = new RemoteWebDriver(address, capabilities);
  155. availableNodes.decrementAndGet();
  156. isCanCreate.set(true);
  157. log.info("[{}] The web driver was successfully created. SessionId={}",
  158. methodName, driver.getSessionId());
  159. return driver;
  160. } finally {
  161. isCanCreate.set(true);
  162. }
  163. } else {
  164. log.info("[{}] Created the maximum number of web-drivers.", methodName);
  165. isCanCreate.set(false);
  166. }
  167. }
  168. return get(methodName);
  169. }
  170.  
  171. /**
  172. * Adds {@link RemoteWebDriver} object to the pool
  173. */
  174. private void add(RemoteWebDriver webDriver) {
  175. pool.add(webDriver);
  176. log.info("The web driver was successfully added to the pool. SessionId={}",
  177. webDriver.getSessionId());
  178. }
  179.  
  180. /**
  181. * Returns a previously occupied {@link RemoteWebDriver} object to the pool
  182. */
  183. public void release(RemoteWebDriver webDriver, String method) {
  184. pool.add(webDriver);
  185. log.info("[{}] The web driver was successfully returned to the pool. " +
  186. "SessionId={}", method, webDriver.getSessionId());
  187. }
  188.  
  189. /**
  190. * The method of completing all RemoteWebDriver sessions in the pool.
  191. */
  192. public void shutdown() {
  193. pool.forEach(wd -> {
  194. String sid = wd.getSessionId().toString();
  195. try {
  196. wd.quit();
  197. log.info("The browser is closed. SessionId={}", sid);
  198. } catch (Exception e) {
  199. log.error("Error when trying to close your web browser. SessionId={}", sid, e);
  200. }
  201. });
  202. }
  203.  
  204. public void setTimeout(long timeout, TimeUnit unit) {
  205. this.timeout = timeout;
  206. this.unit = unit;
  207. }
  208.  
  209. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement