我有20个或多个表。表的数目可能会有所不同。为了确定我使用driver.findElements表的数量(By.xpath(...))。大小()功能。
为一个表我创建的DataProvider方法,它返回一个对象:
@DataProvider
public Object[][] tableValues() throws Exception {
.........
int c = 0; // here I use HashMap<String, String> object
//filled with entry.getValue = column label, entry.getKey() = cell value of column
Object obj[][] = new Object[tableMap.size()][4];
print("========== DataProvider object generating...");
print("========== Size of tableMap: "+tableMap.size());
for (Map.Entry entry: tableMap.entrySet()) {
obj[c][0] = fileName;
obj[c][1] = entry.getValue();
obj[c][2] = entry.getKey();
obj[c][3] = false;
c++;
}
obj[tableMap.size()-1][3]=true;
return obj;
}
在这种情况下,我有了第表文件名=“文件名1”。
我用这个对象来断言表中的每个值可以在数据库通过网络搜索功能找到。对于搜索我只用entry.getKey值,但使用了文件和entry.getValue在某种程度上报告显示,其中价值所在。
我硬编码的文件名在这里,只为与该文件名表校验值。
我想重复这两个的DataProvider和试验方法“号码表”次,每次使用从01开始下一个表号,我可以说,它以不同的方式为:举例来说,我已经得到了20桌。我应该使用20周的dataProvider用20页不同的文件名,我应该跑@Test(数据提供程序=“tableValues”)的20倍还与不同的表名。我不能让20张桌椅在一个大的DataProvider。我能做到这一点,但我不应该这样做,因为表值的10-20分钟后会发生变化,因此可以改变测试结果。我得到的行数限制和快速检查。然后我去到另一个表中读取值,断言值等。
@Test(dataProvider = "tableValues")
public void ValuesAsserting(String fileName, String columnName, String cellValue, boolean flag) throws Exception {
if (cellValue != null) { //Steps:
inputField(cellValue, "searchFieldXpath"); //1
buttonClick("searchButtonXpath"); //2
waitLoaderDisplayed(); //3
waitLoaderHidden(); //4
print("Verifying "+fileName+": "+columnName+": "+cellValue);
logger = extent.createTest("Verifying of "+fileName+" value: "+"\n"+columnName+": "+cellValue);
assertValueIsInResults(cellValue,"searchResultsXpath"); //5
// asserts file's generation time before and after testing
scanTimeAssert(flag); //After tests
}
}
我发现TestNG的文档中的解决方案。 @Factory注释有助于解决这个问题。
// It is my main class Factory provides with file's number required for xpath to open it and go further:
public class AllTablesTest extends BaseTest {
// It is the main thing I added to get it worked within factory:
private int fNumber;
public AllTablesTest(int fileNumber) {
this.fNumber = fileNumber;
}
........
}
// WebTestFactory class I get from TestNG documentation and changed it to get desirable number of files:
public class WebTestFactory extends BaseTest{
int numberOfFiles;
@Factory
public Object[] createInstances() throws Exception {
getDriver("Chrome");
getUrl("adminUrl");
login(getValue("adminEmail"),getValue("adminPass"));
numberOfFiles = getNumberOfFiles();
Object[] result = new Object[numberOfFiles];
for (int i=0; i<numberOfFiles; i++) {
result[i]=new AllTablesTest(i+1);
}
return result;
}