在硒中找不到元素

时间:2018-10-01 13:24:52

标签: java selenium selenium-webdriver

功能如下:

如果您搜索名称,搜索结果将显示在行中。在这些结果中,应选择状态为“有效”的一个。要选择一个,您应该单击位于行开头的链接。选择取决于状态。

因此,我尝试从状态“活动”遍历到文本为“名称在此处”的链接,并得到NoSuchElementException

代码是:

<tr height="20" class="evenListRowS1">

<td scope="row" align="left" valign="top" class="evenListRowS1" bgcolor="">
<a href="javascript:void(0)" onclick="send_back('Users','b559b4f3-20ee-9bb0-320d-5a4f630dea17');">Name goes here</a>
</td>

<td scope="row" align="left" valign="top" class="evenListRowS1" bgcolor="">
<a href="javascript:void(0)" onclick="send_back('Users','b559b4f3-20ee-9bb0-320d-5a4f630dea17');">email</a>
</td>

<td scope="row" align="left" valign="top" class="evenListRowS1" bgcolor="">
<a href="javascript:void(0)" onclick="send_back('Users','b559b4f3-20ee-9bb0-320d-5a4f630dea17');">position</a>
</td>

<td scope="row" align="left" valign="top" class="evenListRowS1" bgcolor="">
<a href="javascript:void(0)" onclick="send_back('Users','b559b4f3-20ee-9bb0-320d-5a4f630dea17');">Solutions - CRM Practice</a>
</td>

<td scope="row" align="left" valign="top" class="evenListRowS1" bgcolor="">
<a href="javascript:void(0)" onclick="send_back('Users','daac0d91-4481-2204-9b62-580600287265');">Mishra</a>
</td>

<td scope="row" align="left" valign="top" class="evenListRowS1" bgcolor="">
<a href="javascript:void(0)" onclick="send_back('Users','b559b4f3-20ee-9bb0-320d-5a4f630dea17');">email-address</a>
</td>

<td scope="row" align="left" valign="top" class="evenListRowS1" bgcolor="">
<a href="javascript:void(0)" onclick="send_back('Users','b559b4f3-20ee-9bb0-320d-5a4f630dea17');">+1 62900*2813</a>
</td>

<td scope="row" align="left" valign="top" class="evenListRowS1" bgcolor="">
Active
</td>

<td scope="row" align="left" valign="top" class="evenListRowS1" bgcolor="">
2018-09-30 02:33 PM
</td>

<td scope="row" align="left" valign="top" class="evenListRowS1" bgcolor="">
<input type="checkbox" disabled="disabled" class="checkbox">
</td>
</tr>

我尝试过

        driver.findElement(By.xpath(".//table[@class='list view']/tr[td[8][text()=\"Active\"]/td[1]")).click();

但是我收到了NoSuchElementException。

2 个答案:

答案 0 :(得分:2)

因此,您本质上想要这样:

  • 查找表

    //table[@class='list view']
    
  • 在表的行之间跳过任何内容,因为它们并不重要:

    //table[@class='list view']//tr
    
  • 查找第8列的值为Active的行(由于您使用的是过滤器,因此此处通过过滤器功能更容易识别位置。同样基于HTML,该列中的文本还包含新的行,因此text()='Active'将不匹配,但是contains将:

    <...>/td[position()=8 and contains(text(),'Active')]
    
  • 从同一行获取列#1。因此,请使用..返回行范围,然后选择其他列

    <...>/td[position()=8 and contains(text(),'Active')]/../td[1]
    

完整的xpath是:

//table[@class='list view']//tr/td[position()=8 and contains(text(),'Active')]/../td[1]

答案 1 :(得分:0)

您是否尝试过使用x-path定位要单击的链接?这样的事情可能会起作用,但是您将需要知道如何对其进行自定义以使其在您的情况下起作用。

//table[@id="myTable"]//tr[td[8][text()="Active"]]/td[1]
  • 使用//table[@id="myTable"]查找表。将id="myTable"更改为唯一标识表格的内容。
  • 使用//tr[td[8][text()="Active"]]查找行。这将为您提供第8列中所有具有“活动”状态的行。
  • 使用/td[1]
  • 查找该行中的第一个单元格
  • 在该单元格/a中找到链接

以下是https://www.w3schools.com/html/html_tables.asp

上的示例

//table[@id="customers"]/tbody/tr[td[2][text()="Maria Anders"]]/td[1]

这将选择第一行中第二列具有“ Maria Anders”的第一个单元格。