如何用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
相关产品推荐
相关产品推荐

