我有20张或更多张桌子。表的数量可以不同。要确定表数,我使用driver.findElements(By.xpath(...))。size()功能。
对于一个表,我创建了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;
}
在这种情况下,我的第一个表具有fileName =“ file name 1”。
我使用此对象断言可以通过Web搜索功能在数据库中找到表的每个值。对于搜索,我仅使用entry.getKey值,但在范围报告中使用fileName和entry.getValue来显示该值的位置。
我在这里将fileName硬编码,仅检查具有此fileName的表的值。
我想重复DataProvider和Test方法的“表数”次,每次使用从01开始的下一个表数。 我可以用不同的方式说:例如,我有20张桌子。我应该使用20个具有20个不同文件名的DataProvider,并且还应该使用不同的表名运行@Test(dataProvider =“ tableValues”)20次。我在一个大型DataProvider中无法获得20个表集。我可以这样做,但我不应该这样做,因为表的值可能会在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
}
}
答案 0 :(得分:0)
我在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;
}