Java 多线程Selenium Web驱动程序与Selenium网格

Java 多线程Selenium Web驱动程序与Selenium网格,java,multithreading,selenium,selenium-webdriver,selenium-grid,Java,Multithreading,Selenium,Selenium Webdriver,Selenium Grid,我是Selenium的新手,正在使用Selenium在维护会话的同时导航到同一网站的多个页面。我可以通过以下两种方式创建控制器: 控制器在多线程环境中启动Selenium WebDriver(每个线程一个驱动程序实例,因为WebDriver不是线程安全的。参考:) 控制器使用硒网格 我了解Selenium网格通过使用中心节点概念支持分布式执行;但与选项1相比,我将获得哪些主要好处 我看到人们使用选项1,但面临一些问题。参考: 是否建议在多线程环境中使用Grid over Selenium Web

我是Selenium的新手,正在使用Selenium在维护会话的同时导航到同一网站的多个页面。我可以通过以下两种方式创建控制器:

  • 控制器在多线程环境中启动Selenium WebDriver(每个线程一个驱动程序实例,因为WebDriver不是线程安全的。参考:)
  • 控制器使用硒网格
  • 我了解Selenium网格通过使用中心节点概念支持分布式执行;但与选项1相比,我将获得哪些主要好处

    我看到人们使用选项1,但面临一些问题。参考:

    是否建议在多线程环境中使用Grid over Selenium WebDriver?若然,原因为何?
    另外,Selenium Grid是否会负责清理其节点中任何过时的浏览器实例(开箱即用)?

    我感觉您误解了WebDriver、Grid和多线程环境的用途

    SeleniumWebDriver只是一个在浏览器上启动测试的测试框架。它使用geckodriver和chromedriver等驱动程序打开(和关闭)浏览器实例,然后通过操作点击这些实例

    Selenium Grid是一个独立的服务器,它将在节点上远程运行WebDriver测试并返回报告。因此,如果您想使用其他机器资源来运行您的测试套件,您可以这样做。它还允许您通过为每个机器分配一个节点来组合多个机器资源,Selenium网格将均匀地分布您的测试


    至于你关于多线程的问题

    是否建议在多线程环境中使用Grid over Selenium WebDriver

    Grid只是WebDriver的远程运行程序。WebDriver是测试框架。我假设您的目标是通过并行运行测试来减少测试套件的运行时间?并行测试可以使用WebDriver在本地机器上完成,也可以在Selenium网格上配置。根据我的经验,我在本地机器上比在网格上更幸运,但两者基本上面临相同的问题使用WebDriver进行并行测试的主要危险是。JUnit 4.7及以后版本和Test NG版本允许进行并行测试。为此,我强烈建议使用TestNG而不是JUnit

    为了防止并发问题,您的主要目标将是使所有共享资源在每个线程中隔离。第二个目标是将所有变量的范围限制在其方法中。这可以通过使用的静态实例来实现,强制在同步方法中冻结驱动程序实例的初始化也是非常有用的

    创造资源 TestNG.xml
    
    
    来源:,
    使用的版本:TestNG 6.14.3、Selenium 3.11、Selenium Grid 3.14.3

    另外,Selenium Grid是否会负责清理其节点中任何过时的浏览器实例(开箱即用)


    Selenium Grid具有超时和browserTimeout功能,可释放节点并关闭浏览器实例。尽管根据我的经验,我恳请您控制测试用例中的任何预期超时,并让WebDriver关闭浏览器实例,而不是Selenium网格。你真的想防止这种情况发生,并消除所有意外绞刑的原因。测试套件被设计为快速反馈,只有当故障指示实际故障时才有用,而不仅仅是脏的测试套件。此外,过时的节点/浏览器可能会迫使您不断重置grid+节点,这是一个主要的危害

    这要看情况而定。你能澄清一下你想要达到的目标吗,首先:你是否在尝试测试多个浏览器/平台;您是否正在尝试进行负载测试;您只是想缩短现有测试套件的持续时间;您计划/希望一次运行多少个会话(每台机器)?
    public class DriverFactory {
    
        private static String grid = "http://localhost:4444/wd/hub";
        public static ThreadLocal<WebDriver> drivers = new ThreadLocal<WebDriver>();
    
        public static synchronized void newDriver() {
            ChromeOptions options = new ChromeOptions(); // Assuming Chrome use
                options.addArguments("--start-maximized");
    
            // USE THIS FOR LOCAL
            // tlDriver.set(new ChromeDriver(options));
    
            // USE THIS FOR GRID
            try {
                drivers.set(new RemoteWebDriver(new URL(grid),options));
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
        }
    
        public static synchronized WebDriver getDriver() {
            return drivers.get();
        }
    }
    
    public class GoogleTest {
        @BeforeMethod
        public void setup() {
             DriverFactory.newDriver();
        }
    
        @Test
        public void test1() {
            WebDriver driver = DriverFactory.getDriver();
            driver.navigate().to("https:\\www.google.com");
            Assert.assertEquals(driver.getTitle(), "Google");
        }
    
        @Test
        public void test2() {
            WebDriver driver = DriverFactory.getDriver();
            driver.navigate().to("https:\\www.google.com");
            Assert.assertEquals(driver.getTitle(), "Google");
        }
    
    
        @AfterMethod
        public void tearDown() {
            WebDriver driver = DriverFactory.getDriver();
            driver.quit();
        }
    }
    
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
    <!-- thread-count should be = to maxSessions on your Grid -->
    <suite name="Whatever" parallel="methods" thread-count="5">
      <test name="Sample">
        <classes>
          <class name="GoogleTest"/>
        </classes>
      </test>
    </suite>