Selenium webdriver通过匹配其他列的文本获取同一行中相邻列的文本

时间:2014-12-30 18:18:13

标签: java c# html selenium selenium-webdriver

我正在使用Selenium Webdriver为asp.net mvc网站编写集成测试。我正在使用C#,但在C#或Java中的答案将不胜感激。 我附上了html表和生成的html代码。

我想使用webdriver 点击组名“ bcde ”的修改链接。要点击该链接,我需要ID(2138)&不是组名(bcde)。 我试过了

driver.FindElements(By.XPath("//tr[contains(td[2], 'bcde')]/td[1]").ToList()[0])

但是它给出了2137,abcde的id(按字母顺序排列第一组包含查找字符串“bcde”)。 我需要完全匹配的组名“ bcde ”的ID 2138。

enter image description here

<table class="table">
           <tr>
            <th>
                Group id
            </th>
            <th>
                Group Name
            </th>
            <th>

            </th>
    </tr>

        <tr>
            <td>
                2137
            </td>
            <td>
                abcde
            </td>
            <td>
                        <span><a href="/Group/Edit/2137" id="lnkGroupEdit">Edit</a> | </span>
                        <span> <a href="/Instrument?groupID=2137" id="lnkGroupDelete">Delete</a> | </span>
            </td>
        </tr>
        <tr>
            <td>
                2138
            </td>
            <td>
                bcde
            </td>
            <td>
                        <span><a href="/Group/Edit/2138" id="lnkGroupEdit">Edit</a> | </span>
                        <span> <a href="/Delete?groupID=2138" id="lnkGroupDelete">Delete</a> | </span>
             </td>
        </tr>
        <tr>
            <td>
                2139
            </td>
            <td>
                a bcde f
            </td>
            <td>
                        <span><a href="/Group/Edit/2139" id="lnkGroupEdit">Edit</a> | </span>
                        <span> <a href="/Instrument?groupID=2139" id="lnkGroupDelete">Delete</a> | </span>
            </td>
        </tr>
</table>

3 个答案:

答案 0 :(得分:1)

试试这个。

//tr/td[contains(.,'2137')]/..//span/a[.='Edit']

请注意.请参阅我的解释here..中的xpath可让您轻松地来回查看html层次结构。我使用了contains,因为td的值为whitespaces

修改 试试这个。好像它是一个等待问题

By byXpath = By.XPath("//tr/td[contains(.,'2137')]/..//span/a[.='Edit']");
new WebDriverWait(Driver,TimeSpan.FromSeconds(10)).Until(ExpectedConditions.ElementExists(byXpath)).Click();

第二次修改 最有趣的是,您尝试点击的a标记包含相应的id。因此,此问题的最佳解决方案是根据我的理解使用以下xpath

//a[contains(@href,'2138')][.='Edit']

答案 1 :(得分:1)

下面为我修好了。

  driver.FindElement(By.CssSelector("a[href=\"/Group/Edit/" + driver.FindElements(By.XPath("//tr[contains(td[2], 'bcde')]/td[2]")).Where(t => t.Text.Equals(groupName)).ToList()[0].FindElement(By.XPath("..")).FindElement(By.XPath(".//td[1]")).Text + "\"]")).Click();

.FindElement(By.XPath(".."))找到父元素。

**.//**搜索所有子元素。 因此,FindElement(By.XPath(".//td[1]"))为第一个类型为 td 的孩子提供。

答案 2 :(得分:0)

answer给了我们一些帮助。

由于我们看到文本周围的空白,找到确切的文本匹配有点繁琐。 XPath函数normalize-space()清除元素文本中的空格。

要找到包含&#34; bcde&#34; 的组名表格单元格,请使用xPath字符串

//td[normalize-space() = 'bcde']

对于与该组名称相关联的单元格中的Group Id,请使用XPath字符串查看前一个单元格

//td[normalize-space() = 'bcde']/preceding-sibling::td

对于编辑链接,我们可以使用此XPath字符串

在以下单元格中找到它
//td[normalize-space() = 'bcde']/following-sibling::td//a[contains(.,'Edit')]