如何通过 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,我假设您的 span
是 td
元素的子元素。如果是这样,这就是您可能需要的:
//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
元素,然后使用第三个位置。
下面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,我假设您的 span
是 td
元素的子元素。如果是这样,这就是您可能需要的:
//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
元素,然后使用第三个位置。