我正在使用 selenium 来测试单页应用程序。我正在以一种@beforeClass
方法加载页面。然后运行类中的所有测试。@afterClass
然后在方法中拆掉驱动。
我已经将我的构造函数注释为@factory
使用dataprovider
来自基类的方法。dataprovider
用于设置不同浏览器的集合。
我正在使用 crossbrowsertesting.com 来运行测试,我正在努力控制并行化。我需要能够控制任何时候运行的最大并发线程数(我们当前的计划只允许 2 个同时测试)。我想确保并行化发生在数据提供者级别。(即我希望每个浏览器有一个线程,最多 2 个线程)。
我正在使用 testng.xml 文件。
<suite name="functional_tests" parallel="classes" thread-count="2">
<test name="com.mapov.functional_tests suite">
<classes>
<class name="com.mapov.functional_tests.KiteTests" />
</classes>
</test>
</suite>
有一个基类 -
public class BaseTest {
public BaseTest (String browser, String platform, String resolution, String browserDescription) {
userName = "myUsername";
accessKey = "myKey";
pageUrl = "http://test.mapov.com/hotels/benidorm";
this.browserDescription = browserDescription;
caps = new DesiredCapabilities();
caps.setCapability("browser_api_name", browser);
caps.setCapability("os_api_name", platform);
caps.setCapability("screen_resolution", resolution);
caps.setCapability("name", this.browserDescription);
caps.setCapability("record_video", "false");
caps.setCapability("record_network", "false");
caps.setCapability("record_snapshot", "false");
}
@DataProvider(parallel=true)
public static Object[][] getBrowsers() {
return new Object[][]{
new Object[]{"MblSafari8.0", "iPadAir-iOS8Sim", "1024x768", "Ipad air, with safari 8"},
new Object[]{"IE11", "Win10", "1280x1024", "IE11 on windows 10"},
new Object[]{"Safari9", "Mac10.11", "1280x1024", "Safari 9 on Mac osx10.11"},
};
}
@BeforeClass
public void SetupDriver() {
long id = Thread.currentThread().getId();
try {
URL remoteDriverURL = new URL("http://" + userName + ":" + accessKey + "@hub.crossbrowsertesting.com:80/wd/hub");
driver = new RemoteWebDriver(remoteDriverURL, caps);
driver.get(pageUrl);
WebElement pager = (new WebDriverWait(driver, 30)).until(ExpectedConditions.visibilityOfElementLocated(By.id("pager")));
} catch (MalformedURLException ex) {
System.out.println(ex.getMessage());
}
}
@AfterClass
public void disposeOfDriver() {
// quit the driver
}
}
然后是一个带有测试的继承类。
public class KiteTests extends BaseTest {
@Factory(dataProvider = "getBrowsers")
public KiteTests(String browser, String platform, String resolution, String description) {
super(browser, platform, resolution, "Kite tests on " + description);
}
@Test
public void testKitesAppear() {
// test.
}
@Test
public void testHotelNamePresent() {
// test
}
}
如果我parallel="classes" thread-count="2"
从 xml 的套件节点中删除属性,那么一切运行正常(只是不并行)。
如果我保留参数,那么我会收到以下错误 -
FAILED CONFIGURATION: @BeforeClass SetupDriver
org.openqa.selenium.WebDriverException: This account has reached it maxiumum number of concurrent selenium tests - please wait for a test to finish before starting a new test.
Command duration or timeout: 668 milliseconds
Build info: version: '2.48.2', revision: '41bccdd', time: '2015-10-09 19:55:52'
System info: host: 'Ewen-Macbook.lan', ip: '192.168.1.65', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.11', java.version: '1.8.0_45'
Driver info: org.openqa.selenium.remote.RemoteWebDriver
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:647)
at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:247)
at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:129)
at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:156)
at com.mapov.functional_tests.BaseTest.SetupDriver(BaseTest.java:75)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:564)
at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:213)
at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:138)
at org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:175)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:107)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)