{"id":7609,"date":"2023-08-30T11:48:16","date_gmt":"2023-08-30T11:48:16","guid":{"rendered":"https:\/\/www.intexsoft.com\/?post_type=blog&#038;p=7609"},"modified":"2023-08-30T11:57:33","modified_gmt":"2023-08-30T11:57:33","slug":"selenide-test-automation-using-selenoid-in-the-docker-container","status":"publish","type":"blog","link":"https:\/\/intexsoft.com\/blog\/selenide-test-automation-using-selenoid-in-the-docker-container\/","title":{"rendered":"Selenide Test Automation: Using Selenoid in the Docker Container"},"content":{"rendered":"<section  class=\"hero hero-blog \">\n\t<div class=\"content\">\n\t\t\t\t\t<div class=\"hero__overlay\"><\/div>\n\t\t\t\t<div class=\"hero__container\">\n\t\t\t<a href=\"https:\/\/intexsoft.com\/blog\/\">\n\t\t\t\t<div class=\"hero-blog-btn\">\n\t\t\t\t\t\n\t\t\t\t<\/div>\n\t\t\t<\/a>\n\t\t\t<div class=\"hero-blog-date-author\"> August 30, 2023 \u2022 by \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tDora &amp;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tMargarita \n\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<h1 class=\"hero__title \">Selenide Test Automation: Using Selenoid in the Docker Container<\/h1>\n\t\t\t\t\t\t\t\t\t\t<div class=\"hero-blog-categories\">\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"hero-blog-category\" data-id=\"18\" data-parent=\"0\">\n\t\t\t\t\t\t\tTech Staff\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<div class=\"hero-blog-image\">\n\t\t\t\t<picture>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<source srcset=\"https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/360\u0445510-SELENIDE-TEST-AUTOMATION.jpg\" media=\"(max-width: 480px)\">\n\t\t\t\t\t<source srcset=\"https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/768\u0445773-SELENIDE-TEST-AUTOMATION.jpg\" media=\"(max-width: 992px)\">\n\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/1920x568-SELENIDE-TEST-AUTOMATION.jpg\" loading=\"lazy\" alt=\"image\">\n\t\t\t\t<\/picture>\n\t\t\t<\/div>\n\t\t\t<\/div>\n<\/section>\n\t\t\t\t\t\t\t\n\t\t\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-1 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:66.66%\"><section id=\"\"\n\t\t\t\t\t class=\"custom-wysiwyg-editor wysiwyg-portfolio \">\n\t\t<div class=\"content\">\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"custom-wysiwyg-editor__summary\">\n\t\t\t\t\t\t<p>This article covers a basic Selenium project, including integrating TestNG and implementing a Page Object pattern. It also explores the features and benefits of Selenide, demonstrating its usage for elements, assertions, and waits. You will know how to incorporate the Selenoid framework to execute tests within or outside Docker containers.<\/p>\n<p>Reading time: 36 min.<\/p>\n\n\t\t\t\t\t<\/div>\n\t\t\t\t\n\t\t\t\t<div class=\"custom-wysiwyg-editor__anchors\">\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">QA teams face an ongoing challenge to meet the increasing demands of software testing in today&#8217;s ever-evolving technological landscape. The need for efficient and reliable test automation solutions has become paramount. Enter Selenide Test Automation, a groundbreaking framework transforming QA professionals&#8217; approach to testing.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">At its core, Selenide Test Automation represents a significant shift in the software testing world. It offers an intuitive and streamlined approach to automate web application testing, enabling QA teams to achieve exceptional efficiency, accuracy, and speed in their testing processes. By harnessing the power of Selenide, QA professionals can elevate their testing efforts, ensuring the delivery of high-quality software products in record time.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Selenide Test Automation is a cutting-edge framework built on top of Selenium, a widely adopted automation tool for web browsers. It takes the Selenium experience to the next level by providing a simplified API, making it accessible for professional and personal usage. This means QA professionals no longer need to struggle with complex and lengthy code. Instead, they can write clean, concise, and highly readable test scripts that are easier to maintain and understand.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Equipped with a comprehensive set of features, Selenide Test Automation enhances the testing endeavors of QA professionals. Built-in assertions and smart waits eliminate the challenges of manual waiting and troubleshooting flaky tests. Selenide effortlessly handles dynamic elements, AJAX calls, and JavaScript-heavy applications, ensuring stable and robust test execution.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Furthermore, Selenide Test Automation seamlessly integrates with popular testing frameworks like TestNG and JUnit, enabling effective test management and reporting. The framework supports parallel test execution, empowering QA teams to leverage distributed environments or cloud-based platforms for faster and more efficient testing.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">To maximize the potential of Selenide, we explore the integration of Selenoid in Docker containers. This powerful combination grants QA teams unmatched flexibility, scalability, and portability in their test environments. Testers can easily manage and orchestrate their testing infrastructure by leveraging Docker containers, ensuring reliable test execution within controlled and isolated environments.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">In this article, we delve deep into the world of Selenide Test Automation, showcasing its transformative capabilities and the significant benefits it offers QA teams. We provide a comprehensive understanding of Selenide&#8217;s core concepts, simplified API, and unique features that position it as a game-changer in test automation. Additionally, we demonstrate the seamless integration of Selenoid in Docker containers, enabling the downloading binary and unlocking a new level of efficiency and scalability for your testing infrastructure.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Join us on this journey as we unveil the power and potential of Selenide Test Automation. Explore the remarkable benefits of this revolutionary framework and witness a significant improvement in test efficiency, accuracy, and overall software quality. With its intuitive and streamlined approach, Selenide Test Automation empowers QA teams to achieve outstanding results, confidently delivering high-quality software products. Embrace this robust implementation and revolutionize your QA efforts like never before.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n\n\t\t<\/div>\n\t<\/section>\n\n\n\n<section id=\"\" class=\"banner-mini schema-white \">\n\t\t<div class=\"banner-mini-content\">\n\t\t\t<div class=\"banner-mini-info\">\n\t\t\t\t\t\t\t\t\t<h3 class=\"banner-mini-title fg-title\">Lack of DevOps specilists?<\/h3>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"banner-mini-subtitle fg-subtext\">Deploy your product faster, decrease the time-to-market, and cut the overall project costs with IntexSoft<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/intexsoft.com\/devops-services\/\"  target=\"_self\"   class=\"banner-mini-link btn btn_color_primary banner__button\">See more<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t<picture class=\"banner-mini-image-picture\">\n\t\t\t\t\t\t\t\t<img decoding=\"async\" class=\"banner-mini-image\" loading=\"lazy\" src=\"https:\/\/intexsoft.com\/app\/uploads\/2020\/11\/workspace_lead_magnet.png\"\n\t\t\t\t\t\t alt=\"image\">\n\t\t\t<\/picture>\n\t\t<\/div>\n\t<\/section>\n\n\n<section id=\"\"\n\t\t\t\t\t class=\"custom-wysiwyg-editor wysiwyg-portfolio \">\n\t\t<div class=\"content\">\n\n\n\n\t\t\t\t\t\t\t\n\t\t\t\t<div class=\"custom-wysiwyg-editor__anchors\">\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<p><span style=\"color: #ffffff;\">.<\/span><\/p>\n<p><span style=\"color: #ffffff;\">.<\/span><\/p>\n<h3><span style=\"color: #000000;\">Selenium + TestNG. Selenium Maven<\/span><\/h3>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">We are considering a project build on the\u00a0<\/span><a href=\"https:\/\/maven.apache.org\/\" rel=\"nofollow\">Maven<\/a>\u00a0<span style=\"color: #000000;\">builder, so we can find the project structure description in the\u00a0<em>pom.xml<\/em>\u00a0file. To order use\u00a0<b>Selenium+TestNG<\/b>, we should add appropriate dependencies to\u00a0<em>pom.xml<\/em>\u00a0file. You can observe them between the\u00a0<i>dependencies<\/i>\u00a0tags below:<\/span><\/p>\n<p>&nbsp;<\/p>\n<pre class=\"blog-code\"><span style=\"color: #000000;\">                           &lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n                           &lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\"\r\n                                       xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\r\n                                       xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"&gt;\r\n                              &lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\r\n\r\n                              &lt;groupId&gt;test&lt;\/groupId&gt;\r\n                              &lt;artifactId&gt;test&lt;\/artifactId&gt;\r\n                              &lt;version&gt;1.0-SNAPSHOT&lt;\/version&gt;\r\n                              &lt;dependencies&gt;\r\n                                       &lt;dependency&gt;\r\n                                                &lt;groupId&gt;org.seleniumhq.selenium&lt;\/groupId&gt;\r\n                                                &lt;artifactId&gt;selenium-java&lt;\/artifactId&gt;\r\n                                                &lt;version&gt;3.141.59&lt;\/version&gt;\r\n                                      &lt;\/dependency&gt;\r\n                                      &lt;dependency&gt;\r\n                                                &lt;groupId&gt;org.testng&lt;\/groupId&gt;\r\n                                                &lt;artifactId&gt;testng&lt;\/artifactId&gt;\r\n                                                &lt;version&gt;6.14.3&lt;\/version&gt;\r\n                                                &lt;scope&gt;test&lt;\/scope&gt;\r\n                                     &lt;\/dependency&gt;\r\n                            &lt;\/dependencies&gt;\r\n                          &lt;\/project&gt;<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Here is the example of the Page Object:<\/span><\/p>\n<p>&nbsp;<\/p>\n<pre class=\"blog-code\"><span style=\"color: #000000;\">import...\r\n\r\npublic class SignUpPage {\r\n   private WebDriver driver;\r\n\r\n   public SignUpPage(WebDriver driver) { this.driver = driver; }\r\n\r\n   private By emailField = cssSelector(\"#register-email\");\r\n   private By confirmEmailField = cssSelector(\"#register-confirm-email\");\r\n   private By passwordField = cssSelector(\"#register-password\");\r\n   private By displayNameField = cssSelector(\"#register-displayname\");\r\n   private By monthDropDown = cssSelector(\"#register-dob-month\");\r\n   private By dayField = cssSelector(\"#register-dob-day\");\r\n   private By yearField = cssSelector(\"#register-dob-year\");\r\n   private By shareCheckbox = cssSelector(\"#register-thirdparty\");\r\n   private By registerButton = cssSelector(\"#register-button-email-submit\");\r\n\r\n   public SignUpPage typeEmail(String email) {\r\n\r\n\tdriver.findElement(emailField).sendKeys(email);\r\n      return this;\r\n  }\r\n  \r\n  public SignUpPage typeConfirmEmailField(String email) {...}\r\n\r\n  public SignUpPage typePassword(String password) {...}\r\n\r\n  public SignUpPage typeName(String name) {...}\r\n\r\n  public SignUpPage setMonth(String month) {...}\r\n \r\n  public SignUpPage typeDay(String day) {...}\r\n\r\n  public SignUpPage typeYear(String year) {...}\r\n<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">As we can see, there is a description of variables with locators for the elements of the registration page at the top of the java file. There are methods directly for interacting with elements of our page below the variable section.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Let\u2019s open the tests themselves:<\/span><\/p>\n<p>&nbsp;<\/p>\n<pre class=\"blog-code\"><span style=\"color: #000000;\">private WebDriver driver;\r\n\r\nprivate SignUpPage page;\r\n\r\n@BeforeMethod\r\npublic void setUp() {\r\nSystem.setProperty(\"webdriver.gecko.driver\", \r\n\"C:\\\\Users\\\\Nikita\\\\IdeaProjects\\\\autotests_examples\\\\drivers\\\\geckodriver.exe\");\r\ndriver = new FirefoxDriver();\r\ndriver.manage().timeouts().impicitlyWait(10, TimeUnit.SECONDS);\r\ndriver.get(\"https:\/\/www.spotify.com\/us\/signup\/\");\r\n}\r\n<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">As we can see, in the\u00a0<b>@BeforeMethod<\/b>\u00a0annotation we describe what will have before each method.<\/span><\/p>\n<p>&nbsp;<\/p>\n<pre class=\"blog-code\"><span style=\"color: #000000;\">@Test\r\npublic void typeInvalidYear() {\r\n     page = new SignUpPage(driver);\r\n     page.setMonth(\"December\");\r\n                 .typeDay(\"20\")\r\n                 .typeYear(\"85\")\r\n                 .setShare(true);\r\n      Assert.assertTrue(page.isErrorVisible(\"Please enter a valid year.\"));\r\n<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">The\u00a0<b>@Test<\/b>\u00a0annotation provides code for test methods.<\/span><\/p>\n<p>&nbsp;<\/p>\n<pre class=\"blog-code\"><span style=\"color: #000000;\">   @AfterMethod\r\n    public void tearDown() {\r\n        driver.quit();\r\n    }\r\n<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">The\u00a0<b>@AfterMethod<\/b>\u00a0annotation contains the code that should be executed after each method.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">When running tests using Selenium, the following will happen:<\/span><\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">Opening a separate browser window.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">Following the url.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">Test code execution.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">Closing browser session after each test case.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">When running the next test the same things will happen. It should be mentioned that running tests on Selenium is rather a resource-consuming process.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h3><span style=\"color: #000000;\">Selenide: what, where, and how<\/span><\/h3>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">So what is Selenide itself? What are its main features and advantages?<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">In short,\u00a0<a style=\"color: #000000;\" href=\"https:\/\/selenide.org\/index.html\">Selenide<\/a>\u00a0is a wrapper around Selenium WebDriver that makes it quick and easy to use when writing tests. At its core, Selenide is a tool for automating user actions in a browser, focused on the convenience and ease of implementing business logic in autotests in the user&#8217;s language, without being distracted by the technical details of working with the \u201cbrowser driver\u201d. For example, we do not need to focus on working with the waiting for elements in the process of automating testing of dynamic web applications, as well as on the implementation of high-level actions on elements.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Key and main advantages of Selenide:<\/span><\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">Concise jQuery-style syntax.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">Automatic handling of most problems with Ajax, waitings and timeouts.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">Automatic handling of browser lifecycle.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">Automatic creation of screenshots.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">The purpose of Selenide is to\u00a0<b>focus on the business logic<\/b>\u00a0of tests and not \u201cwaste\u201d mental energy on technical details.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h3><span style=\"color: #000000;\">Getting started with the Selenide aditional configuration<\/span><\/h3>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">To get started with the Selenide we need to add the Selenide dependency to the\u00a0<em>pom.xml\u00a0<\/em>file. Since we no longer need the Selenium dependency, we simply remove it.<\/span><\/p>\n<pre class=\"blog-code\"><span style=\"color: #000000;\">&lt;dependency&gt;\r\n             &lt;groupId&gt;com.codeborne&lt;\/groupId&gt;\r\n             &lt;artifactId&gt;selenide&lt;\/artifactId&gt;\r\n             &lt;version&gt;5.2.8&lt;\/version&gt;\r\n&lt;\/dependency&gt;\r\n<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">In order to start using Selenide in our project, we also need to make some imports. Here are the examples of import required classes:<\/span><\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\"><em>import static com.codeborne.selenide.Selenide.*;<\/em><\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\"><em>import static com.codeborne.selenide.Selectors.*;<\/em><\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\"><em>import static com.codeborne.selenide.Condition.*;<\/em><\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\"><em>import static com.codeborne.selenide.CollectionCondition.*;<\/em><\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">For more information on how to connect Selenide using the rest of the project builders, see the\u00a0<a style=\"color: #000000;\" href=\"https:\/\/selenide.org\/quick-start.html\" rel=\"nofollow\">Quick start<\/a>\u00a0section of Selenide documentation.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h3><span style=\"color: #000000;\">Working with elements, assertions, and waits<\/span><\/h3>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Let&#8217;s move on to the Selenide elements and consider the assertions and waits available in Selenide.<\/span><\/p>\n<p>&nbsp;<\/p>\n<pre class=\"blog-code\"><span style=\"color: #000000;\">import...\r\n\r\npublic class SignUpTest {\r\n\r\nprivate SignUpPage page;\r\n\r\n   @BeforeClass\r\n   public static void setUp() {\r\n\r\n\t   baseurl = \"https:\/\/www.spotify.com\";\r\n       \r\n       browser = \"chrome\";\r\n       \r\n   }\r\n<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">We replace the\u00a0<b>BeforeMethod<\/b>\u00a0annotation with the\u00a0<b>BeforeClass<\/b>\u00a0annotation in the test file since we no longer need it. Selenide eliminates the need to write\u00a0<em>Before\u00a0<\/em>and\u00a0<em>After<\/em>\u00a0methods as Selenide takes care of the\u00a0<em>AfterMethod<\/em>\u00a0function. We only have the\u00a0<b>BeforeClass<\/b>\u00a0annotation left to register a pair of properties.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">We registered the\u00a0<em>property baseurl<\/em>, which is in the\u00a0<em>configuration class<\/em>\u00a0and in the BeforeClass annotation and it will be the base url. Therefore, the\u00a0<em>driver.get<\/em>\u00a0that we used in our Selenium tests is no longer needed. We set the browser on which we will run our tests in the\u00a0<em>property browser<\/em>.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">We can completely abandon the Selenium driver in our test project, Selenide will take care of all the work, encapsulating it in its classes. We will only have to focus on the logic of the tests themselves.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Let\u2019s proceed to using Selenide on our page:<\/span><\/p>\n<pre class=\"blog-code\"><span style=\"color: #000000;\">    \r\n    public SignUpPage open() {\r\n         \r\n         Selenide.open (relativeOrAbsoluteUrl: \"\/us\/signup\/\");\r\n         return this;\r\n    }\r\n    \r\n    public SignUpPage typeEmail(String email) {\r\n         \r\n         $(emailField).sendKeys(email);\r\n         return this;\r\n       \r\n   }\r\n<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">When invoking the open method, Selenide itself starts a browser session and opens a web page. Selenide also makes sure the browser is closed at the end. Within Selenide.<i>open<\/i>\u00a0we can write either the whole\u00a0<em>http<\/em>\u00a0url path, or we can write a\u00a0<em>relative url<\/em>. Since we indicated an absolute path as a\u00a0<i>baseurl<\/i>, within the Selenide.<em>open<\/em>\u00a0method it\u2019s enough to indicate just \u201c\/\u201d.<\/span><\/p>\n<p>&nbsp;<\/p>\n<pre class=\"blog-code\"><span style=\"color: #000000;\">public SignUpPage typeEmail(String email) {\r\n    \r\n    $(emailField.sendKeys(email);\r\n    return this;\r\n}\r\n\r\n\r\npublic SignUpPage typeConfirmEmailField(String email) {\r\n    \r\n    $(confirmEmailField).setValue(email);\r\n    return this;\r\n}\r\n<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">In order to find an element using Selenide, we should indicate $ instead of <em>driver.findElement<\/em> command used in Selenium. I.e using a one-character method we can find directly the element itself. The search method is accepted as a string, similar to the jQuery JavaScript library by default. This streamlined syntax enhances the readability and efficiency of writing Selenium tests with Selenide. Additionally, if no elements are found, Selenide returns a default value, eliminating the need for explicit null checks in the test code.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">In order to find a list of elements using Selenide, we should indicate $$ characters. Instead of List &lt;WebElement&gt;, we write the\u00a0<em>ElementsCollection<\/em>\u00a0command that is already extended with additional methods.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">To work with elements we can use both standard Selenium methods\u00a0<em>(sendKeys())<\/em>\u00a0and\u00a0<em>setValue()<\/em>\u00a0method or its short version\u00a0<em>v\u0430l()<\/em>.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">As we can see, Selenide methods are more understandable. Method\u00a0<em>click()<\/em>\u00a0remains the same, though Selenide has several click() methods:\u00a0<em>contextClick()<\/em>\u00a0(right mouse button imitation)\u00a0<em>doubleClick()<\/em>\u00a0( imitation of double click on element ) and so on. Having a certain element found, we can continue the search using other locators.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">The difference between Selenide\u00a0<em>find()<\/em>\u00a0method and Selenium\u00a0<em>driver.findElement(By)<\/em>\u00a0is that Selenide\u00a0<em>find()<\/em>\u00a0can immediately receive CSS selectors and operate with the Selenide elements, not the Web elements. Basically, Selenide-elements are a more \u201csmart\u201d alternative to Selenium web elements.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Selenide already contains those methods, which would have to be done through an\u00a0<em>action<\/em>\u00a0class or some other way. Selenide allows writing brief and \u201cnice\u201d methods that are understandable for everybody. Selenide is also rather flexible, and due to that we can use standard Selenium features.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #333333;\"><span style=\"color: #000000;\">You can find more information about Selenide methods in the<\/span>\u00a0<\/span><a href=\"https:\/\/selenide.org\/documentation.html\">official documentation<\/a><span style=\"color: #000000;\">.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Let\u2019s look into wider and more understandable verification examples provided by Selenide:<\/span><\/p>\n<p>&nbsp;<\/p>\n<pre class=\"blog-code\"><span style=\"color: #000000;\">        page.getError(\"Please enter a valid year.\").shouldBe(Condition.visible);\r\n\r\n        page.getError(\"When were you born?\").shouldNotBe(Condition.visible);\r\n\r\n        page.getErrors().shouldHave(CollectionCondition.size(6));\r\n\r\n        page.getErrorByNumber(3).shouldHave(Condition.text(\"Please enter your birth month.\"));\r\n<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Selenide verification scheme allows us to take any element, find it and use the following assertions for it: <em>should, shouldBe, shouldHave, shouldNot, shouldNotBe and shouldNotHave<\/em>. Depending on the logic and our needs, we use certain\u00a0<b>\u201cshould-methods\u201d<\/b>. When we want to check if the element exists, we use\u00a0<i>should(exist)<\/i>. When we want to check if the element is visible, we use <em>shouldBe(visible)<\/em> method and so on. In fact, we use only three assertions: should, shouldBe, shouldHave, or opposite to them <em>shouldNot, shouldNotBe, shouldNotHave<\/em>.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Verifications of elements and element collections on Selenide are carried out with the help of methods (assertions) described above. They play role of explicit waits in Selenide: they wait for a condition for a certain element to be satisfied.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Formulations in Selenide are quite logical and understandable. We can write our methods either using the development environment hints or using our logical assumptions. And of course, we can always take a look at the code for implementing the necessary methods described in the documentation, or we can look through the implementing of the method itself.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h3><span style=\"color: #000000;\">Automatic screenshots in tests<\/span><\/h3>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">For\u00a0<b>JUnit<\/b>:<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">In order to take a screenshot automatically after each failed test, we can make an import and indicate the Rule.<\/span><\/p>\n<p>&nbsp;<\/p>\n<pre class=\"blog-code\"><span style=\"color: #000000;\">import com.codeborne.selenide.junit.ScreenShooter;\r\n\r\n@Rule\r\npublic ScreenShooter makeScreenshotOnFailure = ScreenShooter.failedTests();\r\n<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">But in fact, it\u2019s a rudiment, since Selenide has been taking screenshots automatically when tests fail for quite a while. It\u2019s very convenient for error analysis. Selenide saves all the screenshots to a <em>build\/reports\/tests<\/em>\u00a0folder by default.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">In order to take a screenshot automatically of each test (even succeeded), we use the following command:<\/span><\/p>\n<p>&nbsp;<\/p>\n<pre class=\"blog-code\"><span style=\"color: #000000;\">@Rule \r\npublic ScreenShooter makeScreenshotOnFailure = ScreenShooter.failedTests().succeededTests();\r\n<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">For\u00a0<b>TestNG<\/b>\u00a0we also make an import:<\/span><\/p>\n<p>&nbsp;<\/p>\n<pre class=\"blog-code\"><span style=\"color: #000000;\">import com.codeborne.selenide.testng.ScreenShooter;\r\n\r\n@Listeners({ ScreenShooter.class})\r\n<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">In order to take screenshots automatically after succeeded test, we invoke the following command before running tests:<\/span><\/p>\n<p>&nbsp;<\/p>\n<pre class=\"blog-code\"><span style=\"color: #000000;\">ScreenShooter.captureSuccessfulTests = true;\r\n<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">We can also make a screenshot with a single line of code at any moment:<\/span><\/p>\n<p>&nbsp;<\/p>\n<pre class=\"blog-code\"><span style=\"color: #000000;\">import static com.codeborne.selenide.Selenide.screenshot;\r\n\r\nscreenshot(\"my_file_name\");\r\n<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Thus, Selenide will create two files<em>:\u00a0my_file_name.png<\/em>\u00a0and\u00a0<em>my_file_name.html<\/em><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3><span style=\"color: #000000;\">Docker: features and advantages of usage<\/span><\/h3>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Let\u2019s proceed to Docker itself and its advantages:<\/span><\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\"><strong>Rapid deployment<\/strong>: enables rapid deployment of applications and tools without the need for extensive setup. By running them in containers, you can quickly launch and manage the required components.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\"><strong>Convenient encapsulation<\/strong>: provides convenient encapsulation of applications, allowing you to package all the necessary dependencies, libraries, and configurations within a container. This encapsulation ensures consistent and reproducible environments for your applications, including the Selenoid container.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\"><strong>Clean monitoring<\/strong>: facilitates clean and streamlined monitoring of your applications. By running each application in its own container, you can easily monitor resource usage, logs, and performance metrics, ensuring efficient management and troubleshooting of issues.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\"><strong>Easy scaling<\/strong>: simplifies the process of scaling your applications. With containerization, you can easily replicate and distribute containers across multiple hosts or clusters, enabling seamless scaling to meet increased demand or workload.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">When discussing Docker, it&#8217;s essential to clarify a few key concepts:<\/span><\/p>\n<p><span style=\"color: #000000;\"><strong>Container<\/strong> is a running instance that encapsulates the necessary software, including the browser image, allowing for efficient and isolated execution of applications. Containers can be created, deleted, and recreated quickly within a short period of time.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\"><strong>Container image<\/strong> serves as the essential foundation for each container, encompassing all the requisite dependencies and configurations. This includes the incorporation of new images for browsers, ensuring the availability of the necessary components to execute the application within the container. By leveraging these container images, you can seamlessly set up and run your applications within isolated environments, guaranteeing consistency and reliability across different containers. The inclusion of new browser images further enhances the versatility and adaptability of the container, enabling you to tailor your testing environment to specific requirements and scenarios.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\"><strong>Docker Hub<\/strong>, the primary public Docker repository provided by Docker Inc., is a centralized source for a vast collection of container images. Within this repository, you&#8217;ll find a diverse range of &#8220;official&#8221; browser images developed by the Docker team or in collaboration with developers. These images are specifically designed to include essential components such as live browser screen, video recording capabilities, and other necessary functionalities. With these images, you can perform comprehensive testing and analysis, capturing recorded video files of the testing sessions for later review and evaluation. Docker Hub thus acts as a valuable resource for obtaining reliable and feature-rich container images that enhance your testing and analysis workflows.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">By granting appropriate execution permission to your containers, you ensure that they can run and execute the desired applications effectively. This permission allows the containers to access and utilize the necessary resources, interact with the operating system, and perform the required actions for successful application execution.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h3><span style=\"color: #000000;\">Docker installing<\/span><\/h3>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">To install Docker for Windows, we open the direct link\u00a0<\/span><a href=\"https:\/\/hub.docker.com\/\">https:\/\/hub.docker.com<\/a> <span style=\"color: #000000;\">and download the Docker Desktop app for Windows or MacOS. Ensure that you have Docker installed on your system to proceed with the installation. <\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">To install Docker for Ubuntu Linux, we need the\u00a0<em>sudo apt install docker.io<\/em>\u00a0command.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Then we need to run Docker and configure it to start automatically when the system boots by executing the following commands:<\/span><\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">sudo systemctl start docker;<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">sudo systemctl enable docker.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h3><span style=\"color: #000000;\">Selenoid: features and advantages<\/span><\/h3>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/aerokube.com\/selenoid\/latest\/\">Selenoid<\/a> <span style=\"color: #000000;\">is a powerful server that excels in launching isolated browsers within Docker containers, eliminating the need for a centralized Selenium hub. This capability empowers you to effortlessly manage and control the browser instances required for your test automation, ensuring seamless execution and eliminating any dependencies on a centralized hub. With Selenoid, you gain control and flexibility to launch browsers within Docker containers, simplifying your testing infrastructure.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Advantages of Selenoid usage:<\/span><\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">Selenoid provides a single environment for the parallel launch of automated tests. It allows you to run tests concurrently on multiple browsers, maximizing efficiency and reducing test execution time. By leveraging Selenoid&#8217;s capabilities, you can achieve parallel testing and effectively scale your automation efforts.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">CM Selenoid allows running each browser in a separate container, which enables full isolation of the browser environment.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">CM Selenoid environment does not affect qualitative and continuous testing.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">Resources consumption and utilization: Selenoid enables to maintain a high load without additional waste of resources; in addition, all inactive containers are removed at the end of each session. Thus, the level of free memory is always appropriate.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">CM Selenoid requires little time and effort. And in fact it is done with the help of one command.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">Simultaneous support of multiple browser versions: this option is only available if you use Selenoid; several containers with the appropriate browsers are to be built.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">To address the challenges that may arise when running multiple browsers on the same machine within Selenium Grid, CM Selenoid offers a solution. In Selenium Grid, due to the OS-specific nature, the focus can only be on one window, leading to potential competition among windows. However, by utilizing Selenoid, each test can be run in a separate container. This eliminates the problem of windows competing for focus, ensuring smoother and more reliable test execution. With Selenoid, you can overcome these challenges and achieve better isolation and stability when running tests across multiple browsers.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">All available logs are accessed easily in CM Selenoid. There is also the possibility of integration with the ELK stack for faster collection and analysis of current log files.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h3><span style=\"color: #000000;\">Aerocube Selenoid installation<\/span><\/h3>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Before installing Selenoid, there are a few prerequisites:<\/span><\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">Make sure you have recent Docker version installed (further we look into the usage of Selenoid together with Docker).<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">The simplest method to install Selenoid is by downloading the <a href=\"https:\/\/aerokube.com\/cm\/latest\/\" target=\"_blank\" rel=\"noopener\">Configuration Manager<\/a>, which facilitates the automatic installation of Aerokube products. Selenoid, being one of these products, can be effortlessly installed using this manager. By utilizing the Configuration Manager, you can streamline the process of setting up and starting Selenoid, ensuring a smooth and hassle-free deployment. Additionally, you can use the &#8220;docker pull&#8221; command to download and retrieve the necessary Selenoid Docker image for your installation. This allows you to efficiently retrieve the necessary components to run Selenoid, including the configuration files and video screen size settings.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">Rename the downloaded file to cm.exe (for easy interaction).<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">Run the following commands to start Selenoid UI: <\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\"><em>.\/cm.exe selenoid start &#8211;vnc<\/em><\/span><\/p>\n<p><span style=\"color: #000000;\"><em>.\/cm.exe selenoid-ui start<\/em><\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">The\u00a0<em>.\/cm.exe selenoid start &#8211;vnc<\/em> command will download the latest Selenoid version, browser container images, web driver binaries, generate configuration file and finally start Selenoid.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #333333;\">The\u00a0<em>.\/cm.exe selenoid-ui start<\/em>\u00a0command installs and starts\u00a0<b>Selenoid UI<\/b>. It is a user interface to track what\u2019s happening during the test execution.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Selenoid runs on standard Selenium 4444 port by default. We can redefine the port using the &#8211;port key.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Aerocube Selenoid was developed to work in big clusters, that\u2019s why it has no user interface. And that\u2019s why the attempt to open tests Endpoint http:\/\/localhost:4444\/wd\/hub will return a 404 error.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">However, with the VNC feature enabled, you can utilize remote desktop functionality to access and interact with the graphical interface of browsers that run Selenoid containers.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">This allows for convenient visualization and debugging of tests. <\/span><\/p>\n<p>&nbsp;<\/p>\n<h3><span style=\"color: #000000;\">Stat Selenoid UI<\/span><\/h3>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Selenoid UI is available at the link: http:\/\/localhost:8080\/<\/span><\/p>\n<p>&nbsp;<\/p>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8843 size-large\" src=\"https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/selenoid-stats-and-sessions-1024x456.png\" alt=\"\" width=\"1024\" height=\"456\" srcset=\"https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/selenoid-stats-and-sessions-1024x456.png 1024w, https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/selenoid-stats-and-sessions-300x134.png 300w, https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/selenoid-stats-and-sessions-768x342.png 768w, https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/selenoid-stats-and-sessions.png 1095w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Here we can see the current quota usage, pending browsers and the queue itself. Selenoid UI gets updates via SSE, so there is no need to renew the browser to see what is going on. It will reconnect automatically after any temporary failure.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">If we talk about simultaneous testing on different devices, e.g: we have a cross-platform web app with a real-life chat function, we can simultaneously test the interaction between them, that is obviously comfortable.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h3><span style=\"color: #000000;\">Selenoid UI capabilities<\/span><\/h3>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Selenoid UI has the following capabilities:<\/span><\/p>\n<p>&nbsp;<\/p>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8844 size-large\" src=\"https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/selenoid-ui-capabilities-1024x477.png\" alt=\"\" width=\"1024\" height=\"477\" srcset=\"https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/selenoid-ui-capabilities-1024x477.png 1024w, https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/selenoid-ui-capabilities-300x140.png 300w, https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/selenoid-ui-capabilities-768x358.png 768w, https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/selenoid-ui-capabilities-1536x716.png 1536w, https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/selenoid-ui-capabilities-2048x954.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">You can choose a browser from available browsers and UI will provide a setup example with the right capabilities. We can see from the screenshot that examples are available for several languages.<\/span><\/p>\n<p>&nbsp;<\/p>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8845 size-full\" src=\"https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/selenoid-UI-capabilities-2.png\" alt=\"\" width=\"962\" height=\"490\" srcset=\"https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/selenoid-UI-capabilities-2.png 962w, https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/selenoid-UI-capabilities-2-300x153.png 300w, https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/selenoid-UI-capabilities-2-768x391.png 768w\" sizes=\"(max-width: 962px) 100vw, 962px\" \/>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">With the selection of the browser, it could be launched manually right in the interface. While executing tests, we can connect to vnc port in a real-time regime, get access to the browser and even intervene in the process of autotests execution.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h3><span style=\"color: #000000;\">Logs and VNC<\/span><\/h3>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">If you use <em>enableVNC=true<\/em> capability, you can see a list of the available statistics. With VNC, you have the ability to see and interact with the browser directly, while the log will reflect all the actions performed within the browser. This feature provides a visual representation of the test execution process, allowing for real-time monitoring and interaction with the browser. By utilizing the VNC feature, you can gain valuable insights into the behavior and functionality of the browser. <\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">VNC session:<\/span><\/p>\n<p>&nbsp;<\/p>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8846 size-full\" src=\"https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/vnc-session.png\" alt=\"\" width=\"970\" height=\"494\" srcset=\"https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/vnc-session.png 970w, https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/vnc-session-300x153.png 300w, https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/vnc-session-768x391.png 768w\" sizes=\"(max-width: 970px) 100vw, 970px\" \/>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">VNC fullscreen mode:<\/span><\/p>\n<p>&nbsp;<\/p>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8847 size-full\" src=\"https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/vnc-full-screen.png\" alt=\"\" width=\"974\" height=\"496\" srcset=\"https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/vnc-full-screen.png 974w, https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/vnc-full-screen-300x153.png 300w, https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/vnc-full-screen-768x391.png 768w\" sizes=\"(max-width: 974px) 100vw, 974px\" \/>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Even without utilizing the VNC (Virtual Network Computing) flag, Selenoid provides the ability to access the logs of the Docker container for each Selenium session. This standalone binary feature allows you to view comprehensive logs, offering valuable insights into the execution and behavior of the containerized environment during test execution. By enabling centralized log storage, you can efficiently analyze and monitor the logs, gaining valuable information and facilitating troubleshooting and debugging processes. With access to detailed logs and the ability to view the live browser screen, you can effectively investigate issues, improve test reliability, and enhance overall test quality. This comprehensive logging capability in Selenoid empowers you to identify and address any issues that may arise during test execution, ensuring smoother and more reliable testing processes.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">In addition, it is worth noting that Selenoid is regularly updated to ensure compatibility with the recent version of Selenium. This ensures that you can leverage the latest features and enhancements available in the recent version of Selenoid, further optimizing your test automation efforts.<\/span><\/p>\n<p>&nbsp;<\/p>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8848 size-full\" src=\"https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/logs.png\" alt=\"\" width=\"928\" height=\"533\" srcset=\"https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/logs.png 928w, https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/logs-300x172.png 300w, https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/logs-768x441.png 768w\" sizes=\"(max-width: 928px) 100vw, 928px\" \/>\n<p>&nbsp;<\/p>\n<h2><span style=\"color: #000000;\">Video recorder image<\/span><\/h2>\n<p><span style=\"color: #000000;\">In addition to its powerful features, Aerokube Selenoid offers the capability to record videos of your test sessions. You can easily access these recorded videos by opening http:\/\/localhost:4444\/video\/ or by navigating to the &#8220;Videos&#8221; tab in the Selenoid user interface. This allows you to review and analyze the recorded test videos, gaining valuable insights into the behavior and interactions of your tests with the browser.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">The video recorder image provided by Selenoid captures the entire test session, including the video screen size, providing a comprehensive visual representation of the test execution process. This feature is particularly useful for debugging purposes, allowing you to identify any issues or unexpected behavior during test execution. <\/span><\/p>\n<p>&nbsp;<\/p>\n<h3><span style=\"color: #000000;\">Adding Selenoid to run tests within Docker container<\/span><\/h3>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">In order to add Selenoid into the\u00a0<b>@BeforeClass<\/b>\u00a0annotation we need to do the following configuration:<\/span><\/p>\n<p>&nbsp;<\/p>\n<pre class=\"blog-code\"><span style=\"color: #000000;\">Configuration.remote = \"http:\/\/localhost:4444\/wd\/hub\";\r\nConfiguration.browser = \"chrome\";\r\nConfiguration.browserSize = \"1920x1080\";\r\nDesiredCapabilities capabilities = new DesiredCapabilities();\r\ncapabilities.setCapability(capabilityName: \"enableVNC\", value: true);\r\ncapabilities.setCapability(capabilityName: \"enableVideo\", value: true);\r\nConfiguration.browserCapabilities = capabilities;\r\n<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Since now we have the\u00a0<i>Configuration.browser = &#8220;chrome&#8221;<\/i>\u00a0property, we delete\u00a0<i>Property baseurl<\/i>\u00a0which defined the browser for running our tests:<\/span><\/p>\n<p>&nbsp;<\/p>\n<pre class=\"blog-code\"><span style=\"color: #000000;\">@BeforeClass \r\npublic static void setUp() {\r\n       Configuration.remote = \"http:\/\/10.0.75.1:4444\/wd\/hub\";               \r\n       Configuration.browser = \"chrome\";          \r\n       Configuration.browserSize = \"1920x1080\";      \r\n       DesiredCapabilities capabilities = new DesiredCapabilities();     \r\n       capabilities.setCapability(capabilityName: \"enableVNC\", value: true);        \r\n       capabilities.setCapability(capabilityName: \"enableVideo\", value: true);      \r\n       Configuration.browserCapabilities = capabilities;\r\n\r\n<\/span><\/pre>\n\n\t\t<\/div>\n\t<\/section>\n\n\n\n<section id=\"\" class=\"banner-mini schema-gray \">\n\t\t<div class=\"banner-mini-content\">\n\t\t\t<div class=\"banner-mini-info\">\n\t\t\t\t\t\t\t\t\t<h3 class=\"banner-mini-title fg-title\">Drop us a line<\/h3>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"banner-mini-subtitle fg-subtext\">and we&#8217;ll do our best to make your project happen<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/intexsoft.com\/contact-us\/\"  target=\"_blank\"   class=\"banner-mini-link btn btn_color_primary banner__button\">Contact us<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t<picture class=\"banner-mini-image-picture\">\n\t\t\t\t\t\t\t\t<img decoding=\"async\" class=\"banner-mini-image\" loading=\"lazy\" src=\"https:\/\/intexsoft.com\/app\/uploads\/2022\/07\/Frame-348-1.png\"\n\t\t\t\t\t\t alt=\"image\">\n\t\t\t<\/picture>\n\t\t<\/div>\n\t<\/section>\n\n\n<section id=\"\"\n\t\t\t\t\t class=\"custom-wysiwyg-editor wysiwyg-portfolio \">\n\t\t<div class=\"content\">\n\n\n\n\t\t\t\t\t\t\t\n\t\t\t\t<div class=\"custom-wysiwyg-editor__anchors\">\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<h3 class=\"blog-code\"><span style=\"color: #000000;\">Run Selenoid advanced capabilities<\/span><\/h3>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">Data storage in RAM: Selenoid maximizes performance by utilizing Tmpfs, a temporary file repository that enables storing log files and other temporary data directly in RAM. This strategy yields advantages, as accessing data from RAM is significantly faster than accessing the hard drive file system. By leveraging RAM-based storage, Selenoid ensures efficient handling of log files and other temporary data, resulting in a testing environment that is highly responsive and optimized for speed. Experience the benefits of accelerated performance with Selenoid&#8217;s RAM-based storage approach.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">Various screen resolution types: we can configure the appropriate screen resolution for a running container on its own by setting the required parameters in the Browser Capabilities.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">Video recording of tests: it\u2019s possible to record the video of the tests performed. For instance, the activation in the Google Chrome browser is implemented by setting the parameter true in the\u00a0<em>Browser Capabilities:<\/em><\/span><br \/>\n<span style=\"color: #000000;\"><em>ChromeOptions options = new ChromeOptions ();<\/em><\/span><br \/>\n<span style=\"color: #000000;\"><em>options.setCapability (\u201cenableVideo\u201d, true);<\/em><\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h3><span style=\"color: #000000;\">ChromeOptions <\/span><\/h3>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">ChromeOptions is a versatile class provided by the Selenium WebDriver library that allows you to customize the behavior and configuration of the Chrome browser session during automated testing. With ChromeOptions, you gain granular control over various settings and preferences, enabling you to tailor the browser&#8217;s behavior to your specific testing requirements.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Using the new ChromeOptions, you can specify the following options:<\/span><\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\"><strong>Setting the browser&#8217;s startup arguments<\/strong>: You can define command-line arguments that modify Chrome&#8217;s behavior, such as disabling pop-up blocking or enabling headless mode.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\"><strong>Managing browser extensions<\/strong>: You can add or remove extensions from the Chrome browser during testing to simulate different user environments or test specific extension functionalities.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\"><strong>Controlling browser preferences<\/strong>: new ChromeOptions allows you to configure various browser preferences, such as language settings, default download directory, or disabling the cache.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\"><strong>Handling SSL certificates<\/strong>: You can set ChromeOptions to accept or reject SSL certificates, allowing you to test scenarios related to secure connections.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\"><strong>Configuring experimental options<\/strong>: ChromeOptions enables you to enable or disable experimental features or flags, providing access to cutting-edge browser functionalities.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">By leveraging the capabilities of the new ChromeOptions, you can take customization and fine-tuning of the Chrome browser to the next level, enabling you to achieve precise and extensive test coverage. One notable capability of ChromeOptions is the ability to set a custom test name for your test cases, providing meaningful identification of each test.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Additionally, when combined with Selenoid, you can further enhance your test automation efforts. Selenoid allows you to specify the Selenoid host, which provides a powerful and scalable environment for executing your tests. With Selenoid, you can manage specific browser behaviors, such as screen resolution and limit memory usage, to ensure reliable and efficient test execution.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">To further optimize your testing endeavors, make sure to grant execution permission to the necessary components and ensure proper resource allocation. This will enable smooth and uninterrupted test execution, enhancing the reliability and success of your testing processes.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">With the power of ChromeOptions, Selenoid, custom test name, configurable browser behaviors, and efficient resource utilization, you can elevate your test automation to new heights.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h3><span style=\"color: #000000;\">Using Selenoid without Docker<\/span><\/h3>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Selenoid uses containers to run browsers, but there are cases when it\u2019s not possible to run browser within a Docker container. Selenoid uses containers to run browsers, but there are cases like Internet Explorer on Windows when it\u2019s not possible to run browser within a Docker container. In such cases, Selenoid can be utilized to launch browsers like IE, Firefox, or Chrome on Windows. You can use Selenoid to run IE for your testing needs.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Selenoid leverages containers to execute browsers, but there are certain scenarios where running a browser within a Docker container is not feasible. For example, Internet Explorer (IE) on Windows cannot be run inside a Docker container. In such cases, Selenoid provides a solution by allowing the launch of browsers like IE, Firefox, or Chrome on Windows. With Selenoid, you can utilize IE for your testing requirements, ensuring compatibility and flexibility in your test environment. This enables you to perform parallel testing across different browsers and platforms, optimizing your testing processes and ensuring comprehensive test coverage. <\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">To do it we need:<\/span><\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">Download latest\u00a0<\/span><a href=\"http:\/\/www.seleniumhq.org\/download\/\" rel=\"nofollow\">IEDriverServer<\/a>\u00a0<span style=\"color: #000000;\">archive and unpack it to some directory (C:\\ in this example).<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">Download latest<\/span>\u00a0<a href=\"https:\/\/github.com\/aerokube\/selenoid\/releases\/latest\">Selenoid<\/a>\u00a0<span style=\"color: #000000;\">binary.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">Create\u00a0<em>browsers.json<\/em>\u00a0configuration file:<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<pre class=\"blog-code\"><span style=\"color: #000000;\">{ \r\n        \"internet explorer\": {\r\n          \"default\": \"11\",\r\n          \"versions\": {\r\n             \"11\": {\r\n                \"image\": [\"C:\\\\IEDriverServer.exe\", \"--log-level=DEBUG\"]\r\n              }\r\n           }\r\n        }\r\n     }<\/span><\/pre>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">Start Selenoid:<\/span><br \/>\n<span style=\"color: #000000;\"><em>.\/selenoid_win_amd64.exe -conf .\/browsers.json -disable-docker.<\/em><\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">Run the tests, using endpoint http:\/\/localhost:4444\/wd\/hub with the following capabilities:<\/span><br \/>\n<span style=\"color: #000000;\"><em>browserName = internet explorer<\/em><\/span><br \/>\n<span style=\"color: #000000;\"><em>version = 11.<\/em><\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">To start<\/span>\u00a0<a href=\"https:\/\/www.google.com\/chrome\/\">Chrome<\/a><span style=\"color: #000000;\">, just download<\/span>\u00a0<a href=\"https:\/\/sites.google.com\/a\/chromium.org\/chromedriver\/\">Chromedriver<\/a>\u00a0<span style=\"color: #000000;\">binary and modify browsers.json accordingly.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #000000;\">Selenoid does not process launched driver logs by default. So we need to launch Selenoid with the<em>\u00a0-capture-driver-logs\u00a0<\/em>flag to append driver logs for each session into the main log.<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">With the flexibility of additional configuration options and endpoint customization, Selenoid provides a robust and customizable environment for executing browser tests. Take advantage of these features to optimize your test execution and streamline your testing processes. <\/span><\/p>\n<p>&nbsp;<\/p>\n<h2><span style=\"color: #000000;\">Summarizing<\/span><\/h2>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Selenoid is a powerful solution based on Selenide + Selenoid in Docker containers, offering high flexibility for configuring the runtime environment, including testing software. This solution not only offers high flexibility for configuring your runtime environment, including testing software but also delivers efficiency. Experience the seamless integration of Selenide + Selenoid within Docker containers, empowering you to configure your environment effortlessly.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">Embrace the game-changing combination of Selenide + Selenoid and witness the solid stability, significant time savings, and multitude of additional features that will optimize your processes. With this powerful implementation, you can ensure the delivery of top-notch software products in record time, exceeding expectations at every step.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">By adopting the Selenide + Selenoid framework, you can supercharge your test automation tasks, leveraging the cutting-edge capabilities of these solutions. Seamlessly achieve accurate and efficient test automation, streamlining your QA workflow with ease and enabling the execution of custom tests tailored to your specific requirements.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000000;\">By choosing the Selenide + Selenoid framework, you open the door to benefits. Experience the ease of configuration, the unwavering reliability, and the substantial time savings that come with this powerful implementation. Elevate your testing process to new heights and witness remarkable results that will revolutionize your software development lifecycle.<\/span><\/p>\n\n\t\t<\/div>\n\t<\/section>\n\n\n\n<section id=\"\" class=\"authors \">\n\t\t<div class=\"content\">\n\t\t\t<div class=\"authors-container\">\n\t\t\t\t\t\t\t\t\t<h3 class=\"authors-title\">Written by<\/h3>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"authors-info\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"author\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"author-photo\">\n\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/intexsoft.com\/app\/uploads\/2021\/07\/Darya.jpg\" loading=\"lazy\" alt=\"image\">\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"author-info\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<h4 class=\"author-fullname\"> Dora<\/h4>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"author-position text-tn\"> Marketing Manager<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"author\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"author-photo\">\n\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/intexsoft.com\/app\/uploads\/2023\/04\/930_oooo.plus_.png\" loading=\"lazy\" alt=\"image\">\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"author-info\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<h4 class=\"author-fullname\"> Margarita <\/h4>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"author-position text-tn\"> Industry Expert<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t<\/section>\n\n\n\n<p><\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.33%\"><section class=\"favorite-posts\">\n\t\t\t<h3 class=\"favorite-posts-title\">FAVORITES OF THE MONTH<\/h3>\n\t\n\t\t\t<div class=\"favorite-posts-items\">\n\t\t\t\t\t\t\t\t\t\t\t<a class=\"favorite-posts-item\" href=\"https:\/\/intexsoft.com\/blog\/ai-in-ecommerce-how-technology-is-changing-the-way-we-shop\/\">\n\t\t\t\t\t<div class=\"favorite-posts-item-date-author\">March 6, 2024\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<h4 class=\"favorite-posts-item-title\">AI in Ecommerce: How Technology is Changing the Way We Shop<\/h4>\n\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<a class=\"favorite-posts-item\" href=\"https:\/\/intexsoft.com\/blog\/top-7-ecommerce-platforms-for-your-business\/\">\n\t\t\t\t\t<div class=\"favorite-posts-item-date-author\">April 3, 2024\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<h4 class=\"favorite-posts-item-title\">Top 7 Ecommerce Platforms For Your Business<\/h4>\n\t\t\t\t<\/a>\n\t\t\t\t\t<\/div>\n\t<\/section>\n\n<section class=\"contact-form-widget\">\n\t\t\t<h3 class=\"contact-form-widget-title\">Don&#039;t miss our updates<\/h3>\n\t\t\n\t\t\t\n<div class=\"wpcf7 no-js\" id=\"wpcf7-f3988-o1\" lang=\"en-US\" dir=\"ltr\">\n<div class=\"screen-reader-response\"><p role=\"status\" aria-live=\"polite\" aria-atomic=\"true\"><\/p> <ul><\/ul><\/div>\n<form action=\"\/wp-json\/wp\/v2\/blog\/7609#wpcf7-f3988-o1\" method=\"post\" class=\"wpcf7-form init mailchimp-ext-0.5.72 wpcf7-acceptance-as-validation\" aria-label=\"Contact form\" novalidate=\"novalidate\" data-status=\"init\">\n<div style=\"display: none;\">\n<input type=\"hidden\" name=\"_wpcf7\" value=\"3988\" \/>\n<input type=\"hidden\" name=\"_wpcf7_version\" value=\"5.9.6\" \/>\n<input type=\"hidden\" name=\"_wpcf7_locale\" value=\"en_US\" \/>\n<input type=\"hidden\" name=\"_wpcf7_unit_tag\" value=\"wpcf7-f3988-o1\" \/>\n<input type=\"hidden\" name=\"_wpcf7_container_post\" value=\"0\" \/>\n<input type=\"hidden\" name=\"_wpcf7_posted_data_hash\" value=\"\" \/>\n<input type=\"hidden\" name=\"_wpcf7_recaptcha_response\" value=\"\" \/>\n<\/div>\n<div class=\"custom-input_block\">\n    <label class=\"custom-placeholder\" for=\"email\"><\/label>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"email\"><input size=\"40\" maxlength=\"80\" class=\"wpcf7-form-control wpcf7-email wpcf7-validates-as-required wpcf7-text wpcf7-validates-as-email contacts__input\" id=\"email\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Enter your email...\" value=\"\" type=\"email\" name=\"email\" \/><\/span>\n<\/div>\n<div class=\"contacts__form-checkbox\">\n<span class=\"wpcf7-form-control-wrap\" data-name=\"privace-policy\"><span class=\"wpcf7-form-control wpcf7-acceptance\"><span class=\"wpcf7-list-item\"><label><input type=\"checkbox\" name=\"privace-policy\" value=\"1\" class=\"contacts__checkbox form__checkbox_color_grey\" id=\"privacy-cookie-policy\" aria-invalid=\"false\" \/><span class=\"wpcf7-list-item-label\"><label for=\"privacy-cookie-policy\" class=\"contacts__checkbox-subtitle blog\">\n        I agree to <a target=\"_blank\" href=\"\/privacy-policy\/\">Privacy<\/a> and <a target=\"_blank\" href=\"\/cookie-policy\/\">Cookie Policy*<\/a>\n  <\/label><\/span><\/label><\/span><\/span><\/span>\n<\/div>\n<button class=\"btn btn_color_primary\">\n  Send\n  <svg class=\"form-arrow\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n    <circle class=\"form-arrow__circle\" opacity=\"0.1\" cx=\"8\" cy=\"8\" r=\"7.33333\" stroke=\"white\" stroke-width=\"1.33333\"\/>\n    <circle class=\"form-arrow__circle form-arrow__circle-two\" opacity=\"0.1\" cx=\"8\" cy=\"8\" r=\"7.33333\" stroke=\"white\" stroke-width=\"1.33333\"\/>\n    <path class=\"form-arrow__path\" d=\"M7.33301 10.6665L9.99967 7.99984L7.33301 5.33317\" stroke=\"white\" stroke-width=\"1.33333\" stroke-linecap=\"square\"\/>\n    <path class=\"form-arrow__successful\" d=\"M5.33301 8.66357L7.00228 10.3328L11.335 5.99951\" stroke=\"white\" stroke-width=\"1.33333\" stroke-linecap=\"square\"\/>\n  <\/svg>\n<\/button><div class=\"wpcf7-response-output\" aria-hidden=\"true\"><\/div><p style=\"display: none !important\"><span class=\"wpcf7-form-control-wrap referer-page\"><input type=\"hidden\" name=\"referer-page\" value=\"http:\/\/intexsoft.com\/blog\/selenide-test-automation-using-selenoid-in-the-docker-container\/\" data-value=\"http:\/\/intexsoft.com\/blog\/selenide-test-automation-using-selenoid-in-the-docker-container\/\" class=\"wpcf7-form-control wpcf7-text referer-page\" aria-invalid=\"false\"><\/span><\/p>\n<!-- Chimpmatic extension by Renzo Johnson -->\n<\/form>\n<\/div>\n\n\t<\/section>\n\n\t\t\t\t<\/div>\n<\/div>\n\n\n<section id=\"\" class=\"related-posts  \">\n\t\t<div class=\"content\">\n\t\t\t\t\t\t\t<h2 class=\"section-title\">Related Posts<\/h2>\n\t\t\t\t\t\t<ul class=\"posts-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/intexsoft.com\/blog\/android-runtime-environment-dvm-vs-art\/\" class=\"our-blog__block-item\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"our-blog__block-item-image\">\n\t\t\t\t\t\t\t\t\t\t<picture>\n\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/intexsoft.com\/app\/uploads\/2021\/08\/640x400-Android_-DVM-vs-ART.jpg\" loading=\"lazy\" alt=\"image\" width=\"446\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t height=\"278\">\n\t\t\t\t\t\t\t\t\t\t<\/picture>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"our-blog__block-item-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"our-blog__block-item-content-date\">August 3, 2020<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<h3 class=\"our-blog__block-item-content-title\">Android Runtime Environment: DVM vs ART<\/h3>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"our-blog__block-item-content-subtitle\"> <p>In this article, we will talk about the Android runtime environment. Notably, we promise to be brief and explain in short ART and Dalvik (DVM) differences in Android.<\/p> <\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/intexsoft.com\/blog\/legacy-software-modernization\/\" class=\"our-blog__block-item\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"our-blog__block-item-image\">\n\t\t\t\t\t\t\t\t\t\t<picture>\n\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/intexsoft.com\/app\/uploads\/2021\/07\/640x400-Legacy-Software-Modernization-min.jpg\" loading=\"lazy\" alt=\"image\" width=\"446\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t height=\"278\">\n\t\t\t\t\t\t\t\t\t\t<\/picture>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"our-blog__block-item-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"our-blog__block-item-content-date\">December 7, 2020<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<h3 class=\"our-blog__block-item-content-title\">Legacy Software &amp; How to Deal with it?<\/h3>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"our-blog__block-item-content-subtitle\"> <p>Legacy is &#039;inheritance&#039;, and this inheritance is hard to deal with. Almost every developer has come through the project where the received code was written by someone else ten years ago.<\/p> <\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/intexsoft.com\/blog\/the-blockchain-explained-cryptocurrencies-exchanges-mining\/\" class=\"our-blog__block-item\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"our-blog__block-item-image\">\n\t\t\t\t\t\t\t\t\t\t<picture>\n\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/intexsoft.com\/app\/uploads\/2021\/08\/640x400-The-Blockchain-Explained_-Crytocurrencies-Exchanges-Mining-min.jpg\" loading=\"lazy\" alt=\"image\" width=\"446\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t height=\"278\">\n\t\t\t\t\t\t\t\t\t\t<\/picture>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"our-blog__block-item-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"our-blog__block-item-content-date\">March 19, 2020<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<h3 class=\"our-blog__block-item-content-title\">The Blockchain Explained: Cryptocurrencies, Exchanges &amp; Mining<\/h3>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"our-blog__block-item-content-subtitle\"> <p>The conversation around blockchain and databases has been going on for a long time, but not everyone understands what it is and how to work with it. That&#039;s why we have decided to explain everything in simple words and sort the key concepts out.<\/p> <\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/ul>\n\t\t<\/div>\n\t<\/section>\n","protected":false},"author":1,"template":"","blog_category":[18],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v22.9 (Yoast SEO v22.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Selenide Test Automation: Using Selenoid in the Docker Container - IntexSoft<\/title>\n<meta name=\"description\" content=\"Now we are going to take a look at a basic Selenium project and describe how to connect Selenium and TestNG.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/intexsoft.com\/blog\/selenide-test-automation-using-selenoid-in-the-docker-container\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Selenide Test Automation: Using Selenoid in the Docker Container\" \/>\n<meta property=\"og:description\" content=\"Now we are going to take a look at a basic Selenium project and describe how to connect Selenium and TestNG.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/intexsoft.com\/blog\/selenide-test-automation-using-selenoid-in-the-docker-container\/\" \/>\n<meta property=\"og:site_name\" content=\"IntexSoft\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-30T11:57:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/640x400-SELENIDE-TEST-AUTOMATION.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"640\" \/>\n\t<meta property=\"og:image:height\" content=\"400\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Selenide Test Automation: Using Selenoid in the Docker Container - IntexSoft","description":"Now we are going to take a look at a basic Selenium project and describe how to connect Selenium and TestNG.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/intexsoft.com\/blog\/selenide-test-automation-using-selenoid-in-the-docker-container\/","og_locale":"en_US","og_type":"article","og_title":"Selenide Test Automation: Using Selenoid in the Docker Container","og_description":"Now we are going to take a look at a basic Selenium project and describe how to connect Selenium and TestNG.","og_url":"https:\/\/intexsoft.com\/blog\/selenide-test-automation-using-selenoid-in-the-docker-container\/","og_site_name":"IntexSoft","article_modified_time":"2023-08-30T11:57:33+00:00","og_image":[{"width":640,"height":400,"url":"https:\/\/intexsoft.com\/app\/uploads\/2019\/11\/640x400-SELENIDE-TEST-AUTOMATION.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/intexsoft.com\/blog\/selenide-test-automation-using-selenoid-in-the-docker-container\/","url":"https:\/\/intexsoft.com\/blog\/selenide-test-automation-using-selenoid-in-the-docker-container\/","name":"Selenide Test Automation: Using Selenoid in the Docker Container - IntexSoft","isPartOf":{"@id":"https:\/\/intexsoft.com\/#website"},"datePublished":"2023-08-30T11:48:16+00:00","dateModified":"2023-08-30T11:57:33+00:00","description":"Now we are going to take a look at a basic Selenium project and describe how to connect Selenium and TestNG.","breadcrumb":{"@id":"https:\/\/intexsoft.com\/blog\/selenide-test-automation-using-selenoid-in-the-docker-container\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/intexsoft.com\/blog\/selenide-test-automation-using-selenoid-in-the-docker-container\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/intexsoft.com\/blog\/selenide-test-automation-using-selenoid-in-the-docker-container\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/intexsoft.com\/"},{"@type":"ListItem","position":2,"name":"Selenide Test Automation: Using Selenoid in the Docker Container"}]},{"@type":"WebSite","@id":"https:\/\/intexsoft.com\/#website","url":"https:\/\/intexsoft.com\/","name":"IntexSoft","description":"...","publisher":{"@id":"https:\/\/intexsoft.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/intexsoft.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/intexsoft.com\/#organization","name":"IntexSoft","url":"https:\/\/intexsoft.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/intexsoft.com\/#\/schema\/logo\/image\/","url":"https:\/\/intexsoft.com\/app\/uploads\/2021\/05\/Logo.png","contentUrl":"https:\/\/intexsoft.com\/app\/uploads\/2021\/05\/Logo.png","width":156,"height":33,"caption":"IntexSoft"},"image":{"@id":"https:\/\/intexsoft.com\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/intexsoft.com\/wp-json\/wp\/v2\/blog\/7609"}],"collection":[{"href":"https:\/\/intexsoft.com\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/intexsoft.com\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/intexsoft.com\/wp-json\/wp\/v2\/users\/1"}],"wp:attachment":[{"href":"https:\/\/intexsoft.com\/wp-json\/wp\/v2\/media?parent=7609"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/intexsoft.com\/wp-json\/wp\/v2\/blog_category?post=7609"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}