Selenium webdriver WebDriver:如何将MarionetedRiver转换为ThreadLocal<;WebDriver>;用于TestNG中的并行测试

Selenium webdriver WebDriver:如何将MarionetedRiver转换为ThreadLocal<;WebDriver>;用于TestNG中的并行测试,selenium-webdriver,thread-local,firefox-marionette,Selenium Webdriver,Thread Local,Firefox Marionette,有没有办法通过ThreadLocal到marinettedriver来实现WebDriver本地实例的类型转换???我的代码是这样的 public class Base_Class { protected ThreadLocal<WebDriver> Driver = null; @BeforeMethod @Parameters("BrowserName") public void setUp(@Optional("Firefox")

有没有办法通过
ThreadLocal
marinettedriver
来实现
WebDriver
本地实例的类型转换???我的代码是这样的

    public class Base_Class 
   {
    protected ThreadLocal<WebDriver> Driver = null;
    @BeforeMethod
    @Parameters("BrowserName")
    public void setUp(@Optional("Firefox") String BrowserName) throws MalformedURLException
    {

        Driver = new ThreadLocal<WebDriver>();
        if(BrowserName.equalsIgnoreCase("FireFox"))
        { 

            System.setProperty("webdriver.gecko.driver", "..//BrowserDrivers//wires");
            DesiredCapabilities capabilities = DesiredCapabilities.firefox();
            capabilities.setCapability("marionette", true);
             Driver = new <ThreadLocal<WebDriver>> MarionetteDriver(capabilities);


       }
        else  if(BrowserName.equalsIgnoreCase("Chrome"))
        {
            System.setProperty("webdriver.chrome.driver", "..//BrowserDrivers//chromedriver");
            Driver = new <ThreadLocal<WebDriver>>ChromeDriver();
        }
    }

    public WebDriver getDriver()
    {
        return Driver.get();
    }

    @AfterMethod
    public void closeBrowser()
    {
        getDriver().quit();

    }
    }
公共类基类
{
受保护的线程本地驱动程序=null;
@预处理法
@参数(“浏览器名称”)
public void安装程序(@Optional(“Firefox”)字符串BrowserName)引发错误的异常
{
Driver=new ThreadLocal();
if(BrowserName.equalsIgnoreCase(“FireFox”))
{ 
System.setProperty(“webdriver.gecko.driver”,“.//BrowserDrivers//wires”);
DesiredCapabilities=DesiredCapabilities.firefox();
能力。设置能力(“木偶”,真);
驱动程序=新的木偶河流(能力);
}
else if(浏览器名称.相等信号案例(“Chrome”))
{
System.setProperty(“webdriver.chrome.driver”,“..//BrowserDrivers//chromedriver”);
驱动程序=新的ChromeDriver();
}
}
公共WebDriver getDriver()
{
返回驱动程序get();
}
@后置法
公共浏览器()
{
getDriver().quit();
}
}
所有的测试用例都在单独的类中定义,这些类扩展了这个基础类

获取错误@
Driver=新的木偶驱动程序(功能);和驱动器=新的色度驱动器();类型不匹配的行:无法从MarionetteDriver转换为ThreadLocal

我在
ubuntu14.04
Os和
Selenium版本Selenium-server-standalone-2.53.0上使用
Chrome版本52.0.2743.116(64位)
FireFox版本48.0

希望通过
testng.xml
文件实现并行测试执行


非常感谢您的帮助。

您需要对代码进行以下更改,以使其能够编译

  • 使用
    所需功能创建木偶河流对象
  • 使用其设置方法在
    ThreadLocal
    对象内设置此驱动程序对象
  • 如下图所示:

    if(BrowserName.equalsIgnoreCase("FireFox")) { 
      System.setProperty("webdriver.gecko.driver", "..//BrowserDrivers//wires");
      DesiredCapabilities capabilities = DesiredCapabilities.firefox();
      capabilities.setCapability("marionette", true);
    
      // Commented out below line from your code
      //Driver = new <ThreadLocal<WebDriver>> MarionetteDriver(capabilities);
      Driver.set(new MarionetteDriver(capabilities));
    }
    
    if(BrowserName.equalsIgnoreCase(“FireFox”){
    System.setProperty(“webdriver.gecko.driver”,“.//BrowserDrivers//wires”);
    DesiredCapabilities=DesiredCapabilities.firefox();
    能力。设置能力(“木偶”,真);
    //注释掉代码下面的行
    //驱动程序=新的木偶河流(能力);
    Driver.set(新的木偶河流(能力));
    }
    

    尝试此操作并让我知道

    据我所知,您使用ThreadLocal作为驱动程序的原因是什么?Thanks@Grasshopper:我正在尝试通过testng.xml使用WebDriver在不同浏览器实例中通过多线程运行并行测试。。由于驱动程序实例被每个TC覆盖,我对TC的断言在teardown方法中失败。所以我想为每个线程创建一个WebDriver的本地实例来传递TC的断言。感谢并为两人干杯…@Ag_Yoge,如果这对你有帮助,请接受这一回答