【问题标题】:unable make a pattern match无法进行模式匹配
【发布时间】:2016-01-10 02:24:00
【问题描述】:

我的 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 元素放入具有以下条件的列表中。

tr 的第一个 td 不应具有 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());
        }

这并没有做任何事情,甚至没有抛出任何异常。

我也试过用or替换and,但还是没用。

预期输出

这里我想获取 content1(第三行第二列)和 content1(第四行第二列),因为这些行的第一列(td)没有类名作为 ResultListTableHeader 或 colspan

请告诉我如何解决这个问题。另外,如果有其他更好的方法可以做到这一点,请告诉我。

谢谢

【问题讨论】:

  • 对于提供的示例,您想要的输出是什么?
  • 嗨@alecxe,我稍微修改了我的HTML以显示差异,这里我想获取content1(第三行第二列)和content1(第二列),因为第一列(td) 这些行的类名没有 ResultListTableHeader 或 colspan
  • 请更新 HTML 示例,以便我们可以看到将如何使用类 'ResultListTableHeader'。
  • 很抱歉错过了@DmytroPastovenskyi,感谢您指出这一点,我已经更新了问题。
  • 您能添加一个您希望从该 HTML 收到的结果吗?只有最后 2 个表中的 td 元素,对吧?

标签: selenium xpath selenium-webdriver selenium-chromedriver


【解决方案1】:

它并不漂亮,但是您要查找的 XPath 如下:

//table/tr/td[1][not(contains(@class, "ResultListTableHeader")) and not(@colspan)]/following-sibling::td[1]/span

这会选择第一个 td 元素中的 span 元素,该元素位于任何 td 元素之后,该元素是 tr 元素的第一个子元素,并且没有类名 ResultListTableHeader 或属性 @ 987654327@.

【讨论】:

  • 问题是关于 TD 而不是 SPAN。
  • 问题不太清楚......!据我所知,我们的两个答案都是正确的......
  • 同意 :) 有两件事被要求做 :)
  • 我的 XPATH 没有返回任何东西,在这里当我使用你的 XPATH 并打印大小时,它给出 0 作为输出
【解决方案2】:

所以这里说的是,返回第一个 td 符合您的条件的所有 tr,然后从这些 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

【讨论】:

  • 我的 XPATH 没有返回任何东西,在这里当我使用你的 XPATH 并打印大小时,它给出 0 作为输出
  • @user3872094 这意味着您没有向我们提供所有详细信息。如果您使用在线服务:freeformatter.com/xpath-tester.html#ad-output,您会看到:my 和 lambo xpath 都会返回您所要求的内容。
【解决方案3】:

从您显示的 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());
}

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2019-09-09
    • 1970-01-01
    • 2013-02-27
    • 2013-04-05
    • 1970-01-01
    相关资源
    最近更新 更多