使用Selenium验证HTML表

时间:2017-01-15 10:02:34

标签: selenium selenium-webdriver webdriver

有人可以告诉我哪种方法有助于验证HTML表格。我必须编写与使用selenium添加/删除/编辑HTML表相关的测试用例。

表格如下 enter image description here

名称和分支可能重复,唯一标识行的唯一方法是使用id(第一列)。

我正在使用页面对象模式,因此我需要编写用于添加/编辑/删除和验证该行是否存在的函数。

  1. 我应该如何编写添加记录的函数,然后编写一个单独的函数来验证是否已成功添加记录。由于名称可能重复,我无法验证表中是否存在名称。另一种方法是,我添加记录后返回最后一行的ID。然后我可以验证最后一个ID上的名字是否与我最近添加的名称相同。然而,这种方法也存在一些问题。
  2. 对于这种情况有没有更好的方法。

2 个答案:

答案 0 :(得分:0)

对于添加测试用例,您可以在PageObject中创建一个函数,该函数返回名称字段中具有相同值的行数。 在您的测试用例中,

  1. 将此号码存储在变量
  2. 添加记录
  3. 返回网格屏幕,再次调用行计数功能,将其与存储值进行比较
  4. 必须是存储值+ 1,否则出现问题。
  5. 作为附加检查,您还可以在添加之前存储表中的总行数,并检查该值是否也在编辑后增加了一个(确保在此过程中没有替换记录)。

    注意:如果您正在使用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");

}