当前位置: 首页 > 知识库问答 >
问题:

使用TestNG进行并行测试-测试仅在一个浏览器上运行

孟鹏海
2023-03-14

我已经创建了一个测试套件,使用数据提供商数据工厂和我的TestNG文件发送浏览器详细信息作为参数。在testNG XML中,我调用我的数据工厂类。我也在使用浏览器堆栈进行测试(尽管我怀疑这与我遇到的问题有关)

当我不向testng文件添加parrelell=“true”时,测试运行没有任何问题。

我有一种感觉,这与每个浏览器使用的是同一个驱动程序有关,但我目前无法解决这个问题。

感谢您的指导。

这是密码。

<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;
     }
}
@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);
            }
        }

共有1个答案

刘绍晖
2023-03-14

我猜是RemoteWebDriver 将是您在类级别添加的一行。现在的情况是,您已经在类级别声明了变量。i、 e.内存已分配给它。当你这样做时,driver=newremotewebdriver(newurl,URL,cloudCaps) 您只是在每个@BeforeTest中设置和重置同一变量的值

您需要做的是创建一个工厂,该工厂将根据您传递给它的参数返回RemoteWebDriver的实例。本质上,工厂将创建一个新对象,并仅在现有对象不存在时返回。在@Test Methods中声明并初始化驱动程序(出厂)

工厂的示例代码如下

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;
}
}
}

 类似资料:
  • 问题内容: 我正在将Selenium WebDriver与Java和TestNG框架一起使用。我想一次在一个代码中使用Firefox,IE,Chrome来进行跨浏览器测试。我只能将Firefox初始化为 但无法以相同方式初始化其他浏览器。例如: 给出错误 给出错误 如何初始化IE和Chrome并在所有所需的浏览器中执行测试? 问题答案: 对于C# 加 创建一个包含浏览器名称的配置文件。实现与配置文

  • 我试图用TestNG并行运行一个示例测试项目。但它是在一个线程中顺序执行的。我漏掉什么了吗? 谢了。

  • 我正在探索硒网格,用于在多个浏览器上执行测试。我已经按照在线教程配置了集线器和节点。我已经创建了一个测试脚本。 这是测试脚本的代码: 我的目标是在多个浏览器上运行此测试,我已经添加了所需的功能,如火狐, 感谢任何帮助

  • 我正在使用GEB/Spock进行自动化测试。我正在使用Gradle作为我的构建工具。 我想调用不同的gradle任务来构建和运行一个特定的规范(测试)或一套规范。 显然,已经有了现有的构建指令,因为我可以调用,而且所有的规范都在Chrome上运行,我只是不知道如何添加更多的任务

  • 我试图在浏览器堆栈上运行多个浏览器上的E2E测试,我参考了在量角器中的多个/并行浏览器上的E2E测试?和Internet Explorer Selenium量角器e2e测试 但每次我试着运行测试时都会犯错- 谁能告诉我什么是我做错了这里,而且我们使用gulp ti运行规范,但我的问题是它是说,甚至没有超出认证。

  • 问题内容: 我找不到有关如何进行设置的任何信息,但这似乎是一个非常基本的概念,所以我敢肯定有一个答案。 我知道如何通过在配置中设置对象的属性来在不同的浏览器上运行量角器。而且效果很好。我可以将其设置为or 或我需要的任何值,并且它可以按预期运行。但是,对多个浏览器运行单个测试套件的唯一方法(据我所知)是创建单独的配置文件,每个配置文件具有不同的配置文件,然后使用各自的配置运行每个浏览器。这行得通,