【问题标题】:In Selenium Webdriver, how to get a text after an element?在 Selenium Webdriver 中,如何在元素之后获取文本?
【发布时间】:2016-08-01 05:44:15
【问题描述】:

我想得到一个正好在特定元素之后的文本。请看示例代码:

<div id="content-tab-submitter" class="">
    <h4>Sender</h4>
    <p> 
        <span class="screenHidden">Name: </span>
        submitter
        <br>

        <span class="screenHidden">E-mail address:</span>
        submitter@asd.com
        <br>

        <span class="screenHidden">Account: </span>
        asdas
        <br>
    </p>
</div>

我想获取恰好在&lt;span&gt; 之后的文本,其中包含“帐户”。 通过使用这个 xpath:

//*[@id='content-tab-submitter']/p/span[contains(text(),'Account')]/following::text()

Java 给我一个错误,因为输出不是 Web 元素,而是文本。因此,无法使用 findElement。

有什么想法可以以一种干净的方式获取此文本吗?我的意思是我不想获取所有文本:(在这种情况下)submitter\nsubmitter@asd.com\nasdas 然后提取所需的文本。

【问题讨论】:

  • 不幸的是,您不能仅使用findElement() 来做到这一点。相关问题:Getting text from a node
  • @har07 非常感谢。不幸的是,没有其他办法!
  • 是的,有办法请在下面查看我的答案

标签: java selenium xpath selenium-webdriver


【解决方案1】:

您可以使用 Selenium 的 getText() 方法,例如:-

driver.findElement(By.xpath("xpath of the element")).getText();

你的 xpath 可以是:-

//span[contains(.,'Account')]/following::text()

【讨论】:

  • 对不起,这是错误的,文本不属于 元素。我想我在问题中清楚地解释了它,它在 HTML 示例中可见。如果它含糊不清,请告诉我,然后我会修改我的问题。谢谢你的回答。
  • 我已经修改了我的 xpath
【解决方案2】:

嗨,我认为没有直接的方法可以在 Account 之后提取文本:即直接引用 text = 'asdas' 的 xpath

所以不要尝试准确读取 text = 'asdas' 直接尝试读取 p 标签中的每个文本并执行如下操作以提取标签。

WebDriver driver = new FirefoxDriver();
driver.get("file:///C:/Users/rajnish/Desktop/myText.html");

// xpath for talking complete text i.e all text inside every span tag that comes under p tag 
String MyCompleteText  = driver.findElement(By.xpath("//*[@id='content-tab-submitter']/p")).getText();

System.out.println("My Complete Text is : " + MyCompleteText);

// MyCompleteText outputs in console :
// My Complete Text is : Name: submitter
// E-mail address: submitter@asd.com
// Account: asdas

// now we have to split our MyCompleteText on the basis of Account:
// as we want text after Account: so do it like below

String[] mytext = MyCompleteText.split("Account:");
System.out.println("I am text after  Account: "+ mytext[1]);

输出会是这样的

My Complete Text is : Name: submitter
E-mail address: submitter@asd.com
Account: asdas
I am text after  Account:  asdas

希望对你有帮助

【讨论】:

  • MyCompleteText 给出:submitter submitter@asd.com asdas 并且不给出跨节点内部的文本!
  • 对不起,我无法得到你说你没有得到任何名称:电子邮件地址:帐户:如果是,那么请看我也发布了输出并清楚地显示了所有内容(内部文本insides span ) 在 span 节点内
【解决方案3】:

可以使用一段Javascript来获取如下文本节点:

// get the targeted element
WebElement element = driver.findElement(By.cssSelector("id('content-tab-submitter')/p/span[contains(.,'Account')]"));

// get the following text
String text = (String)((JavascriptExecutor)driver).executeScript(
    "return arguments[0].nextSibling.textContent.trim()", element);

【讨论】:

    【解决方案4】:

    希望这一切正常。如果没有,请在 span 类前面添加 div 类。

    //span[@class='screenHidden'][contains(., 'submitter')][contains(., 'submitter@asd.com')][contains(., 'asdas')]
    

    【讨论】:

      【解决方案5】:

      获取文本,例如asdas 恰好在 &lt;span&gt; 之后,innerText 为 Account,您可以使用以下代码行:

      //Identify the parent node
      WebElement myElement = driver.findElement(By.xpath("//div[@id='content-tab-submitter']//p"));
      
      String myText = ((JavascriptExecutor)driver).executeScript('return arguments[0].childNodes[8].textContent;', myElement).strip()
      //or
      String myText = ((JavascriptExecutor)driver).executeScript('return arguments[0].childNodes[10].textContent;', myElement).strip()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-01
        • 2014-06-19
        • 1970-01-01
        • 2015-12-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多