【问题标题】:How to get the text from element without specified HTML tag如何从没有指定 HTML 标签的元素中获取文本
【发布时间】:2014-02-25 11:59:56
【问题描述】:

任何人都可以帮助我解决我遇到的以下问题。到目前为止,我找不到任何解决方案。

我想通过 XPath 从以下 html 中获取文本:'You are logged in as',但由于没有 HTML 标记,我无法以任何方式获取文本,我已尝试:xpath=//div[@class='div3']/img,但没有成功。

这里是html:

<body>
   <div id="container">
     <div id="header">
       <div class="div1">
         <div class="div2">
           <div class="div3" style="background-color: transparent;">
             <img style="position: relative; top: 3px;" alt="" src="view/image/lock.png">
             You are logged in as
             <span>admin</span>
          </div>
        </div>
        <div id="menu"></div>
        ...

【问题讨论】:

    标签: java html selenium xpath selenium-webdriver


    【解决方案1】:
    xpath="//div[@class='div3']"
    elem = elem.find_element_by_xpath(xpath)
    print elem.text
    

    这就是你在 python 中编写的方式。但是,此文本将包含“admin”字样,您也可以简单地将其删除。

    【讨论】:

    • 实际上我尝试使用 xpath="//div[@class='div3']",但是当我做出断言时 assertEquals(driver.findElement(By.xpath("xpath=//div [@class='div3']")).getText(), "您的登录身份");我收到无效的选择器错误:无法使用 xpath 表达式定位元素
    • 那是因为 xpath=//div[@class='div3'] 不是有效的 xpath。 @Mira,我认为您对 Selenium 1 api 感到困惑。在 S1 中,您需要在选择器前面加上种类。例如:css=somecssselectorid=someid。在 WebDriver 中,您不这样做。现在全部由By 类控制。 By.id("someid"), By.xpath("//somexpath")
    【解决方案2】:

    您的 html 文档中的元素 img 不是对标签,因此不包含文本。另外,By.xpath 方法不支持 "xpath=" 前缀。

    获取文本最简单的方法是查询父 div 元素的文本。

    表达式

    driver.findElement(By.xpath("//div[@class='div3']")).getText()
    

    返回“您以管理员身份登录”。现在只需要一个简单的字符串表达式即可获得所需的结果。在做出断言之前修剪文本总是一个好主意。

    如果你真的只需要获取 img 和 span 元素之间的文本(不包括 span 元素的内容),你可能不得不求助于 JavaScript。看看Reading text using selenium webdriver(xpath)

    【讨论】:

      【解决方案3】:

      首先,远离 xpath.. 它更慢,而且不如 CSS 漂亮。

      所以您的问题是,您需要获取文本You are logged in as。到目前为止,您尝试的是获取&lt;img /&gt; 标记的文本,但&lt;img /> 标记没有innerHTML。您需要获取的是直接父级的文本。你可以使用这个 CSS 选择器来做到这一点:

      Java:

      driver.findElement(By.cssSelector("div#container div.div3")).getText();
      

      那么这将返回给您的是文本You are now logged in as admin

      在你的assert 子句中,写:

      assertTrue(driver.findElement(By.cssSelector("div#container div.div3")).getText().contains("You are logged in as"));
      

      我挑战你做的另一件事是看看那些&lt;div&gt; 类。 div1 | div2 | div3 是他们使用的实际类吗?如果没有,你能发布实际的html吗?

      【讨论】:

      • 我会反对 xpath 速度较慢的事实。我一周前进行的最新测试实际上表明,在 FF25.0.1 中抓取表格时,xpath 更快。我也看到其他人也得出同样的结论,比如这个人:elementalselenium.com/tips/32-xpath-vs-css。关于丑陋,这是一个品味问题 - 我发现 xpath 更灵活,因为您可以双向走标记(从孩子到父母)。 xpaths 的问题是,很多人不擅长编写它们,而 firebug 给你的东西真的很丑很脆弱。
      • 谢谢大家!@sircapsalot,css选择器“div#container div.div3”解决了我的问题。我会进一步检查如何使用java脚本来获取不包括span元素的文本。
      【解决方案4】:

      因此,您正在定位来自此 &lt;div class="div3"...&gt; 元素的内容。您发现可以使用以下 XPath 表达式 //div[@class="div3"] 选择它。

      现在,在这个元素中,您有几个子元素(直接子元素的 XPath 将是 //div[@class="div3"]/node()):

      • 一个文本节点'\n '
      • img元素(&lt;img style="position...&gt;),
      • 另一个文本节点'\n You are logged in as\n '
      • span 元素 (&lt;span&gt;admin&lt;/span&gt;),
      • 最终文本节点'\n '

      当您只想选择子文本节点时,可以使用//div[@class="div3"]/text()

      但我知道您想提取第一个 non-all-whitespace 文本节点,即具有“您登录为”的文本节点。所以可以使用XPath的normalize-space()函数来测试去掉的文本内容空白是否为空:

      //div[@class="div3"]/text()[normalize-space() != ""]
      

      【讨论】:

        猜你喜欢
        • 2013-05-13
        • 1970-01-01
        • 2012-02-06
        • 2019-12-23
        • 2017-02-07
        • 2019-08-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多