如何通过 element.findElements[n].findElement() 查找 table 的内部元素

how to find inner element of table by element.findElements[n].findElement()

下面HTML代码

<table class="table" id="Table1" xpath="1">
   <thead>
      <tr class="table-header">      </tr>
   </thead>
   <tbody>
      <tr class="table-row">
         <span><i data-icon="" class="icon fa fa-pencil fa-1x" id="l2_0-0-Edit_Icon"></i></span>
      </tr>
      <tr class="table-row">
         <span><i data-icon="" class="icon fa fa-pencil fa-1x" id="l2_0-0-Edit_Icon"></i></span>
      </tr>
      <tr class="table-row">
         <span><i data-icon="" class="icon fa fa-pencil fa-1x" id="l2_0-0-Edit_Icon"></i></span>
      </tr>
      <tr class="table-row">
         <span><i data-icon="" class="icon fa fa-pencil fa-1x" id="l2_0-0-Edit_Icon"></i></span>
      </tr>
      <tr class="table-row">
         <span><i data-icon="" class="icon fa fa-pencil fa-1x" id="l2_0-0-Edit_Icon"></i></span>
      </tr>
   </tbody>
</table>
<pre>

假设我需要单击第 4 行的“编辑”按钮。我可以使用以下代码。 (这段代码工作正常)

Driver.FindElement(By.XPath("//table[@id='Table1']//tr[3]//i[contains(@id,'Edit_Icon')]")).Click()

问题是编辑按钮可能并不总是存在于第一行、第二行或第三行。 (它的动态基于差异条件)

<table class="table" id="Table1" xpath="1">
   <thead>
      <tr class="table-header">      </tr>
   </thead>
   <tbody>
      <tr class="table-row">
         <span><i data-icon="" class="icon fa fa-pencil fa-1x" id="l2_0-0-Edit_Icon"></i></span>
      </tr>
      <tr class="table-row">
         
      </tr>
      <tr class="table-row">
         <span><i data-icon="" class="icon fa fa-pencil fa-1x" id="l2_0-0-Edit_Icon"></i></span>
      </tr>
      <tr class="table-row">
         <span><i data-icon="" class="icon fa fa-pencil fa-1x" id="l2_0-0-Edit_Icon"></i></span>
      </tr>
      <tr class="table-row">
         
      </tr>
   </tbody>
</table>

因此我尝试遵循以下代码,然后根据需要更改“3”。 (我想做的是找到第 3 行,并在其中找到编辑图标)。 但是它不起作用。

我如何编写一个始终点击我想要的行的 Xpath,而不管其他行是否有“编辑”按钮?

Driver.FindElement(By.XPath("//table[@id='Table1']")).FindElements(By.XPath("//tr"))[3].FindElement(By.XPath("//i[contains(@id,'Edit_Icon')]")).Click()

试试这个:

Driver.FindElement(By.XPath("//table[@id='Table1']")).FindElements(By.XPath(".//tr"))[3].FindElement(By.XPath(".//i[contains(@id,'Edit_Icon')]")).Click();

我不能保证 table 中会有 3 个 tr 元素。
正如您提到的,该元素可能不包含编辑图标,但这将找到正确的元素。
如果您想在单击该元素之前检查该元素是否存在,您可以这样做:

var list = Driver.FindElement(By.XPath("//table[@id='Table1']")).FindElements(By.XPath(".//tr"))[3].FindElements(By.XPath(".//i[contains(@id,'Edit_Icon')]"));
if(list.Count()>0){
    list[0].Click();
    }

首先你写:“假设我需要点击第 4 行的编辑按钮..我可以使用下面的代码。(这段代码工作正常)” 然后你使用谓词 [3].

[3] 将 select 所有位于第三位置的元素。这对于 tbody.

中的第三个 tr 是正确的

如果性能很重要,我会使用尽可能明确的 XPath。所以在你的 XPath 中使用 tbody 并尽量不要使用太多 //,因为这会减慢 XPath 引擎。有关 //

含义的解释,请参见

您的示例的问题是 tr 没有 td/th 元素。由于那是无效的 html,我假设您的 spantd 元素的子元素。如果是这样,这就是您可能需要的:

//table[@id='Table1']/tbody/tr[td/span/i[contains(@id,'Edit_Icon')]][3]/td/span/i[contains(@id,'Edit_Icon')]"))

此 XPath 首先根据 i[contains(@id,'Edit_Icon')]] 的存在过滤 tr 元素,然后使用第三个位置。