Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Selenium webdriver Selenium网格并行运行测试_Selenium Webdriver_Selenium Grid_Remotewebdriver_Parallel Testing - Fatal编程技术网

Selenium webdriver Selenium网格并行运行测试

Selenium webdriver Selenium网格并行运行测试,selenium-webdriver,selenium-grid,remotewebdriver,parallel-testing,Selenium Webdriver,Selenium Grid,Remotewebdriver,Parallel Testing,目前,我有一个Selenium网格设置,有1个本地集线器和2个本地节点。集线器能够分发并行运行的测试,并将其分发到节点。我正在并行运行这些测试 以下是基本测试 public abstract class BaseTest { String testFolder; String testName; protected Strin

目前,我有一个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();
            }
        }
在运行这些测试时,我发现以下错误

构建信息:版本:“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(本机方法)处 在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) 运行(Thread.java:745) 测试失败:test2 失败原因:会话ID为空。调用quit()后使用WebDriver

有人知道吗

提前谢谢

    @AfterMethod
在每个方法之后运行。
而U-run只是一个设置。因此,在第一个方法U关闭后,它将关闭,如堆栈跟踪所示。

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


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

你对在方法完成后关闭相关驱动程序线程的建议是什么?你可以在@AfterClass或@AfterSuite中使用close,你也可以给每个测试单独的驱动程序。尽管如此,在所有测试之后使用关闭并退出浏览器还是比较安全的。在testNG中,它可能是组“clean”或类似的东西。我也尝试过关闭@AfterSuite,这意味着在套件完全运行之前,它不会关闭驱动程序实例。我现在正在运行一些测试。让我们看看结果如何。谢谢我尝试在测试类本身的@BeforeMethod中设置驱动程序,这意味着我也必须在测试中设置someController和someData。假设每个驱动程序都应该有自己的SomeData和SomeController实例,那么这两个对象也应该是线程安全的。对不起,我不能提出另一个问题,因为它只与这个问题有关。您会推荐另一个类(比如ThreadSafeBaseTest)来组成ThreadLocal对象,然后在扩展ThreadSafeBaseTest的每个测试类或类似的测试类中使用它吗?这取决于数据和控制器中的内容。是的,每个测试类都有一个setup方法(使用@BeforeMethod),该方法使用这些对象并为每个测试分配新值。您对ThreadLocal方法有何建议?@neharika_neo:我在上为测试分发添加了一个新问题
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
}
    @AfterMethod