根据表量角器中的两个单元格值查找元素

时间:2018-01-08 18:22:37

标签: selenium protractor

我处于一种奇怪的情况,我的行中有多个具有相似值的行,我需要在第一个单元格中选择与文本“Protractor”链接的元素,在同一行的第二个单元格中选择文本“NewAge”。 / p>

<table width="100%" border="0" cellspacing="0" cellpadding="2" class="resultsTable"><tr><td>
        <a href = "Mytitle.aspx">Protractor</a>
        <td>NewAge</td>
        </tr>
    <tr><td>
    <a href = "NewMytitle.aspx"> NewProtractor </a>
        <td>NewAge</td>
        </tr>
    <tr><td>
    <a href = "NewProtTile.aspx">Protractor</a>
        <td>NewAge World</td>
        </tr></table> 

现在我希望根据第一个和第二个单元格中的文本值选择我的超链接元素,即'Protractor'和'NewAge'

我想使用精确的文本搜索而不是包含文本,因为许多其他行具有相似的值 这是Chrome返回的xpath。

//*[@id="PageContent"]/table/tbody/tr[2]/td/table/tbody/tr[3]/td[1]/a

我尝试使用xpath在第一个单元格中选择文本为“量角器”的链接,在同一行的第二个单元格中选择“NewAge”但未获得所需结果。

   element(by.xpath("//tr['Protractor']['NewAge']"))

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:1)

要根据第一个和第二个单元格中的文本值识别/检索hyperlink element 量角器 NewAge ,您可以使用以下 xpath

//table[@class='resultsTable']//td[text()='NewAge']//preceding::a[text()='Protractor']

答案 1 :(得分:0)

您可以使用XPath来执行此操作。

//table[@class='resultsTable]//a[.='Protractor']//following::td[.='NewAge']

这从表开始,找到包含“Protractor”的A,然后找到包含“NewAge”的下一个TD。

如果是我,我会将其包装在一个函数中,该函数接受两个参数以使其可重用。然后你可以传入任何两个字符串,它将返回值或单击元素,无论你想要什么......

答案 2 :(得分:0)

以下是我将如何处理它。首先,我会得到所有行的列表

const rows = browser.element.all(by.tagName('tr'));

我会从该列表中获取第一个单元格文本等于Protractor的行列表

const firstMatches = rows.filter((row) => {
  return row.all(by.tagName('td')).first().getText().then(text => text === 'Protractor');
});

然后从这个列表中我会检查第二个单元格等于NewAge

const secondMatches = firstMatches.filter((row) => {
  return row.all(by.tagName('td')).get(1).getText().then(text => text === 'NewAge');
});

如果你把所有这些放在一起并记录secondMatches的计数和文本,那么元素的数量应该只有一个,文本应该是Protractor NewAge,让你知道你有正确的行。

const rows = browser.element.all(by.tagName('tr'));
const firstMatches = rows.filter((row) => {
  return row.all(by.tagName('td')).first().getText().then(text => text === 'Protractor');
});

const secondMatches = firstMatches.filter((row) => {
  return row.all(by.tagName('td')).get(1).getText().then(text => text === 'NewAge');
});

secondMatches.count().then(count => {
  console.log(count);
});

secondMatches.first().getText().then(text => {
  console.log(text);    
});

答案 3 :(得分:0)

尝试在xpath下面找到确切的行,它可以匹配我的chrome中唯一的行。

//table[@class='resultsTable']//tr[td[2][.='NewAge'] and td[1]/a[.='Protractor']]

上面的xpath被限制在第一个和第二个单元格上,如果你不关心哪个单元格,你可以在xpath下面使用:

//table[@class='resultsTable']//tr[td[.='NewAge'] and td/a[.='Protractor']]

然后在匹配的行中找到您想要的元素。
例如,您要单击第一个单元格内的链接:

//table[@class='resultsTable']//tr[td[2][.='NewAge'] and td[1]/a[.='Protractor']]/td[1]/a

或者您想要点击文字为“删除”的链接。并且你不关心它在哪个单元格中:

//table[@class='resultsTable']//tr[td[2][.='NewAge'] and td[1]/a[.='Protractor']]//a[.='Delete']