首页 > 解决方案 > Selenium + Java:具有登录功能的测试用例的并行执行

问题描述

我有一个需要登录的应用程序,并且不允许在给定时间多次登录同一帐户。所以我有多达 60 个这样的测试用例。目前我正在处理它们的并行执行,如下所示:

我想出了这种方法来避免每个测试用例的登录/注销步骤,并使用单个凭据集使并行执行成为可能。

现在这个方法工作得很好,但我在想是否还有其他替代方法,因为一个线程在整个执行时间内被@BeforeSuite 驱动程序对象占用,因为我只在执行结束时关闭该对象。??想要利用所有线程进行并行执行。

这是代码:

公共类 TestConfigs {

protected static SelectEnv loadedEnv;
protected static BrowserManager factory;
protected static String url = null;
private static Set<Cookie> cookies;

@BeforeSuite(alwaysRun = true)    
public void startSuite() {      
    try{            
        loadedEnv = ConfigFactory.create(SelectEnv.class);

        //Initiate browser
        factory = BrowserManager.getInstance();         
        factory.setAnyDriver("chrome"); 
        factory.getDriver().get(ConfigFactory.getProperty("url"));

        Login login = new Login(factory.getDriver(), db);
        //Logging in 
        login.verifyLogin(loadedEnv.usernameAU(), loadedEnv.password(), 
                  loadedEnv.accesscode()); 
         Thread.sleep(5000);

        //Saving cookies                
        cookies = factory.getDriver().manage().getCookies();


    }catch(Exception e) { 
        System.out.println("Exception in @BeforeSuite method");
        e.printStackTrace();
    }

  }



@BeforeMethod(alwaysRun = true)
public synchronized void testSetup(Method method, Object[] obj) {
    try {   
        System.out.println("********* In Before Method***************");

        //Initiate browser
        factory = BrowserManager.getInstance();
        // Initiate browser
        factory.setAnyDriver("chrome");
        factory.getDriver().get(url);

        if(cookies!=null) {
            cookies.forEach( cookie -> factory.getDriver().manage().addCookie( cookie ));
            factory.getDriver().get(url);               
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

}

@AfterMethod(alwaysRun = true)
public void cleanUp() {

    factory.getDriver().close();
    factory.getDriver().quit();


}


@AfterSuite(alwaysRun = true)
public void afterSuiteCleanup() {       
    if(factory!=null && factory.getDriver() !=null) {
        factory.getDriver().close();
    }       
}

}

标签: javaselenium-webdrivertestngparallel-execution

解决方案


您可以按照https://www.baeldung.com/java-synchronized中的说明创建同步方法。

使用同步方法,一次只能有一个线程使用该方法。从而确保一次只发生一次登录。

因此,如果您转换login.verifyLogin()为同步方法,这应该可以工作。


推荐阅读