繁体   English   中英

使用Java + Selenium WebDriver获取一些文本

[英]Get some text with java + selenium WebDriver

我只想收到“邀请发送到xxxxx”文本,我不想得到里面的内容

<button class="action" data-ember-action="" data-ember-action-3995="3995">
          Visualizar perfil
 </button>

我这样得到文本:

String pessoapopu = driver.findElement(By.className("artdeco-toast-message")).getText();                
System.out.println(pessoapopu); 

页面结构:

<div class="artdeco-toast-inner" data-ember-action="" data-ember-action-3994="3994">
    <li-icon aria-hidden="true" type="success-pebble-icon" class="artdeco-toast-icon"><svg viewBox="0 0 24 24" width="24px" height="24px" x="0" y="0" preserveAspectRatio="xMinYMin meet" class="artdeco-icon"><g class="large-icon" style="fill: currentColor">
        <g id="success-pebble-icon">
          <g>
            <circle class="circle" r="9.1" stroke="currentColor" stroke-width="1.8" cx="12" cy="12" fill="none" transform="rotate(-90 12 12)"></circle>
            <path d="M15.667,8L17,9.042l-5.316,7.36c-0.297,0.395-0.739,0.594-1.184,0.599c-0.455,0.005-0.911-0.195-1.215-0.599l-2.441-3.456l1.416-1.028l2.227,3.167L15.667,8z" fill="currentColor"></path>
            <rect style="fill:none;" width="24" height="24"></rect>
          </g>
        </g>
        <g id="Layer_1">
        </g>
      </g></svg></li-icon>
    <p class="artdeco-toast-message">
              Invitation sent to xxxxx
        <button class="action" data-ember-action="" data-ember-action-3995="3995">
          Visualizar perfil
        </button>

    </p>
  </div>

图片

您可以使用//p[@class='artdeco-toast-message']/text() xpath来定位Invitation sent to xxxxx文本的Invitation sent to xxxxx但是硒不支持xpath中的text()方法来定位文本节点。

如果您尝试使用xpath下方的元素来定位元素,以通过使用xpath的not()函数来排除按钮文本:

//p[@class='artdeco-toast-message']/node()[not(self::button)]

再次使用文本节点定位元素,因此Selenium不允许这样做

这里有一个解决方案可以执行相同的xpath,即JavascriptExecutor

使用JavaScript的validate evaluate()方法并使用JavascriptExecutor评估您的xpath

JavascriptExecutor js = (JavascriptExecutor)driver;
Object message = js.executeScript("var value = document.evaluate(\"//p[@class='artdeco-toast-message']/text()\",document, null, XPathResult.STRING_TYPE, null ); return value.stringValue;");
System.out.println(message.toString().trim());

要么

JavascriptExecutor js = (JavascriptExecutor)driver;
Object message = js.executeScript("var value = document.evaluate(\"//p[@class='artdeco-toast-message']/node()[not(self::button)]\",document, null, XPathResult.STRING_TYPE, null ); return value.stringValue;");
System.out.println(message.toString().trim());

它会给您预期的结果。 无需获取所有数据,然后使用String函数进行格式化。

您可以从这里详细探索evaluate()

您可以尝试以下代码。

WebElement text=driver.findElement(By.className("artdeco-toast-message"));
String wholeText = text.getText();
String unWantedText=text.findElement(By.className("action")).getText();
String RequiredText=wholeText.replace(unWantedText,"");
System.out.println(RequiredText);

实际上,Selenium的getText()方法也可以检索子元素中的所有文本,因此据我所知, Murthi推荐的方法是最适用的。 试试这个方法:

String newLine = System.getProperty("line.separator");
String pessoapopu = driver.findElement(By.className("artdeco-toast-message"))
                           .getText().replaceAll(newLine, "");

尝试/询问更方便的HTML代码。

给定HTML,您应该能够.getText() ,在换行符上拆分该文本,然后进行第一次拆分以获取所需的文本。

driver.findElement(By.cssSelector("p.artdeco-toast-message")).getText().split("\r\n")[0];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM