0

假设我有一个这样的html结构:

<html><head></head>
    <body>
            <table>
                    <tr>
                            <td>
                                    <table>
                                            <tr>
                                                    <td>Left</td>
                                            </tr>
                                    </table>
                            </td>
                            <td>
                                    <table>
                                            <tr>
                                                    <td>Center</td>
                                            </tr>
                                    </table>
                            </td>
                            <td>
                                    <table>
                                            <tr>
                                                    <td>Right</td>
                                            </tr>
                                    </table>
                            </td>
                    </tr>
            </table>
    </body>
</html>

我想构建 CSS 选择器来访问三个子表,它们仅通过第一行中的表数据项的内容来区分。

我怎样才能做到这一点?

4

2 回答 2

1

元素上的 .text 方法返回元素的文本。

tables = page.find_elements_by_xpath('.//table')
contents = "Left Center Right".split()
results = []
for table in tables: 
    if table.find_element_by_xpath('.//td').text in contents: # returns only the first element
         results.append(table)

您可以通过将 'page' 设置为第一个 'table' 元素,然后在其上运行搜索来缩小搜索字段。有各种各样的方法可以提高这样的性能。请注意,如果存在大量无关表,此方法将相当慢。每个网页在选择表示信息的方式上都会有其怪癖,请确保您解决这些问题以提高效率。

您还可以使用列表推导来返回结果。

results = [t for t in tables if t.find_element_by_xpath('.//td').text in contents]
于 2012-10-04T17:25:08.323 回答
1

我认为 css 选择器中没有可用的方法来验证内部文本。

您可以通过使用 xpath 或 jQuery 路径来实现。

路径:

   "//td[contains(text(),'Left')]"

               or

     "//td[text()='Right']"

jQuery 路径

    jQuery("td:contains('Centre')")

使用以下逻辑,您可以在 WebDriver 自动化中执行 jQuery 路径。

JavascriptExecutor js = (JavascriptExecutor) driver;
WebElement element=(WebElement)js.executeScript(locator);
于 2012-10-04T15:56:06.747 回答