You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java+Selenium提取br标签文本?地址断言需求求助

问题:提取<address>标签内<br>分隔的文本内容

场景说明

需要对网站新创建的地址进行断言校验,目标HTML结构如下:

<div class="col-lg-4 col-md-6 col-sm-6">
          
  <article id="address-30338" class="address" data-id-address="30338">
    <div class="address-body">
      <h4>Piotr</h4>
      <address>Piotr Testowy<br>Woronicza<br>10-123<br>Warszawa<br>United Kingdom<br>533243444</address>
            
    </div>

需提取<br>分隔的内容:Woronicza(地址)、10-123(邮编)、Warszawa(城市)、United Kingdom(国家)、533243444(电话)。

此前通过以下代码获取<h4>文本可正常工作:

WebElement aliasData = driver.findElement(By.cssSelector("#content > div:nth-child(3) h4")); 
assertEquals(alias, aliasData.getText());

但尝试以下代码提取<br>分隔的文本时,Selenium返回空字符串:

List<WebElement> elements = driver.findElements(By.xpath("//div[2]//h4/following-sibling::address/br"));

String addressData = elements.get(1).getText();
String zipCodeData = elements.get(2).getAttribute("innerHTML");
String cityData = elements.get(3).getAttribute("innerHTML");
String countryData = elements.get(4).getAttribute("innerHTML");
String phoneData = elements.get(5).getAttribute("innerHTML");

解决方案

方法1:直接获取<address>完整文本再分割

<address>标签内的所有文本可通过getText()一次性获取,换行符会自动作为分隔符,直接按换行拆分即可:

// 定位到address元素
WebElement addressElement = driver.findElement(By.cssSelector("#content > div:nth-child(3) address"));
// 获取完整文本并按换行分割
String[] addressParts = addressElement.getText().split("\n");

// 提取对应部分(索引从0开始)
String name = addressParts[0];          // Piotr Testowy
String addressData = addressParts[1];   // Woronicza
String zipCodeData = addressParts[2];   // 10-123
String cityData = addressParts[3];      // Warszawa
String countryData = addressParts[4];   // United Kingdom
String phoneData = addressParts[5];     // 533243444

// 执行断言校验
assertEquals("Woronicza", addressData);
assertEquals("10-123", zipCodeData);
// 其他字段断言同理

方法2:通过XPath提取<address>下的文本节点

原代码错误在于直接定位<br>标签——<br>本身无文本内容,目标文本是<address>的子文本节点。可通过JavaScript直接选取这些节点:

// 定位address元素
WebElement addressElement = driver.findElement(By.cssSelector("#content > div:nth-child(3) address"));

// 提取第2个文本节点(对应Woronicza)
String addressData = (String) ((JavascriptExecutor) driver).executeScript(
    "return arguments[0].childNodes[2].textContent.trim();", addressElement);

// 提取第3个文本节点(对应10-123)
String zipCodeData = (String) ((JavascriptExecutor) driver).executeScript(
    "return arguments[0].childNodes[4].textContent.trim();", addressElement);

// 同理提取其他节点:childNodes[6]对应城市、childNodes[8]对应国家、childNodes[10]对应电话

注:<address>的子节点顺序为「文本节点→<br>→文本节点→<br>...」,第n个目标文本对应的childNodes索引为2*(n-1),比如第1个文本(Piotr Testowy)是childNodes[0],第2个是childNodes[2],以此类推。


内容的提问来源于stack exchange,提问作者brat_pete88

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 04:31:31