Selenium 硒“;“没有这样的会议”;TestNG testing.xml出错

Selenium 硒“;“没有这样的会议”;TestNG testing.xml出错,selenium,testng,Selenium,Testng,我正在尝试使用TestNG的testing.xml对交叉浏览器运行一个简单的测试。脚本在第一次运行(Chrome)时运行良好。但在firefox测试开始时出现“无此类会话”错误 我简化了代码以便于阅读。我希望有帮助 这是我的TestNG testing.xml 这是我的密码 公共类登录测试{ 私有静态WebDriver; @试验前 @参数(“浏览器”) public void testSetup(字符串浏览器)引发异常{ //检查从TestNG传递的参数是否为“firefox” if(bro

我正在尝试使用TestNG的testing.xml对交叉浏览器运行一个简单的测试。脚本在第一次运行(Chrome)时运行良好。但在firefox测试开始时出现“无此类会话”错误

我简化了代码以便于阅读。我希望有帮助

这是我的TestNG testing.xml


这是我的密码

公共类登录测试{
私有静态WebDriver;
@试验前
@参数(“浏览器”)
public void testSetup(字符串浏览器)引发异常{
//检查从TestNG传递的参数是否为“firefox”
if(browser.equalsIgnoreCase(“firefox”)){
driver=webBrowsers.browserAl(“Firefox”);
}
//检查参数是否作为“chrome”传递
else if(browser.equalsIgnoreCase(“chrome”)){
driver=webBrowsers.browserAl(“铬”);
}
否则{
//如果没有浏览器通过抛出异常
抛出新异常(“浏览器不正确”);
}
}
@测试(优先级=0)
公共无效登录测试(){
驱动程序。获取(“http://www.hurriyet.com.tr/");
}
@事后
公共空间{
webBrowsers.closeDriver();
}
}
最后是我的网络浏览器

公共类网络浏览器{
私有静态WebDriver=null;
私有静态字符串browserName;
公共静态WebDriver browserAl(字符串browserName){
if(browserName.equals(“Firefox”)){
if(驱动程序==null){
setProperty(“webdriver.gecko.driver”、“/drivers/geckodriver.exe”);
驱动程序=新的FirefoxDriver();
}
}else if(browserName.equals(“Edge”)){
if(驱动程序==null){
System.setProperty(“webdriver.edge.driver”,“/drivers/MicrosoftWebDriver.exe”);
驱动器=新的EdgeDriver();
}
}else if(browserName.equals(“Chrome”)){
if(驱动程序==null){
System.setProperty(“webdriver.chrome.driver”,“/drivers/chromedriver.exe”);
驱动程序=新的ChromeDriver();
}
}
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
driver.manage().timeout().pageLoadTimeout(60,TimeUnit.SECONDS);
返回驱动器;
}
公共静态void closeDriver(){
driver.close();
}
}

问题出在您的班级
WebBrowser
。您正在使用静态webdriver实例。因此,对于第一次
执行,
驱动程序
实例将不会为空,它将被正确实例化。但是,当您执行第二个
标记时,条件
driver==null
将为false,并且您最终将获得为前一个
标记创建的webdriver对象的引用。更糟糕的是,您有一个
@postest
方法,它也会清理驱动程序实例。因此,您现在基本上使用的是一个有效的
webdriver
实例,但其打开的会话已被清理

最终结果:你的错误

这是一个经过清理的代码版本,应该可以解决这个问题

import org.openqa.selenium.WebDriver;
导入org.openqa.selenium.chrome.ChromeDriver;
导入org.openqa.selenium.edge.EdgeDriver;
导入org.openqa.selenium.firefox.FirefoxDriver;
导入java.util.concurrent.TimeUnit;
公共类网络浏览器{
公共静态WebDriver browserAl(字符串browserName){
WebDriver=null;
if(browserName.equals(“Firefox”)){
setProperty(“webdriver.gecko.driver”、“/drivers/geckodriver.exe”);
驱动程序=新的FirefoxDriver();
}else if(browserName.equals(“Edge”)){
System.setProperty(“webdriver.edge.driver”,“/drivers/MicrosoftWebDriver.exe”);
驱动器=新的EdgeDriver();
}else if(browserName.equals(“Chrome”)){
System.setProperty(“webdriver.chrome.driver”,“/drivers/chromedriver.exe”);
驱动程序=新的ChromeDriver();
}
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
driver.manage().timeout().pageLoadTimeout(60,TimeUnit.SECONDS);
返回驱动器;
}
公共静态无效关闭驱动程序(WebDriver驱动程序){
if(驱动程序!=null){
driver.quit();
}
}
}
下面是您的测试类的外观

import org.openqa.selenium.WebDriver;
导入org.testng.annotations.postest;
导入org.testng.annotations.BeforeTest;
导入org.testng.annotations.Parameters;
导入org.testng.annotations.Test;
公共类登录测试{
私有WebDriver驱动程序;
@试验前
@参数(“浏览器”)
public void testSetup(字符串浏览器)引发异常{
//检查从TestNG传递的参数是否为“firefox”
if(browser.equalsIgnoreCase(“firefox”)){
driver=WebBrowsers.browserAl(“Firefox”);
}
//检查参数是否作为“chrome”传递
else if(browser.equalsIgnoreCase(“chrome”)){
driver=WebBrowsers.browserAl(“铬”);
}否则{
//如果没有浏览器通过抛出异常
抛出新异常(“浏览器不正确”);
}
}
@试验
公共无效登录测试(){
驱动程序。获取(“http://www.hurriyet.com.tr/");
}
@事后
公共空间{
网络浏览器。关闭驱动器(驱动器);
}
}

它不会改变任何东西。org.openqa.selenium.New错误消息是“NoSuchSessionException:会话ID为null。调用quit()后使用WebDriver?”我猜到了错误的原因,正如您所解释的,但是