无法进行模式匹配

时间:2015-10-12 14:44:02

标签: selenium xpath selenium-webdriver selenium-chromedriver

我的HTML页面中有下表。

  <div id="mDisplayCiteList_ctl00_mCiteListSpacingDiv">
        <table>
            <tr>
                <td class="ResultListTableHeader">&nbsp;</td>
                <td>&nbsp;</td>
            </tr>
        </table>
        <table>
            <tr>
                <td colspan="3">&nbsp;</td>
                <td>&nbsp;</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或列跨度

请让我知道如何解决这个问题。如果还有其他更好的方法,请告诉我。

由于

3 个答案:

答案 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());
}