我的HTML页面中有下表。
<div id="mDisplayCiteList_ctl00_mCiteListSpacingDiv">
<table>
<tr>
<td class="ResultListTableHeader"> </td>
<td> </td>
</tr>
</table>
<table>
<tr>
<td colspan="3"> </td>
<td> </td>
</tr>
</table>
<table>
<tr>
<td><span class="x">Content</span></td>
<td><span class="x">Content1</span></td>
</tr>
</table>
<table>
<tr>
<td><span class="x">Content</span></td>
<td><span class="x">Content1</span></td>
</tr>
</table>
</div>
并且我试图将td
元素放入具有以下条件的列表中。
td
的第一个tr
不应该colspan
或类名为ResultListTableHeader
。
我尝试了下面的XPATH。
List<WebElement> multiBases = chromeDriver.findElements(By.xpath(
".//*[@id='mDisplayCiteList_ctl00_mCiteListSpacingDiv']/descendant::table/descendant::tr[not(td[1]/@class='ResultListTableHeader' and td[1]/@colspan)]/td[4]/span"));
for (int i = 0; i < multiBases.size(); i++) {
System.out.println(multiBases.get(i).getText());
}
这并没有做任何事情,也没有任何例外。
此外,我尝试将and
替换为or
,但仍然没有用。
预期输出
这里我想获取content1(第三行第二列)和content1(第四行第二列),因为这些行的第一列(td)没有类名作为ResultListTableHeader或列跨度
请让我知道如何解决这个问题。如果还有其他更好的方法,请告诉我。
由于
答案 0 :(得分:0)
它不漂亮,但您正在寻找的XPath如下:
//table/tr/td[1][not(contains(@class, "ResultListTableHeader")) and not(@colspan)]/following-sibling::td[1]/span
这会选择span
元素中td
元素,该元素位于td
元素的第一个子元素之后的任何tr
元素后面,并且没有该类名称ResultListTableHeader
或属性colspan
。
答案 1 :(得分:0)
那么这里说的是,返回所有tr,其中第一个td匹配你的条件,而不是从这些tr得到所有td元素。
在你写的时候返回所有DIV。
/div[@id='mDisplayCiteList_ctl00_mCiteListSpacingDiv']/table/tr[not(td[1]/@class='ResultListTableHeader') and not(td[1]/@colspan)]/td
也会回复content1和content1(第二个TD的内容)。
/div[@id='mDisplayCiteList_ctl00_mCiteListSpacingDiv']/table/tr[not(td[1]/@class='ResultListTableHeader') and not(td[1]/@colspan)]/td[2]/span
答案 2 :(得分:0)
从您显示的HTML中,您似乎希望每个其他TD
都使用类x。这应该适合您,我认为比复杂的XPath更具可读性。
List<WebElement> cells = driver.findElements(By.cssSelector("#mDisplayCiteList_ctl00_mCiteListSpacingDiv td.x"));
for (int i = 1; i < cells.size(); i = i + 2)
{
System.out.println(cells.get(i).getText().trim());
}