【问题标题】:selenium python xpath trouble finding element text() on pageselenium python xpath在页面上找不到元素文本()
【发布时间】:2017-12-20 01:07:08
【问题描述】:

我正在尝试验证此示例中的文本 Active:

<div class="details">
    <p class="double">
        <a href="url">Set as default</a>
        <br>
        <a id="modal124434" class="modalAction" href="#">Delete</a>
    </p>
    <span class="bold">TEXT</span>
    : 1234567890 (12/2017)
    <br>
    Active:
    <a class="game" href="#GAME">GAME</a>
</div>

我还需要检查TEXT 以确保它在那里。我使用以下找到TEXT

foo = b.find_element_by_xpath('//span[contains(text(),"TEXT")]/..')

当我print(foo.text) 时,我可以看到上面 html 示例中的所有文本。所以,我想我可以这样做:

b.find_element_by_xpath('//span[contains(text(),"TEXT")]/..[contains(text(),"Active:")]/a[text()="GAME"]

但我得到一个 NoSuchElement 异常。我也试过:

b.find_element_by_xpath('//*[contains(text(),"Active")]')

仍然一无所获。任何帮助将不胜感激。

【问题讨论】:

  • 在此示例中,您要查找的文本位于两个元素之间。也许这里的答案会有所帮助:stackoverflow.com/questions/15813903/…
  • 您要准确定位哪个textTEXTActive:GAME?
  • 是需要从节点获取子串"Active:"还是需要通过子串"TEXT""Active:"定位元素?
  • @debanjanbI 和@Andersson 希望尽可能在一个 xpath 中验证所有三个的文本。 @Tim 所以,一旦我找到了text()[2],我怎么知道该元素中的文本是什么?
  • 所以事实证明,对于我正在做的事情,我实际上不需要验证 Active: 文本,因为如果 @987654338 中包含 GAME&lt;a&gt; 将不会出现@ 不存在。所以我可以使用'//span[contains(.,"TEXT")]/../a[text()="GAME"]'

标签: python selenium xpath text


【解决方案1】:

回到这一点,我能够找到一种方法来做我最初想做的事情

b.find_element_by_xpath('//span[contains(text(),"TEXT")]/..[contains(.,"Active:")]/a[text()="GAME"]')

似乎使用text() 只查看出现在该网络元素上的第一个 textNode。但是使用 . 会查看该元素的所有 textNode 以及附加到当前元素“下方”的任何 childNode 的任何 textNode。

【讨论】:

    【解决方案2】:

    你可以试试这个 xpath :- //span/following-sibling::text()[2]

    driver.find_element_by_xpath("//span/following-sibling::text()[2]").text ;

    【讨论】:

    • 一旦我找到了text()[2],我如何知道该元素中的文本是什么?
    • 我在尝试这个selenium.common.exceptions.WebDriverException: Message: TypeError: Argument 1 of Window.getComputedStyle does not implement interface Element.时遇到了异常@
    • 我最终使用了您的部分答案来解决我用于此问题的工作。我最近意识到我从来没有发布过我的工作。我使用了以下 xpath:'//span[text()="TEXT"]/following-sibling::a[text()="GAME"]'
    【解决方案3】:

    要打印元素文本 TEXTActive:GAME,您可以使用以下代码块:

    • 打印TEXT

      print(b.find_element_by_xpath("//div[@class='details']//span[@class='bold']").get_attribute("innerHTML"))
      
    • 打印Active:

      fullsting = b.find_element_by_xpath("//div[@class='details']").get_attribute("innerHTML")
      part_word = fullsting.split(")")
      words = part_word[1].split("G")
      print(words[0])
      
    • 打印GAME

      print(b.find_element_by_xpath("//div[@class='details']//a[@class='game']").get_attribute("innerHTML"))
      

    【讨论】:

    • innerHTML 属性很酷,我不知道,但我希望使用一个 xpath 字符串一次验证所有这三个项目。
    • @DanielWillemin 很高兴知道这一点。您的问题得到解答了吗?
    • 遗憾的是,我确实找到了一个不涉及文本 Active: 的解决方法。
    • 回到这一点,我想出了一种方法来做我最初想做的事情。我已经发布了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 2022-06-25
    相关资源
    最近更新 更多