Selenium webdriver Selenium网格并行运行测试
目前,我有一个Selenium网格设置,有1个本地集线器和2个本地节点。集线器能够分发并行运行的测试,并将其分发到节点。我正在并行运行这些测试 以下是基本测试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
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