代码之家  ›  专栏  ›  技术社区  ›  js1069

如何通过匹配第一个元素中的文本来获取第二个元素。在Selenium中,Python

  •  0
  • js1069  · 技术社区  · 2 年前

    HTML代码片段供参考:

    <tr>
    </tr>
    <tr>
        <td class="gridTD">TITLE</td>
        <td class="gridTD">NAME</td>
    </tr>
    <tr>
    </tr>
    

    有一系列 tr 元素的位置发生变化,所以我必须从 td 子元素。 我正试着抓住 第二 td 通过匹配 第一 td 元素,但我不知道如何访问它。

    我刚接触Selenium,刚刚开始使用XPath定位元素。

    这些元素可以很好地返回第一个元素:

    n = driver.find_element_by_xpath("//*[@id='divDistrictContacts']/table/tbody//tr//*[text()='TITLE]")
    
    n = driver.find_element_by_xpath("//*[@id='divDistrictContacts']/table/tbody//tr/td[text()='TITLE]")
    

    但我不知道接下来该怎么办。我试着查找它,但似乎找不到如何从第一个元素的匹配文本中获取第二个元素。

    我尝试在[text()=“TITLE']之后的变体中添加[position()=2]和[2],并更改xpath中的//和*,结果要么是“没有这样的元素”,要么是xpath无效。

    如果这有帮助的话,这就是完整的xpath(我用I替换了tr索引,因为它是一个不可靠的值):

    /html/body/div[1]/div[2]/div[5]/table/tbody/tr[i]/td[2]
    
    2 回复  |  直到 2 年前
        1
  •  1
  •   furas    2 年前

    你可以做一个 [ ] 在另一个里面 [ ]

    也许是第一次使用 TITLE 得到 tr - //tr[td[text()="TITLE"]]

    然后拿到第二名 td 在这个 tr - (//tr[td[text()="TITLE"]]//td)[2]


    编辑:

    你也可以使用 following-sibling

    //td[text()="TITLE"]/following-sibling::td
    

    完整的工作示例:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    #from webdriver_manager.chrome import ChromeDriverManager
    from webdriver_manager.firefox import GeckoDriverManager
    
    #driver = webdriver.Chrome(executable_path=ChromeDriverManager().install())
    driver = webdriver.Firefox(executable_path=GeckoDriverManager().install())
    
    html = '''<!DOCTYPE html>
    <html>
    <body>
    <table>
    <tr></tr>
    <tr>
        <td class="gridTD">TITLE</td>
        <td class="gridTD">NAME</td>
    </tr>
    <tr></tr>
    </table>
    </body>
    </html>
    '''
    
    driver.get("data:text/html;charset=utf-8," + html)
    
    item = driver.find_element(By.XPATH, '(//tr[td[text()="TITLE"]]//td)[2]')
    print(item.text)
    
    item = driver.find_element(By.XPATH, '//td[text()="TITLE"]/following-sibling::td')
    print(item.text)
    
        2
  •  0
  •   PatRiot    2 年前

    你在找 following-sibling

    //td[text()='TITLE']//following-sibling::td
    

    http://xpather.com/ 例子: enter image description here