使用Selenium Java提取<BR>标签中的文本遇到问题
解决Selenium提取
分隔文本的问题
分隔文本的问题
你当前的代码问题在于**
是无内容的空标签**,它本身不承载任何文本,所以定位
元素调用getText()自然返回空值。你实际需要提取的是<div class="sign_in">中被<br>分隔的那些独立文本节点(即user_1、user_2这类内容),以下是几种可行的解决方案:
方案1:提取div全部文本后分割处理
这种方法简单直接,适合DOM结构稳定的场景:
// 定位目标div WebElement signInDiv = driver.findElement(By.id("sign_in")); // 获取div下的全部文本 String fullText = signInDiv.getText(); // 按换行符分割文本,过滤无效内容 String[] rawUsers = fullText.split("\\n"); List<String> userList = new ArrayList<>(); for (String rawUser : rawUsers) { String trimmedUser = rawUser.trim(); // 跳过空行和标题行 if (!trimmedUser.isEmpty() && !trimmedUser.equals("usernames lists:")) { userList.add(trimmedUser); } } // 输出结果 for (String user : userList) { System.out.println(user); }
方案2:用XPath直接定位文本节点
通过XPath精准筛选出div下的有效文本节点,无需后续大量过滤:
// 定位div下h4之外的非空白文本节点 List<WebElement> textNodes = driver.findElements(By.xpath("//div[@class='sign_in']/text()[normalize-space() != '' and not(ancestor::h4)]")); for (WebElement node : textNodes) { // 去除文本前后空白后输出 System.out.println(node.getText().trim()); }
方案3:通过JavaScript获取文本节点
如果XPath方法存在浏览器兼容问题,可借助JavaScript直接操作DOM:
JavascriptExecutor js = (JavascriptExecutor) driver; // 执行JS脚本提取并返回有效用户名列表 List<String> userList = (List<String>) js.executeScript( "const div = document.getElementById('sign_in'); " + "// 筛选出非空白的文本节点,排除h4的内容" + "const validTexts = Array.from(div.childNodes).filter(node => " + "node.nodeType === 3 && node.textContent.trim() !== '' && !node.previousElementSibling?.tagName === 'H4'" + "); " + "return validTexts.map(node => node.textContent.trim());" ); // 输出结果 for (String user : userList) { System.out.println(user); }
内容的提问来源于stack exchange,提问作者Rohit Mathur
相关产品推荐
相关产品推荐

