使用c#Selenium中的for循环遍历行和单元格

时间:2017-10-31 11:26:49

标签: c# selenium selenium-webdriver

我已经检查了很多答案但是所有人都使用foreach循环来遍历行。我想使用for循环。

代码:

IWebElement NtTable = driver.FindElement(By.Id("nt-item-table"));
IReadOnlyCollection<IWebElement> TableRows = NtTable.FindElements(By.TagName("tr")).ToList();

for (int i = 0; i <= TableRows.Count; i++)
{
    //driver.FindElement(TableRows[i])....
    //Tablows.get(i)....

}

我在上面评论了2行,从特定TR获取特定TD的文本,但在按(.)后似乎没有得到任何属性。如果我使用Java而不是在C#中,则上面似乎很好。

2 个答案:

答案 0 :(得分:1)

有几个问题。

  1. 您无需链接.FindElement()个电话。在一次搜索中获取TR的效率更高,例如通过CSS选择器#nt-item-table tr

  2. 您在.ToList()来电后拨打.FindElements(),这是不必要的,不起作用。它在IDE中显示错误。

  3. 当您只需要<= TableRows.Count时,您正在迭代到<。索引从0开始。

  4. 您无法使用数组表示法访问IReadOnlyCollection中的元素,例如TableRows[i]。您需要使用LINQElementAt(i)

  5. 您已经找到了TR个元素,driver.FindElement(TableRows[i])....这样的陈述毫无意义。

  6. Tablows不是您定义的变量名称。变量为TableRows

    IReadOnlyCollection<IWebElement> TableRows = Driver.FindElements(By.CssSelector("#nt-item-table tr"));
    for (int i = 0; i < TableRows.Count; i++)
    {
        // do something with TableRows.ElementAt(i);
    }
    
  7. 你真的应该花一些时间阅读一些Selenium和基本的C#编程教程,语法参考等。它将帮助你避免很多这些问题。

答案 1 :(得分:0)

我将变量更改为启动lowercase (camelcase)并尝试过此操作。由于您已经有一个包含子元素(td)的tr元素列表

IWebElement ntTable = driver.FindElement(By.Id("nt-item-table"));
IReadOnlyCollection<IWebElement> tableRows = ntTable.FindElements(By.TagName("tr")).ToList();

for (int i = 0; i <= tableRows.Count; i++)
{
    var tdCollection = tableRows[i].FindElements(By.TagName("td"));

    for (int c = 0; c <= tdCollection.Count; c++)
    {
        string column = tdCollection[c].Text;
    }
}

我更喜欢foreach。因为那时你不需要索引int。