1

すべてのテストが完了したらブラウザを閉じたいです。問題は、ThreadLocal ドライバーで作成されたオブジェクトが、null を返すテストの完了後にドライバーを認識しないため、ブラウザーを閉じることができないことです。

以下は私の作業コードです

package demo;

import java.lang.reflect.Method;
import org.openqa.selenium.By;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class ParallelMethodTest {
    private static ThreadLocal<dummy> driver;
    private int input;
    private int length;

    @BeforeMethod
    public void beforeMethod() {
        System.err.println("Before ID" + Thread.currentThread().getId());
        System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
        if (driver == null) {
            driver = new ThreadLocal<dummy>();
        }
        if (driver.get()== null) {
            driver.set(new dummy());
        }

    }

    @DataProvider(name = "sessionDataProvider", parallel = true)
    public static Object[][] sessionDataProvider(Method method) {
        int len = 12;

        Object[][] parameters = new Object[len][2];
        for (int i = 0; i < len; i++) {
            parameters[i][0] = i;
            parameters[i][1]=len;

        }
        return parameters;
    }

    @Test(dataProvider = "sessionDataProvider")
    public void executSessionOne(int input,int length) {
        System.err.println("Test ID---" + Thread.currentThread().getId());
        this.input=input;
        this.length=length;
        // First session of WebDriver
        // find user name text box and fill it
        System.out.println("Parameter size is:"+length);
        driver.get().getDriver().findElement(By.name("q")).sendKeys(input + "");
        System.out.println("Input is:"+input);

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    @AfterMethod
    public void afterMethod() {
    System.err.println("After ID" + Thread.currentThread().getId());
    driver.get().close();

    }


}

package demo;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterClass;

public class dummy  {

    public WebDriver getDriver() {
        return newDriver;
    }

    public void setNewDriver(WebDriver newDriver) {
        this.newDriver = newDriver;
    }

    private WebDriver newDriver;

    public dummy() {
        newDriver = new ChromeDriver();
        newDriver.get("https://www.google.co.in/");
    }

    @AfterClass
    public void close(){
        if(newDriver!=null){
            System.out.println("In After Class");
            newDriver.quit();
        }
    }
}

前もって感謝します。

4

3 に答える 3

2

private static ThreadLocal<dummy> driverクラスレベルで追加されます。何が起こっているかというと、クラス レベルで変数を既に宣言しているということです。つまり、メモリはすでに割り当てられています。複数のスレッドが同じ変数の値を設定およびリセットしているだけです。

必要なのは、渡すパラメーターに基づいて Driver のインスタンスを返すファクトリを作成することです。ロジックは何でもかまいませんが、一般的なユースケースの例を取り上げると、ファクトリは新しいオブジェクトを作成し、既存のオブジェクトが存在しません。@Test メソッドで (ファクトリから) ドライバーを宣言して初期化します。

工場のサンプルコードは次のようになります

static RemoteWebDriver firefoxDriver;
static RemoteWebDriver someOtherDriver;


static synchronized RemoteWebDriver getDriver(String browser, String browserVersion, String platform, String platformVersion)
{
if (browser == 'firefox')
{
  if (firefoxDriver == null)
  {
                DesiredCapabilities cloudCaps = new DesiredCapabilities();
                cloudCaps.setCapability("browser", browser);
                cloudCaps.setCapability("browser_version", browserVersion);
                cloudCaps.setCapability("os", platform);
                cloudCaps.setCapability("os_version", platformVersion);
                cloudCaps.setCapability("browserstack.debug", "true");
                cloudCaps.setCapability("browserstack.local", "true");

                firefoxDriver = new RemoteWebDriver(new URL(URL),cloudCaps); 
}
}
else
{
if (someOtherDriver == null)
  {
                 DesiredCapabilities cloudCaps = new DesiredCapabilities();
                cloudCaps.setCapability("browser", browser);
                cloudCaps.setCapability("browser_version", browserVersion);
                cloudCaps.setCapability("os", platform);
                cloudCaps.setCapability("os_version", platformVersion);
                cloudCaps.setCapability("browserstack.debug", "true");
                cloudCaps.setCapability("browserstack.local", "true");

                someOtherDriver = new RemoteWebDriver(new URL(URL),cloudCaps); 
}
return someOtherDriver;
}
于 2016-02-19T10:04:05.303 に答える
0

これは、関数内でドライバー インスタンスを作成しているためbeforeMethod、関数の終了後にスコープが終了するために発生しています。

beforeMethodしたがって、関数が既に完了しているため、webdriver インスタンスが既に破棄されているため、afterMethod が開始すると null になります。

以下のリンクを参照してください: -

http://www.java-made-easy.com/variable-scope.html

Javaのメソッドのデフォルトのスコープは何ですか?

于 2016-02-09T09:17:21.810 に答える