1

对于下面的 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()

问题是编辑按钮可能并不总是存在于第 1、第 2 或第 3 行。(其动态基于差异条件)

<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”。(我想做的是找到 3row 并在其中我试图找到编辑图标)。但它不起作用。

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

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

2 回答 2

1

试试这个:

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

我不能保证表格内会有 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();
    }
于 2021-06-30T13:12:19.447 回答
1

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

这将[3]选择第三个位置的所有元素。tr这对于你的第三个是正确的tbody

如果性能很重要,我会使用尽可能明确的 XPath。所以在你的 XPath 中使用 tbody 并尽量不要使用 many //,因为这会减慢 XPath 引擎的速度。有关// 此答案含义的解释,请参见

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

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

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

于 2021-06-30T14:01:03.657 回答