【问题标题】:Selenium Grid running tests in parallelSelenium Grid 并行运行测试
【发布时间】:2014-12-16 05:07:12
【问题描述】:

目前,我有一个 Selenium 网格设置,有 1 个本地集线器和 2 个本地节点。集线器能够分发测试以并行运行并将其分发到节点。我正在并行运行测试。

以下是基础测试

public abstract class BaseTest 
   {    
            String                      testFolder;
            String                      testName;
            protected String            envName;        
            protected Configuration     config;
            protected String            host;
            protected RemoteWebDriver   driver;
            protected String            proxy;
            protected SomeData      someData;
            protected SomeController someController;

            public BaseTest() {
              }

            public BaseTest( String testFolder, String testName) 
            {   
                this.testFolder         = testFolder;
                this.testName           = testName;
                this.envName            = System.getProperty("config");
                this.proxy              = System.getProperty("proxy");
                config = this.envName;
            }

            @BeforeMethod 
            public void startTest(Method testMethod) {
                LOG.info("Starting test: " + testMethod.getName());
                try {
                this.someData       = new SomeData();
                this.driver             = WebDriverSetup.getDriver();
                this.someController = new someController(this.driver, this.someData);
                driver.navigate().to("https://" + this.host);
                } catch (MalformedURLException e) {
                    System.out.println("MalformedURLException");
                }
            }
            @AfterMethod
            public void closeWindow() {
                driver.close();
                driver.quit();
            }
        }

以下是获取RemoteWebDriver的类:

        public class WebDriverSetup {

            public static RemoteWebDriver getDriver() throws MalformedURLException{

                String SELENIUM_HUB_URL = "http://localhost:4444/wd/hub";
                ThreadLocal<RemoteWebDriver> remoteWebDriver = null;

                DesiredCapabilities capabilities = DesiredCapabilities.firefox();
                capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
                String proxy = System.getProperty("proxy");

                if (proxy != null && !proxy.isEmpty()) {
                    System.out.println("Using proxy: " + proxy);
                    capabilities.setCapability(CapabilityType.PROXY, proxy);
                }

                try {
                    remoteWebDriver = new ThreadLocal<RemoteWebDriver>();
                    remoteWebDriver.set(new RemoteWebDriver(new URL(SELENIUM_HUB_URL),
                            capabilities));
                } catch (MalformedURLException e) {
                    System.out.println("Tackle Issue with RemoteDriverSetup");
                }

                remoteWebDriver.get().manage().window()
                        .setSize(new Dimension(2880, 1524));
                remoteWebDriver.get().manage().timeouts()
                        .pageLoadTimeout(10, TimeUnit.SECONDS);
                remoteWebDriver.get().manage().timeouts()
                        .implicitlyWait(10, TimeUnit.SECONDS);

                return remoteWebDriver.get();
            }
        }

我的测试套件是这样的:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Multiple Tests Suite" verbose="1" parallel="methods">
    <test name="Test1">
        <classes>
            <class name="com.itesteverything.qa.Tests"></class>
        </classes>
    </test>
</suite>

测试就像:

public class Tests extends BaseTest {

@Parameters({"testName", "env" })
public Tests( @Optional String testName, @Optional String env ) {
    super( null, testName, null, env );
}

@BeforeMethod
public void setup() throws Exception {
    //setSomeData
}   

public void test1() throws Exception {  

use driver from super
use someData from super
use someController is using the driver from super
}

public void test2() throws Exception {  

use driver from super
use someData from super
use someController is using the driver from super
}

在运行这些测试时,我收到以下错误

构建信息:版本:'2.44.0',修订:'76d78cf323ce037c5f92db6c1bba601c2ac43ad8',时间:'2014-10-23 13:11:40' 驱动程序信息:driver.version:RemoteWebDriver org.openqa.selenium.remote.SessionNotFoundException:会话 ID 为空。调用 quit() 后使用 WebDriver? 构建信息:版本:'2.44.0',修订:'76d78cf323ce037c5f92db6c1bba601c2ac43ad8',时间:'2014-10-23 13:11:40' 驱动程序信息:driver.version:RemoteWebDriver 在 org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158) 在 org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:572) 在 org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:352) 在 org.openqa.selenium.remote.RemoteWebDriver.findElementById(RemoteWebDriver.java:393) 在 org.openqa.selenium.By$ById.findElement(By.java:214) 在 org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:344) 在 org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:59) 在 com.sun.proxy.$Proxy25.sendKeys(未知来源) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80) 在 org.testng.internal.Invoker.invokeMethod(Invoker.java:673) 在 org.testng.internal.Invoker.invokeTestMethod(Invoker.java:842) 在 org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1166) 在 org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125) 在 org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 java.lang.Thread.run(Thread.java:745) 测试失败:test2 失败原因:会话 ID 为空。调用 quit() 后使用 WebDriver?

有人知道吗?

提前致谢!

【问题讨论】:

    标签: selenium-webdriver selenium-grid remotewebdriver parallel-testing


    【解决方案1】:

    不要在基类中设置驱动,根本没有驱动属性。相同的实例被不同的线程本地驱动程序覆盖。

    任何时候你想运行你的测试,在你的测试方法本身和你的 after/before 方法中参考 WebDriverSetup.getDriver()。

    【讨论】:

    • 我尝试在测试类本身的@BeforeMethod 中设置驱动程序,这意味着我也必须在测试中设置 someController 和 someData。鉴于每个驱动程序都应该有自己的 SomeData 和 SomeController 实例,这两个对象也应该是 ThreadSafe 的。对不起,我不能提出另一个问题,因为它只与这个问题有关。你会建议另一个组成 ThreadLocal 对象的类(比如说 ThreadSafeBaseTest),然后在扩展 ThreadSafeBaseTest 的每个 TestClass 中使用它或类似的东西吗?
    • 这将取决于数据和控制器中的内容。这些东西是针对每个测试的吗?
    • 是的,每个测试类都有一个设置方法(使用@BeforeMethod),它使用这些对象并为每个测试分配新值。您对 ThreadLocal 方法有何建议?
    • @neharika_neo :我在stackoverflow.com/questions/27531619/…添加了一个测试分发的新问题
    【解决方案2】:
        @AfterMethod
    

    在每个方法之后运行。 而U run只有一种设置。因此,在第一个方法 U 关闭后,它已关闭,如堆栈跟踪所示。

    【讨论】:

    • 方法完成后关闭相关驱动线程的建议是什么?
    • U 可以在@AfterClass 或@AfterSuite 中使用close U 也可以给每个测试单独的驱动程序。在所有测试之后使用关闭并退出浏览器仍然更安全。在 testNG 中,它可能是组“干净”或类似的东西。
    • 我也已经尝试关闭@AfterSuite,这意味着它在套件完全运行之前不会关闭驱动程序实例。我现在正在运行一些测试。让我们看看结果如何。谢谢!会及时通知您。
    猜你喜欢
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多