我已经检查了很多答案但是所有人都使用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#中,则上面似乎很好。
答案 0 :(得分:1)
有几个问题。
您无需链接.FindElement()
个电话。在一次搜索中获取TR
的效率更高,例如通过CSS选择器#nt-item-table tr
。
您在.ToList()
来电后拨打.FindElements()
,这是不必要的,不起作用。它在IDE中显示错误。
当您只需要<= TableRows.Count
时,您正在迭代到<
。索引从0开始。
您无法使用数组表示法访问IReadOnlyCollection
中的元素,例如TableRows[i]
。您需要使用LINQ
和ElementAt(i)
。
您已经找到了TR
个元素,driver.FindElement(TableRows[i])....
这样的陈述毫无意义。
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);
}
你真的应该花一些时间阅读一些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。