在带有 Java 的 Selenium 中使用 @Factory 注释后无法 运行 测试

Not able to run tests after using @Factory annotation in Selenium with Java

这是我的class的结构:

package com.gex.base.helper;

public class InitializeDriver extends BrowserFactory 
{

    HashMap<String, String> authenticationMap;

    @Factory(dataProvider="authentication", dataProviderClass=DataProviderList.class)
    public InitializeDriver(String userName, String uPassword)
    {
        authenticationMap=new HashMap<String, String>();
        authenticationMap.put("UserName", userName);
        authenticationMap.put("Password", uPassword);
    }


    @BeforeTest
     public void Gexlogin() 
      {
          LoginPF objLogin=PageFactory.initElements(BrowserFactory.driver, LoginPF.class);
           System.out.println("Logging into GEx");
           objLogin.loginToDGEx(authenticationMap.get("UserName"), authenticationMap.get("Password"));
          System.out.println("Successfully Logged into GEx");
    }

    @AfterTest
    public void directLogout(){

        // logout from application
        LogoutPF objLogoutTest = PageFactory.initElements(BrowserFactory.driver, LogoutPF.class);
        objLogoutTest.LogOffGEx();
        extent.flush();
        driver.close();
    }
}

LoginToGEx 是另一个 class 中的函数,例如:

public void loginToGEx(String strUsername, String strPassword)
{
    username.sendKeys(strUsername)
    password.sendKeys(strPassword);
    loginButton.click();
    System.out.println("Successfully Logged into GEx");
}

DataProviderClass

public class DataProviderList {

    @DataProvider(name="authentication")
    public static Object[][] authentication()
    {
        return new Object[][] {
            {"abc", "123"}, 
            {"xyz", "456"},
            };
    }

}

在另一个 class 中有 @Test 扩展 InitializeDriver class。

    public class SampleTest extends InitializeDriver {

        public SampleTest(String userName, String uPassword) {
            super(userName, uPassword);
            // TODO Auto-generated constructor stub
        }

        @Test
        public void CreateNewEngTest() throws InterruptedException
        {
            test=extent.createTest("Eng Test","Create Eng Test");
            -Code (which is working fine before using @Factory)-----------------------

Testng.xml结构:

<suite name="Sample Project" verbose="1" >

   <test name="Sample Test" group-by-instances="true" preserve-order="true">
  <classes>
            <class name="com.gex.base.testscripts.SampleTest" />                     
  </classes>
</test>
</suite>

我的问题是: 在将 @Factory 与数据提供者一起使用之前——我的测试是 运行ning 正常,但是当我使用 @Factory 注释时,什么也没有发生。 在 SampleTest Class 中,此构造函数会自行创建。可能会导致问题。

public SampleTest(String userName, String uPassword) {
            super(userName, uPassword);
            // TODO Auto-generated constructor stub
        }

请指导如何使用@Factory

进行测试运行

还有一件事 如果我用我的@test 场景定义工厂注解然后每次我需要登录..我有很多测试用例并且想要 运行登录一次执行所有@test 场景然后注销并使用另一组用户名和密码重新开始...不是每次@test 启动时。这种情况可能吗?再次感谢

它不起作用,因为你用 @Factory 注释注释了构造函数,然后使用了继承。

为了保持继承等,你应该用 @Factory

注释 SampleTest class

像这样:


public class SampleTest extends InitializeWebDriver {
    private String userName, password;

    @Factory(dataProvider="authentication", dataProviderClass=DataProviderList.class)
    public SampleTest(String userName, String password) {
        super(userName, password)
    }
}


public class InitializeDriver extends BrowserFactory {
    private String userName, password;

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

}

这将导致 @Factory 将参数从 DataProvider 传递到您的 InitializeDriver class 并将其保存为实例变量。

然后您可以像在 @BeforeTest 方法中那样使用这些变量:

@BeforeMethod
public void Gexlogin() {
     LoginPF objLogin=PageFactory.initElements(BrowserFactory.driver, LoginPF.class);
     System.out.println("Logging into GEx");
     objLogin.loginToDGEx(userName, password); //changed to instance variables
     System.out.println("Successfully Logged into GEx");
}

编辑: @BeforeTest 方法只会执行一次,因为 TestNG 将 @Factory 测试视为单个测试用例! 如果要在每次考试前登录,需要使用@BeforeMethod