在带有 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
这是我的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