0

DataProvider DataFactory を使用してテスト スイートを作成しましたが、TestNG ファイルがブラウザーの詳細をパラメーターとして送信しています。testNG XML では、データ ファクトリ クラスを呼び出しています。また、テストにbrowsestackを使用しています(ただし、これが私が抱えている問題と関係があるとは思えません)

parrellel="true" を testng ファイルに追加しなくても、テストは問題なく実行されます。

各ブラウザーで同じドライバーが使用されていることに関係があると感じていますが、現時点ではこれを解決することはできません。

任意のガイダンスをいただければ幸いです。

これがコードです。

TestNG.XML

<suite name="Suite" verbose="1" parallel="tests">
  <!-- Test with Chrome -->
  <test name="ChromeTest" group-by-instances="true"> 
    <parameter name="browser" value="Chrome"></parameter>
    <parameter name="browserVersion" value="47"></parameter>
    <parameter name="platform" value="Windows"></parameter>
    <parameter name="platformVersion" value="7"></parameter>
    <classes>
      <class name="Resources.TestFactory"/>
    </classes>
  </test> 

  <!-- Test with Firefox -->
  <test name="FirefoxTest" group-by-instances="true"> 
    <parameter name="browser" value="Firefox"></parameter>
    <parameter name="browserVersion" value="43"></parameter>
    <parameter name="platform" value="Windows"></parameter>
    <parameter name="platformVersion" value="7"></parameter>
    <classes>
      <class name="Resources.TestFactory"/>
    </classes>
  </test> 

</suite> 

データ ファクトリ クラス

public class TestFactory {
     @Factory(dataProvider = "LoginCredentials", dataProviderClass=TestData.class)
     public Object[] createInstances(int testNo, String userName, String password) {
         Object[] result = new Object[1];
         int i=0;
         System.out.println("Inside LoginCredentials Factory - " + userName + "---" + password);

         if(testNo==1){
             result[i] = new Test_BookingEngine_Login(userName, password);
             i++;
             System.out.println("Object Array : " + Arrays.deepToString(result));
         }
         else if(testNo==2){
             result[i] = new Test_BookingManagement_OpenBooking(userName);
             i++;
             System.out.println("Object Array : " + Arrays.deepToString(result));
         }
         System.out.println("outside for");
         return result;
     }
}

Suite - ドライバーの初期化

@BeforeTest
    @Parameters(value ={"browser", "browserVersion", "platform", "platformVersion"}) 
    public void initBrowser(String browser, String browserVersion, String platform, String platformVersion) throws Exception{

//Initializing browser in cloud
                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");

                driver = new RemoteWebDriver(new URL(URL), cloudCaps);

}

サンプルテスト

 public Test_BookingEngine_Login(String userName, String password) {  
        this.userName = userName;  
        this.password = password;  
    }  

    @Test (groups = {"Login"})
    public void testHomePageAppearCorrect() throws InterruptedException{

        //Starting test and assigning test category
        test = logger.startTest("Login to Temptation", "<b>Successful user login or Pop up advising incorrect login details</b><br/><br/>" + browserInfo)
        .assignCategory("Regression", "Booking Engine")
        .assignAuthor("Dinesh Cooray");

        System.out.println("Inside login test");
        System.out.println("Browser inside login test : ");

        driver.get("http://dev-thor2.tempoholidays.com/");
        test.log(LogStatus.INFO, "HTML", "Navigated to http://dev-thor2.tempoholidays.com/");

        //create Login Page object
        objLogin = new BookingEngine_Login(driver);

        //login to application
        objLogin.loginToTemptationBookingEngine(userName, password, test);

        //check if alert advising username or password is is incorrect
        try {
                //incorrect login details, user should not allow login
                if(driver.switchTo().alert().getText().toLowerCase().contains("user name or password is wrong")){
                    test.log(LogStatus.INFO, "HTML", "<b>Popup - </b>" + driver.switchTo().alert().getText());
                    driver.switchTo().alert().accept();
                    Assert.assertTrue(true);
            }
        }
4

1 に答える 1

1

RemoteWebDriver driver;クラスレベルで追加した行になると思います。何が起こっているかというと、クラス レベルで変数を既に宣言しているということです。つまり、メモリはすでに割り当てられています。このようなことを行うdriver = new RemoteWebDriver(new URL(URL), cloudCaps);と、すべての @BeforeTest で同じ変数の値を設定およびリセットするだけです。

必要なことは、渡すパラメーターに基づいて RemoteWebDriver のインスタンスを返すファクトリを作成することです。基本的に、ファクトリは新しいオブジェクトを作成し、既存のオブジェクトが存在しない場合にのみ戻ります。@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-19T05:00:08.020 に答える