Java 如何从没有指定HTML标记的元素中获取文本

Java 如何从没有指定HTML标记的元素中获取文本,java,html,selenium,xpath,selenium-webdriver,Java,Html,Selenium,Xpath,Selenium Webdriver,有人能帮我解决我遇到的以下问题吗。到目前为止,我还没有找到任何解决办法 我想通过XPath从以下html获取文本:'You is logging as',但由于没有html标记,我无法以任何方式获取文本,我尝试了:XPath=//div[@class='div3']]/img,但没有成功 以下是html: <body> <div id="container"> <div id="header"> <div class="di

有人能帮我解决我遇到的以下问题吗。到目前为止,我还没有找到任何解决办法

我想通过XPath从以下html获取文本:'You is logging 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>
        ...

您是以用户身份登录的
管理
...

这就是用python编写的方式。尽管如此,这个文本将包含“admin”一词,您也可以简单地删除它

html文档中的元素img不是成对标记,因此不包含文本。此外,By.xpath方法不支持“xpath=”前缀

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

表情

driver.findElement(By.xpath("//div[@class='div3']")).getText()
返回“您以管理员身份登录”。现在只需要一个简单的字符串表达式就可以得到所需的结果。在做出断言之前,修剪文本总是一个好主意


如果您真的需要只获取img和span元素之间的文本(不包括span元素的内容),那么您可能必须求助于JavaScript。看一看。

首先,远离xpath。。它速度较慢,而且不如CSS好看

因此,您的问题是,您需要获取您作为登录的文本
。到目前为止,您尝试的是获取
标记的文本,但是
标记没有innerHTML。您需要获取的是直接父级的文本。您可以使用此CSS选择器执行此操作:

爪哇:

因此,这将返回您现在以管理员身份登录的文本

assert
子句中,写下:

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

我要求您做的另一件事是查看那些
类。
div1 | div2 | div3
是他们实际使用的类吗?如果没有,您可以发布实际的html吗?

因此您的目标是来自此
元素的内容。您发现可以使用以下XPath表达式选择它
//div[@class=“div3”]

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

  • 文本节点
    '\n'

  • img
    element(
    实际上我尝试使用xpath=“//div[@class='div3']”,但是当我使用assertEquals(driver.findelelement(By.xpath(“xpath=//div[@class='div3']””)).getText(),“您以身份登录”);我收到无效的选择器错误:无法使用xpath表达式定位元素,这是因为
    xpath=//div[@class='div3']
    不是有效的xpath。@米拉,我想你对Selenium 1 api感到困惑了。在S1中,你需要在选择器前面加上种类。例如:
    css=somecsselector
    id=someid
    。在WebDriver中,你不需要这样做。现在,它都由
    by
    类控制。
    by.id(“someid”)
    By.xpath(//somexpath)
    我会反驳xpath速度越来越慢的事实。我一周前做的最新测试实际上表明,在FF25.0.1中,在抓取表格时xpath速度更快。我也看到其他人得出了同样的结论,比如这个家伙:。关于丑陋,这是一个品味的问题-我发现xpath更灵活,因为你可以同时浏览标记ys(从孩子到父母)。XPath的问题是,很多人都不太擅长编写它们,firebug给了你非常难看和脆弱的东西。谢谢大家!@sircapsalot,css选择器“div#container div.div3”解决了我的问题。我将进一步检查如何使用java脚本获取不包括span元素的文本。
    driver.findElement(By.cssSelector("div#container div.div3")).getText();
    
    assertTrue(driver.findElement(By.cssSelector("div#container div.div3")).getText().contains("You are logged in as"));
    
    //div[@class="div3"]/text()[normalize-space() != ""]