我正在尝试在第11列中的数据位于第1列的表格中找到一个链接
经过多次狩猎后,我发现以下代码符合我的需求
IWebElement table = driver.FindElement(By.XPath("//*[@id='NewBusinessDetailRecords']"));
IList <IWebElement> rows = table.FindElements(By.TagName("tr"));
foreach (IWebElement row in table)
{
rows = table.FindElements(By.TagName("tr"));
IList<IWebElement> cells = row.FindElements(By.TagName("td"));
if (cells[10].Text.Equals("103"))
{
cells[0].Click();
}
}
但是,foreach语句无效突出显示错误的表
foreach语句不能对'OpenQA.Selenium.IWebElement'类型的变量进行操作,因为'OpenQA.Selenium.IWebElement'不包含'GetEnumerator'的公共定义
有几个帖子建议我需要使用IEnumerable(还有一些建议这应该是自动的)但我还没有设法将其实现到我的代码中。
感谢任何帮助
编辑:
来自1个表格行的示例HTML
<table id="NewBusinessDetailRecords" cellspacing="0" style="width:100%;" class="listviewgrid">
<thead> ... </thead>
<tbody>
<tr id="0" class="datagriddetail">
<td style="text-align: center">
<a href="" accesskey="1" style="cursor: pointer; cursor: hand;" onclick="CopyNewBusinessDetailRecord(0, 0, 1083406, 14436); return false;" title="Matched to Invoice with ID = 14436; Client with ID = 1083406"><img src="../../images/icons/invoice.png" border="0"></a> </td>
<td> Test1 Case1 </td>
<td> Invoice </td>
<td> GBP </td>
<td style="text-align: right"> 600.00 </td>
<td> 0% </td>
<td style="text-align: right"> 600.00 </td>
<td> </td>
<td> Company Name </td>
<td> UserName</td>
<td> 103 </td>
<td> </td>
<td> </td>
<td> </td>
<td style="text-align: center"> </td>
</tr> <tr id="0" class="datagriddetail">
答案 0 :(得分:1)
您有此错误,因为foreach
仅适用于IEnumerable
类型
foreach (IWebElement row in table)
肯定会失败,因为table
是IWebElement
,而且显然是单个对象。
这里你需要的是删除不必要的foreach
循环,就像这样(第0行第10列):
var row = driver.FindElement(By.CssSelector("table#NewBusinessDetailRecords tr#0"));
var cells = row.FindElements(By.TagName("td")).ToList();
if (cells[10].Text.Equals("103"))
{
cells[10].Click();
}
我无法肯定地告诉你,因为我没有你需要点击的元素的HTML代码,但我认为你的所有代码都可以替换为:
driver.FindElement(By.LinkText("103")).Click();
或者,如果您只想指定链接文本的一部分:
driver.FindElement(By.PartialLinkText("10")).Click();
答案 1 :(得分:1)
您想要对<tr>
中的每个<table>
进行迭代。您应该遍历rows
,而不是table
:
foreach (IWebElement row in rows)
此外,您还需要删除此无关的行:rows = table.FindElements(By.TagName("tr"));
。在foreach循环“内部”后,row
变量包含要处理的<tr>
IWebElement
。
根据您的示例HTML,我还提出了一些建议:
我会尽可能避免使用XPath。在您的情况下,只需按ID进行选择。
IWebElement table = driver.FindElement(By.Id("NewBusinessDetailRecords"));
在编制索引cells
之前添加验证。这会阻止ArgumentOutOfRangeException
。
if (cells.Count > 10 && cells[10].Text.Equals("103"))
完整代码:
IWebElement table = driver.FindElement(By.Id("NewBusinessDetailRecords"));
IList<IWebElement> rows = table.FindElements(By.TagName("tr"));
foreach (IWebElement row in rows)
{
IList<IWebElement> cells = row.FindElements(By.TagName("td"));
if (cells.Count > 10 && cells[10].Text.Equals("103"))
{
cells[0].Click();
}
}