我正在尝试并行执行测试用例。当我尝试在远程机器(仅限我的本地主机)上的浏览器(chrome 或 firefox 或两者)上超过 2 个测试用例时,将抛出以下异常。
* 主要基础 * : 公共类 TestBase {
public ThreadLocal<RemoteWebDriver> tlDriver = new ThreadLocal<RemoteWebDriver>();
public static ExcelTestData dataTable = new ExcelTestData();
public static Properties config = new Properties();
public static FileInputStream fis;
public static RemoteWebDriver driver;
public static BasicFunctions basics = new BasicFunctions();
public static ExtentReports extentReport = ExtentReportManager.getInstance();
public static ExtentTest extentTest;
}
* 函数库 * 公共类 BasicFunctions 扩展 TestBase {
公共无效寄存器(){
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(ObjectRepositories.xpath_registerLink)));
driver.findElement(By.xpath(ObjectRepositories.xpath_registerLink)).click();
if(driver.findElement(By.xpath(ObjectRepositories.xpath_registrationTitle)).isDisplayed())
{
driver.findElement(By.xpath(ObjectRepositories.xpath_loginTextbox)).sendKeys(dataTable.getData("RegressionData", "Register_login"));
driver.findElement(By.xpath(ObjectRepositories.xpath_emailTextbox)).sendKeys(dataTable.getData("RegressionData", "Register_email"));
driver.findElement(By.xpath(ObjectRepositories.xpath_reg_passwordTextbox)).sendKeys(dataTable.getData("RegressionData", "Register_password"));
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(ObjectRepositories.xpath_reg_conf_passwordTextbox)));
driver.findElement(By.xpath(ObjectRepositories.xpath_reg_conf_passwordTextbox)).sendKeys(dataTable.getData("RegressionData", "Register_confirmPassword"));
sleep(2000);
try
{
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(ObjectRepositories.xpath_reg_submisson)));
driver.findElement(By.xpath(ObjectRepositories.xpath_reg_submisson)).click();
}
catch(NoSuchElementException nsee)
{
driver.findElement(By.xpath(ObjectRepositories.xpath_reg_passwordTextbox)).click();
}
}
}
公共同步无效驱动程序启动(字符串浏览器){
System.out.println("Thread name is "+ Thread.currentThread().getName() + " and Thread ID is "+ Thread.currentThread().getId());
if (ExcelReader.gridExecution.equals("Yes"))
{
if (Browser.equalsIgnoreCase("Firefox"))
{
System.setProperty("webdriver.gecko.driver", System.getProperty("user.dir")+"/src/test/resources/Executables/geckodriver.exe");
DesiredCapabilities cap = DesiredCapabilities.firefox();
try
{
tlDriver.set(new RemoteWebDriver(new URL(config.getProperty("Grid_Url")+":"+config.getProperty("Port_Firefox")+"/wd/hub"),cap));
driver = tlDriver.get();
}
catch(MalformedURLException urlex)
{
urlex.printStackTrace();
}
catch(Exception e)
{
System.out.println("Other exception");
e.printStackTrace();
}
}
else if (Browser.equalsIgnoreCase("Chrome"))
{
System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir")+"/src/test/resources/Executables/chromedriver.exe");
DesiredCapabilities cap = DesiredCapabilities.chrome();
try
{
tlDriver.set(new RemoteWebDriver(new URL(config.getProperty("Grid_Url")+":"+config.getProperty("Port_Chrome")+"/wd/hub"),cap));
driver = tlDriver.get();
}
catch(MalformedURLException urlex)
{
urlex.printStackTrace();
}
catch(Exception e)
{
System.out.println("Other exception");
e.printStackTrace();
}
}
}
else
{
if(Browser.equalsIgnoreCase("Firefox"))
{
System.setProperty("webdriver.gecko.driver", System.getProperty("user.dir")+"/src/test/resources/Executables/geckodriver.exe");
driver= new FirefoxDriver();
}
else if(Browser.equalsIgnoreCase("Chrome"))
{
System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir")+"/src/test/resources/Executables/chromedriver.exe");
driver= new ChromeDriver();
}
}
if(driver!=null)
{
driver.get(config.getProperty("ApplicationUrl"));
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
wait = new WebDriverWait(driver,30);
javascript = (JavascriptExecutor)driver;
}
}
}
* 我的测试用例 * 公共类 LoginValidation 扩展 TestBase {
//public WebDriver driver;
@Parameters({"Browser"})
@BeforeTest
public void setupInitiation(String Browser)
{
Thread.currentThread().setName(this.getClass().getSimpleName());
basics.driverInititation(Browser);
}
@Test
public void execution()
{
basics.login();
basics.logout();
}
}
例外:
org.openqa.selenium.NoSuchSessionException:无效的会话 id(驱动程序信息:chromedriver=2.42.591088(7b2b2dca23cca0862f674758c9a3933e685c27d5),平台=Windows NT 10.0.17134 x86_64)(警告:服务器未提供任何堆栈跟踪信息)命令持续时间或超时: 0 毫秒构建信息:版本:'3.14.0',修订:'aacccce0',时间:'2018-08-02T20:19:58.91Z' 系统信息:主机:'PRABU',ip:'192.168.92.2', os.name: 'Windows 8.1', os.arch: 'amd64', os.version: '6.3', java.version: '1.8.0_40' 驱动信息: org.openqa.selenium.remote.RemoteWebDriver Capabilities {acceptInsecureCerts:假,acceptSslCerts:假,applicationCacheEnabled:假,browserConnectionEnabled:假,browserName:铬,铬:{chromedriverVersion:2.42.591088(7b2b2dca23cca0 ...,userDataDir: C:\Users\PRABUN~1\AppData\L...}, cssSelectorsEnabled: true, databaseEnabled: false, goog:chromeOptions: {debuggerAddress: localhost:50326}, handlesAlerts: true, hasTouchScreen: false, javascriptEnabled: true ,locationContextEnabled:true,mobileEmulationEnabled:false,nativeEvents:true,networkConnectionEnabled:false,pageLoadStrategy:正常,平台:XP,platformName:XP,可旋转:false,setWindowRect:true,takesHeapSnapshot:true,takeScreenshot:true,unexpectedAlertBehaviour:,unhandledPromptBehavior: ,版本:69.0.3497.100,webStorageEnabled:true,webdriver.remote.sessionid:f24126658364be46f247f15b580...} *** 元素信息:{Using=xpath, value=//div/a[@href='#/register']在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 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:214) 在 org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:166) 在 org.openqa.selenium.remote.http.JsonHttpResponseCodec.reconstructValue(JsonHttpResponseCodec.java:40) 在org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:80) 在 org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:44) 在 org.openqa.selenium.remote。 org.openqa.selenium.remote 上的 HttpCommandExecutor.execute(HttpCommandExecutor.java:158)。RemoteWebDriver.execute(RemoteWebDriver.java:548) at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:322) at org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:424) at org .openqa.selenium.By$ByXPath.findElement(By.java:353) at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:314) at com.servicenow.functionallibraries.BasicFunctions.register(BasicFunctions.java :98) 在 com.servicenow.testcases.RegistrationFormEntry.execution(RegistrationFormEntry.java:30) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun。 reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124) 在 org.testng.internal.Invoker.invokeMethod(Invoker.java:580) 在 org.testng.internal.Invoker.invokeTestMethod(Invoker .java:716) 在 org.testng.internal.Invoker.invokeTestMethods(Invoker.java:988) 在 org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125) 在 org.testng.internal.TestMethodWorker.run( TestMethodWorker.java:109) at org.testng.TestRunner.privateRun(TestRunner.java:648) at org.testng.TestRunner.run(TestRunner.java:505) at org.testng.SuiteRunner.runTest(SuiteRunner.java:455 ) 在 org.testng.SuiteRunner.access$000(SuiteRunner.java:40) 在 org.testng.SuiteRunner$SuiteWorker.run(SuiteRunner.java:489) 在 org.testng.internal.thread.ThreadUtil$1.call(ThreadUtil.爪哇:52) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor .java:617) 在 java.lang.Thread.run(Thread.java:745)