多个浏览器的 TestNg 非并行执行给出 "org.openqa.selenium.NoSuchSessionException: invalid session id"
TestNg Non-Parallel execution of multiple browsers giving "org.openqa.selenium.NoSuchSessionException: invalid session id"
我正在尝试使用 TestNg 非并行地在 Chrome 和 Firefox 中执行我的代码。在第一个测试 "Chrome" 中正常工作,第二个测试 "Firefox" 浏览器打开但抛出以下异常 'org.openqa.selenium.NoSuchSessionException: invalid session id'.
org.openqa.selenium.NoSuchSessionException: invalid session id
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
System info: host: 'thundurus', ip: '172.17.0.1', os.name: 'Linux', os.arch: 'amd64', os.version: '4.15.0-70-generic', java.version: '1.8.0_222'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 78.0.3904.108, chrome: {chromedriverVersion: 78.0.3904.105 (60e2d8774a81..., userDataDir: /tmp/.com.google.Chrome.Ug9Qqh}, goog:chromeOptions: {debuggerAddress: localhost:37143}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: LINUX, platformName: LINUX, proxy: Proxy(), setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify}
Session ID: 1340b5921cffb4a50d3542b199d22db6
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:423)
at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187)
at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122)
at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49)
at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
at org.openqa.selenium.remote.RemoteWebDriver.perform(RemoteWebDriver.java:618)
at org.openqa.selenium.interactions.Actions$BuiltAction.perform(Actions.java:639)
at modules.actions.moveOver(actions.java:11)
at pageModels.homePage.hover_menu(homePage.java:22)
at testCases.testClass.base(testClass.java:14)
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:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:133)
at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:584)
at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:172)
at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:804)
at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:145)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at org.testng.TestRunner.privateRun(TestRunner.java:770)
at org.testng.TestRunner.run(TestRunner.java:591)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:402)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:396)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:355)
at org.testng.SuiteRunner.run(SuiteRunner.java:304)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1180)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1102)
at org.testng.TestNG.runSuites(TestNG.java:1032)
at org.testng.TestNG.run(TestNG.java:1000)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
这是我在 Chrome 完成执行后得到的异常。
在上面的异常中,Second Test 传递的浏览器参数仍然是 "Chrome".
TestNg 文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" verbose="2">
<test thread-count="5" name="Chrome">
<parameter name="browser" value="Chrome"/>
<!-- <groups>
<run>
<include name="exe.home"/>
</run>
</groups> -->
<classes>
<class name="modules.openBrowser" />
<class name="testCases.testClass"/>
</classes>
</test> <!-- Test -->
<test thread-count="5" name="FireFox">
<parameter name="browser" value="Firefox"/>
<!-- <groups>
<run>
<include name="exe.home"/>
</run>
</groups> -->
<classes>
<class name="modules.openBrowser" />
<class name="testCases.testClass"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
浏览器处理 class:
public class openBrowser implements auto_constant{
public static WebDriver driver = null;
@BeforeTest(description = "Checking the browser and launching it")
@Parameters({"browser"})
public void beforeTest(String browser) {
extentReports.attRepo(browser);
if(browser.equalsIgnoreCase("Chrome")) {
WebDriverManager.chromedriver().setup();
if(Property.getProperty("head").equalsIgnoreCase("false")) {
driver = new ChromeDriver();
}else {
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
driver = new ChromeDriver(options);
}
}else if(browser.equalsIgnoreCase("Firefox")) {
driver = null;
WebDriverManager.firefoxdriver().setup();
if(Property.getProperty("head").equalsIgnoreCase("false")) {
driver = new FirefoxDriver();
}else {
FirefoxOptions options = new FirefoxOptions();
options.addArguments("headless");
driver = new FirefoxDriver(options);
}
}
driver.manage().window().maximize();
driver.get(url);
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
}
@AfterTest(description = "Terminating the browser instance and reports")
public void afterTest() {
extentReports.extent.flush();
driver.close();
}
我什至尝试从 WebDriver 中删除 "static" 仍然是相同的异常。
谢谢。
您的脚本中可能存在两个问题。
您可能在脚本结束前关闭或退出浏览器,这可能会导致会话无效。查看您的测试脚本可能会给出清晰的画面
在第二种情况下,您可能使用静态变量来创建页面对象。当您 运行 并行时,如果您是静态页面对象,那么内存将只分配一次给第一个创建的页面对象,并且当您的第一个脚本关闭时,会话将无效。
查看测试脚本可能会给出清晰的图片。
您已将 WebDriver 定义为静态。
public static WebDriver driver = null;
消除静电并重试。
我觉得这段代码没问题。请确保您使用的是与 selenium 及其网络驱动程序兼容的 Firefox 版本
我正在尝试使用 TestNg 非并行地在 Chrome 和 Firefox 中执行我的代码。在第一个测试 "Chrome" 中正常工作,第二个测试 "Firefox" 浏览器打开但抛出以下异常 'org.openqa.selenium.NoSuchSessionException: invalid session id'.
org.openqa.selenium.NoSuchSessionException: invalid session id
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
System info: host: 'thundurus', ip: '172.17.0.1', os.name: 'Linux', os.arch: 'amd64', os.version: '4.15.0-70-generic', java.version: '1.8.0_222'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 78.0.3904.108, chrome: {chromedriverVersion: 78.0.3904.105 (60e2d8774a81..., userDataDir: /tmp/.com.google.Chrome.Ug9Qqh}, goog:chromeOptions: {debuggerAddress: localhost:37143}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: LINUX, platformName: LINUX, proxy: Proxy(), setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify}
Session ID: 1340b5921cffb4a50d3542b199d22db6
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:423)
at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187)
at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122)
at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49)
at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
at org.openqa.selenium.remote.RemoteWebDriver.perform(RemoteWebDriver.java:618)
at org.openqa.selenium.interactions.Actions$BuiltAction.perform(Actions.java:639)
at modules.actions.moveOver(actions.java:11)
at pageModels.homePage.hover_menu(homePage.java:22)
at testCases.testClass.base(testClass.java:14)
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:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:133)
at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:584)
at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:172)
at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:804)
at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:145)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at org.testng.TestRunner.privateRun(TestRunner.java:770)
at org.testng.TestRunner.run(TestRunner.java:591)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:402)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:396)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:355)
at org.testng.SuiteRunner.run(SuiteRunner.java:304)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1180)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1102)
at org.testng.TestNG.runSuites(TestNG.java:1032)
at org.testng.TestNG.run(TestNG.java:1000)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
这是我在 Chrome 完成执行后得到的异常。 在上面的异常中,Second Test 传递的浏览器参数仍然是 "Chrome".
TestNg 文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" verbose="2">
<test thread-count="5" name="Chrome">
<parameter name="browser" value="Chrome"/>
<!-- <groups>
<run>
<include name="exe.home"/>
</run>
</groups> -->
<classes>
<class name="modules.openBrowser" />
<class name="testCases.testClass"/>
</classes>
</test> <!-- Test -->
<test thread-count="5" name="FireFox">
<parameter name="browser" value="Firefox"/>
<!-- <groups>
<run>
<include name="exe.home"/>
</run>
</groups> -->
<classes>
<class name="modules.openBrowser" />
<class name="testCases.testClass"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
浏览器处理 class:
public class openBrowser implements auto_constant{
public static WebDriver driver = null;
@BeforeTest(description = "Checking the browser and launching it")
@Parameters({"browser"})
public void beforeTest(String browser) {
extentReports.attRepo(browser);
if(browser.equalsIgnoreCase("Chrome")) {
WebDriverManager.chromedriver().setup();
if(Property.getProperty("head").equalsIgnoreCase("false")) {
driver = new ChromeDriver();
}else {
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
driver = new ChromeDriver(options);
}
}else if(browser.equalsIgnoreCase("Firefox")) {
driver = null;
WebDriverManager.firefoxdriver().setup();
if(Property.getProperty("head").equalsIgnoreCase("false")) {
driver = new FirefoxDriver();
}else {
FirefoxOptions options = new FirefoxOptions();
options.addArguments("headless");
driver = new FirefoxDriver(options);
}
}
driver.manage().window().maximize();
driver.get(url);
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
}
@AfterTest(description = "Terminating the browser instance and reports")
public void afterTest() {
extentReports.extent.flush();
driver.close();
}
我什至尝试从 WebDriver 中删除 "static" 仍然是相同的异常。
谢谢。
您的脚本中可能存在两个问题。
您可能在脚本结束前关闭或退出浏览器,这可能会导致会话无效。查看您的测试脚本可能会给出清晰的画面
在第二种情况下,您可能使用静态变量来创建页面对象。当您 运行 并行时,如果您是静态页面对象,那么内存将只分配一次给第一个创建的页面对象,并且当您的第一个脚本关闭时,会话将无效。 查看测试脚本可能会给出清晰的图片。
您已将 WebDriver 定义为静态。
public static WebDriver driver = null;
消除静电并重试。
我觉得这段代码没问题。请确保您使用的是与 selenium 及其网络驱动程序兼容的 Firefox 版本