代码之家  ›  专栏  ›  技术社区  ›  Hooman Bahreini

如何使用嵌套的selenium选择器

  •  0
  • Hooman Bahreini  · 技术社区  · 5 年前

    我正在使用selenium+chrome web驱动程序加载动态页面:

    self.driver.get(url)
    time.sleep(3)  # not sure if I need to add this wait, so the .js loads the page?
    

    加载页面后,我希望获得页面上所有可用卡片的列表,然后遍历每张卡片并获取其标题:

    cards = self.driver.find_elements_by_css_selector('div.my-card')
    for card in cards:
        title = card.find_element_by_css_selector('h2.title::text').get() # <-- does not work
        desc = card.find_element_by_css_selector('div.desc::text').get() # <-- does not work
        # more fields that I need within this card
    

    find_elements_by_css_selector 似乎是一个 driver 方法我不确定如何将这些选择器应用于卡(类型卡为 WebElement ).


    示例页:

    <div class='my-card'>
        <h2 class='title'>title 1</h2>
        <div class='desc'>desc 1</div>
    </div>
    <div class='my-card'>
        <h2 class='title'>title 2</h2>
        <div class='desc'>desc 2</div>
    </div>
    <div class='my-card'>
        <h2 class='title'>title 3</h2>
        <div class='desc'>desc 3</div>
    </div>
    
    1 回复  |  直到 5 年前
        1
  •  2
  •   idontknow    5 年前

    您可以使用combinator子选择器或子选择器将这两个组合成一个查询(CSS)选择器,就像这样。

    如果h2元素是子元素 卡元素的后代:

    self.driver.find_elements_by_css_selector('div.my-card > h2.title')
    

    如果h2元素只是card元素的后代:

    self.driver.find_elements_by_css_selector('div.my-card h2.title')
    

    了解有关CSS组合器的更多信息 here .

        2
  •  1
  •   sytech    5 年前

    你所拥有的一切按原样运作。使用给定的HTML示例:

    In [19]: for card in cards:
        ...:     title_elem = card.find_element_by_css_selector('h2.title')
        ...:     print(title_elem.text)
        ...:
    title 1
    title 2
    title 3
    
    In [20]: card
    Out[20]: <selenium.webdriver.remote.webelement.WebElement (session="534c4be3a233a0aa963f541550ac7861", element="b56dcaf3-9b38-4e4c-aae8-99005ac9840b")>
    

    所以您对使用嵌套selenium选择器的期望是正确的。你一定是被别的假设搞糊涂了。