CSS选择器,按CHILD值选择

时间:2012-10-04 14:23:31

标签: python css selenium css-selectors

假设我有一个像这样的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选择器来访问三个子表,这三个子表只能通过第一行中表数据项的内容来区分。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

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

您可以使用xpath或jQuery路径实现此目的。

xpath:

   "//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);

答案 1 :(得分: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]