Selenium c#查找表中的链接

时间:2017-05-24 13:46:11

标签: c# selenium selenium-webdriver

我正在尝试在第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">      

2 个答案:

答案 0 :(得分:1)

您有此错误,因为foreach仅适用于IEnumerable类型

foreach (IWebElement row in table)肯定会失败,因为tableIWebElement,而且显然是单个对象。

这里你需要的是删除不必要的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();
    }
}