Java 并行执行时,第二个会话将覆盖Selenium测试
在通过Saucelabs跨浏览器执行selenium java测试时,我需要一些帮助来解决这个问题。我正在Jenkins作业中选择的两个浏览器上运行一个测试 在执行过程中,一个测试通过,另一个测试(类似)失败,错误为:504网关超时。服务器没有及时响应。 所以它无法进入下一步 似乎一个测试中断了另一个测试。这两个测试都在各自的通道和线程下运行Java 并行执行时,第二个会话将覆盖Selenium测试,java,selenium,cross-browser,testng,saucelabs,Java,Selenium,Cross Browser,Testng,Saucelabs,在通过Saucelabs跨浏览器执行selenium java测试时,我需要一些帮助来解决这个问题。我正在Jenkins作业中选择的两个浏览器上运行一个测试 在执行过程中,一个测试通过,另一个测试(类似)失败,错误为:504网关超时。服务器没有及时响应。 所以它无法进入下一步 似乎一个测试中断了另一个测试。这两个测试都在各自的通道和线程下运行 Aug 30, 2018 7:17:44 AM org.openqa.selenium.remote.ProtocolHandshake createS
Aug 30, 2018 7:17:44 AM org.openqa.selenium.remote.ProtocolHandshake
createSession
INFO: Detected dialect: OSS
30-08-2018 07:17:49.235 [TestNG-PoolService-0] INFO
[com.***.tests.TestBase_Local:96] - Open a site URLDriver: RemoteWebDriver:
chrome on XP (4f5a5d685f4c44c9a5864e91cb8f11e9)
Driver: RemoteWebDriver: chrome on XP (4f5a5d685f4c44c9a5864e91cb8f11e9)
thread id:14 Timestamp :2018-08-30T07:17:49.370
30-08-2018 07:17:51.912 [TestNG-PoolService-0] INFO
[com.**.tests.TestBase_Local:35] - Select 'No thanks' on the popup
Aug 30, 2018 7:17:53 AM org.openqa.selenium.remote.ProtocolHandshake
createSession
INFO: Detected dialect: OSS
30-08-2018 07:17:58.886 [TestNG-PoolService-1] INFO
[com.**.tests.TestBase_Local:96] - Open a site URLDriver:
RemoteWebDriver: MicrosoftEdge on ANY (c6978c03531d408485588ba501ff0589)
Driver: RemoteWebDriver: MicrosoftEdge on ANY
(c6978c03531d408485588ba501ff0589)
thread id:15 Timestamp :2018-08-30T07:17:58.887
30-08-2018 07:18:03.406 [TestNG-PoolService-1] INFO
[com.**.tests.TestBase_Local:35] - Select 'No thanks' on the popup
30-08-2018 07:18:05.337 [TestNG-PoolService-1] INFO
[com.**.tests.TestBase_Local:38] - Search by input
共享代码:
公共类搜索扩展了RemoteTestBase{
@测试(dataProvider=“browsers”)
public void SolrSearchTest(字符串浏览器、字符串版本、字符串操作系统、方法)引发异常{
this.createRemoteDriver(browser、version、os、method.getName());
System.out.println(“Driver:+Driver.toString());
应用程序app=新应用程序(驱动程序);
ConfigFileReader configRead=新的ConfigFileReader();
WebDriverWait wait=新的WebDriverWait(驱动程序,100);
app.homePage()。选择nothanks();
Log.info(“在弹出窗口中选择“不感谢”);
app.searchField().SearchBy(configRead.SearchInput());
Log.info(“按输入搜索”);
}
}
扩展的RemoteTestBase类:
公共类RemoteTestBase{
公共网络驱动程序;
私有静态字符串baseUrl;
随机数据选择随机用户;
私有财产领导者财产领导者;
public Logger Log=Logger.getLogger(TestBase_Local.class.getName());
私有静态最终字符串SAUCE_ACCESS_KEY=System.getenv(“SAUCE_ACCESS_KEY”);
私有静态最终字符串SAUCE_USERNAME=System.getenv(“SAUCE_USERNAME”);
@预处理法
@数据提供者(name=“browsers”,parallel=true)
公共静态对象[][]sauceBrowserDataProvider(方法testMethod)抛出JSONException{
String browsersjsonaraystring=System.getenv(“saint_ONDEMAND_BROWSERS”);
System.out.println(浏览器字符串);
JSONArray browsersjsonarayobj=新的JSONArray(browsersjsonaraystring);
Object[][]browserObjArray=新对象[BrowsersJSSonarayObj.length()][3];
对于(int i=0;i 类问题在于您的测试代码。它肯定与您的@test
方法之间的竞争条件有关[您的@DataProvider
注释中有您的parallel=“true”
,以及parallel=“methods”]
您需要重构代码,使驱动程序
对象是线程安全的
您可以使用以下方法来完成此任务:
- WebDriver的ThreadLocal变体
- 创建webdriver实例并将其作为属性注入
ITestResult
对象
下面的示例显示如何使用ThreadLocal
变量使代码线程安全
import java.net.URL;
导入java.util.concurrent.TimeUnit;
导入org.openqa.selenium.remote.DesiredCapabilities;
导入org.openqa.selenium.remote.RemoteWebDriver;
导入org.testng.ITestResult;
导入org.testng.annotations.AfterMethod;
公共类RemoteTestBase{
公共静态最终ThreadLocal驱动程序=新ThreadLocal();
私有静态字符串baseUrl;
私有静态最终字符串SAUCE_ACCESS_KEY=System.getenv(“SAUCE_ACCESS_KEY”);
私有静态最终字符串SAUCE_USERNAME=System.getenv(“SAUCE_USERNAME”);
void createRemoteDriver(字符串浏览器、字符串版本、字符串操作系统、字符串方法名)
抛出异常{
DesiredCapabilities=新的DesiredCapabilities();
等级