有人可以告诉我哪种方法有助于验证HTML表格。我必须编写与使用selenium添加/删除/编辑HTML表相关的测试用例。
名称和分支可能重复,唯一标识行的唯一方法是使用id(第一列)。
我正在使用页面对象模式,因此我需要编写用于添加/编辑/删除和验证该行是否存在的函数。
对于这种情况有没有更好的方法。
答案 0 :(得分:0)
对于添加测试用例,您可以在PageObject中创建一个函数,该函数返回名称字段中具有相同值的行数。 在您的测试用例中,
作为附加检查,您还可以在添加之前存储表中的总行数,并检查该值是否也在编辑后增加了一个(确保在此过程中没有替换记录)。
注意:如果您正在使用PageFactory,您还可以使用表中的行创建IList,并使用其count属性而不是创建计数功能。
修改:您的添加方法可以存储在PageObject中,以便将其与断言分开。即使您返回了ID,但在添加记录之前不知道表格中的内容,单独的单独验证也没有多大用处。
答案 1 :(得分:0)
因此,如果没有看到此表的html,我将不得不做出一些假设。看起来ID列是超链接,因此它们的xpath与其他单元格略有不同。好的,所以解决方案。
我们首先需要考虑如何从表中存储数据。你想要一些易于使用的二维物体。我喜欢使用HashMap来存储各行。 HashMap将信息存储在无序的键值对中。它们的Key是列的名称,Value将是该行的单元格的值。
为了存储一个表的数据,我会将每个存储在不同HashMaps中的行放入一个ArrayList中。
现在讨论如何抓取数据,最快的解决方案始终是查找和调用Selenium的次数最少的解决方案。在这种情况下,由于你对表有各种各样的怪异,我会用一次查找来定位所有数据单元。
在没有看到HTML的情况下,我的xpath看起来像// table [@ id ='something'] / tbody / tr / td [1] / a | // table [@ id ='something'] / tbody /tr/td [not(./a[./text()='View'或./text()='Edit'或./text()='Delete'])] Pipe符号将2个xpath连接在一起,因此它将以正确的顺序定位两种类型的单元格。
这是我的通用TableData类。您可以创建此类的实例来存储数据。数据本身存储在_data对象中。
public class TableData {
public ArrayList<HashMap<String, String>> _data;
public TableData(ArrayList<HashMap<String, String>> data) {
_data = data;
}
public static TableData get_SiteTable_ByCell(WebDriver driver, By tableCells, String[] headerValues) {
ArrayList<WebElement> tableCellElements = new ArrayList<WebElement>(driver.findElements(tableCells));
ArrayList<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
int numberRows = tableCellElements.size() / headerValues.length;
for (int i = 0; i < numberRows; ) {
HashMap<String, String> newRow = new HashMap<>();
for (int j = 0; j < headerValues.length; j++, i++) {
newRow.put(headerValues[j], tableCellElements.get(i).getText());
}
data.add(newRow);
}
return new TableData(data);
}
}
现在我们有了获取数据的方法,我需要传入的值是......
public TableData getTable(WebDriver driver)
{
String[] headers = {"ID", "Name", "Branch"};
By cellsBy = By.xpath("//table[@id='something']/tbody/tr/td[1]/a|//table[@id='something']/tbody/tr/td[not(./a[./text()='View' or ./text()='Edit' or ./text()='Delete'])]");
return TableData.get_SiteTable_ByCell(driver, cellsBy, headers);
}
好的,现在我们想获得一个特定的行。我需要编写一个方法来返回给定条件的HashMap。这也将在之前的TableData类中进行。
public HashMap<String, String> returnRow(String columnName, String columnValue){
for(HashMap<String, String> row : _data){
if(row.get(columnName).equals(columnValue)){
return row;
}
}
return null;
}
所以现在我拥有了所有这些,我的代码看起来像......
@Test
public void newTest1()
{
TableData customerTable = getTable(driver);
HashMap<String, String> rowWeWant = customerTable.returnRow("ID", "1");
String valueWeWant = rowWeWant.get("Name");
}