Atata - 处理表行很慢

时间:2018-02-15 16:50:31

标签: c# automated-tests atata

关于Atata框架的另一个问题。我发现表格的加载速度很慢。那里有一张大约一张桌子。 1000行,每当我对检索到的行进行任何操作时,似乎引擎再次加载表。

缓慢的示例代码:

var row = _page.Inventory.Rows[x => x.Text == "some inventory"];
row.Should.Exist(); // that statement takes the same time as the above one and is slow...

我用于表格的代码:

[FindByCss(".invGrid")]
public Table<GroupsRow, Page> Inventory { get; set; }

我试图找到任何方便的方法来急切地加载数据,但是找不到任何方法。

我的问题是:

  1. 有没有办法急切加载这行?
  2. 有没有办法让表加载更快?

1 个答案:

答案 0 :(得分:3)

目前Table.Rows[predicate]在检查每一行时对大型表的工作缓慢。它适用于小桌子。可能我会更新它以便将来更快地工作,但它不是那么容易,所以它现在被推迟了。还有另一种快速方法可以执行单个XPath命令:

  1. 使用索引器:public TItem this[params string[] cellValues]

    _page.Inventory.Rows["some inventory"]
    

    它将找到包含传递值的单元格的第一行。 但它可能是不准确的,因为它使用'包含'谓词,如果你 表中有类似的字符串值。

  2. 使用方法:public TItem GetByXPathCondition(string itemName, string xPathCondition)

    string itemName = "some inventory";
    
    _page.Inventory.Rows.GetByXPathCondition(
        itemName,
        $".//span[contains(concat(' ', normalize-space(@class), ' '), ' item-name ')][normalize-space(.) = '{itemName}']")
    

    该示例查找包含<tr>所需文本的<span class="item-name">

    这种方法准确,但sytax更复杂。

  3. 您可以通过解压缩使上述示例更易于使用 扩展方法:

    public static class TableRowListExtensions
    {
        public static SomePage.GroupsRow GetByName(this TableRowList<SomePage.GroupsRow, SomePage> rowList, string name)
        {
            return rowList.GetByXPathCondition(name, $".//span[contains(concat(' ', normalize-space(@class), ' '), ' item-name ')][normalize-space(.) = '{name}']");
        }
    }
    

    然后在测试中使用它:

    _page.Inventory.Rows.GetByName("some inventory")
    

    它应该快速准确。

  4. 我还建议您在单个类使用CSS选择器时使用[FindByClass("invGrid")]属性而不是[FindByCss(".invGrid")]FindByCssAttribute在Atata中运行速度稍慢,因为与大多数其他查找属性相比,它执行了一个额外的WebDriver命令。