Java Selenium-如何获取元素及其子元素文本

Java Selenium-如何获取元素及其子元素文本,java,xpath,selenium-webdriver,webdriver,Java,Xpath,Selenium Webdriver,Webdriver,简短版本:我可以获取聊天信息(在java中使用selenium的By.xpath),但我希望在适当的位置包含微笑 较长版本: 你好 我一直在解决这个有趣的问题,我需要解析来自web浏览器的聊天消息,并使用java和selenium重新创建它。解析消息的文本没有问题,但我也想用它的子元素(微笑图标)来解析它。除了手动源代码解析之外,还有什么好的方法吗 以下是我可以访问的单个消息的代码: <div class="chat_msg chat_msg_caller "> <di

简短版本:我可以获取聊天信息(在java中使用selenium的By.xpath),但我希望在适当的位置包含微笑

较长版本: 你好 我一直在解决这个有趣的问题,我需要解析来自web浏览器的聊天消息,并使用java和selenium重新创建它。解析消息的文本没有问题,但我也想用它的子元素(微笑图标)来解析它。除了手动源代码解析之外,还有什么好的方法吗

以下是我可以访问的单个消息的代码:

<div class="chat_msg chat_msg_caller ">
    <div class="chat_msg_head">
        <span class="chat_msg_author">
            SomeAuthor
        </span>
        <span class="chat_msg_date">
           SomeDate
        </span>
    </div>
    <div class="chat_msg_body message_text">
        SomeMessageText
        <span class="sml-icon biggrin">
            <span>
                :D
            </span>
        </span>
        SomeOtherText
        <span class="sml-icon biggrin">
            <span>
                :D
            </span>
        </span>
    </div>
</div>
结构:

<div id="messages_body">
   <div id="pager" class="pages"> … </div>
   <div class="chat_msg chat_msg_caller ">
       <div class="chat_msg_head">
          <span class="chat_msg_author"> … </span>
          <span class="chat_msg_date"> … </span>
       </div>
       <div class="chat_msg_body message_text"> … </div>
   </div>
   <div class="me chat_msg chat_msg_owner "> … </div>
   <div class="chat_msg chat_msg_caller "> … </div>
   <div class="me chat_msg chat_msg_owner "> … </div>
   <div class="chat_msg chat_msg_caller "> … </div>
   <div class="chat_msg chat_msg_caller "> … </div>
   <div class="chat_msg chat_msg_caller "> … </div>
   ...

… 
… 
… 
… 
… 
… 
… 
… 
… 
… 
...
我是如何做到这一点的,
1.我打开Selenium IDE,
2.从我想要获取的站点中选择文本
3.右键单击并使用可用的命令
4.假设我们使用验证文本
5.停止录制并将录制转换为webdriver。
你得到你的密码。这很简单,一直对我有用
你可以试试

 (new WebDriverWait(driver, 60)).until(ExpectedConditions
                .textToBePresentInElement(By.id("Element ID"),
                        "Text to verify"));

如果我理解正确,您只需要对父元素执行getText()

driver.findElement(By.cssSelector(".chat_msg_body message_text")).getText()
这应该会回来

SomeMessageText:D SomeOtherText:D

它可能会删除一些空白,您需要试一试

编辑

鉴于您正在处理潜在的CSS问题,您可以尝试以下方法:

driver.findElement(By.cssSelector(".chat_msg_body message_text")).getAttribute("textContent")

即使CSS到处移动,也应该得到文本内容。

从中我只得到“SomeMessageText SomeOtherText”。这就是问题所在。我想得到介于两者之间的微笑。我将编辑问题:)我已经编辑了我的问题,以显示我是如何获得消息文本的。我只对By.xpath使用了类似的方法,它只返回“SomeMessageText SomeOtherText”这个xpath非常可怕“//div[@id='messages\u body']/div[”+(I+1)+“]/div[@class='chat\u msg\u body message\u text']”,为什么不直接使用这个类呢?不管怎样,关于你的问题,你能提供CSS吗?我目前的猜测是,您正在隐藏文本并用CSS中的图像替换它,而Selenium正在解决跨度不可见的问题,因此它不会返回该文本。我已经添加了整个结构的示例,如果您能建议我如何改进xpath,我真的很感激,因为我也不喜欢:)我需要查看所有的div包含聊天信息,并在里面查找更具体的信息(所有者、日期、消息)。关于这些微笑,你是对的。CSS指定应该显示瓷砖集的哪些部分。有没有办法处理消息的内部部分,这样我就可以确定把微笑放在哪里?更新了答案,建议您尝试driver.findelelement(By.cssSelector(“.chat\u msg\u body message\u text”)).getAttribute(“textContent”),即使这样做有效,也无法解决消息两部分之间的微笑问题。
driver.findElement(By.cssSelector(".chat_msg_body message_text")).getAttribute("textContent")