如何定位Saucedemo页面登录凭据中的用户名元素(XPath/CSS)?
解决Saucedemo登录凭据区域用户名提取问题
问题原因
Selenium的findElement()方法仅能定位DOM中的元素节点,无法直接获取文本节点(你使用的//*[@id="login_credentials"]/text()[1]返回的是文本节点,并非元素),这是导致报错的核心原因。登录凭据区域的用户名是与<h4>元素同级的文本内容,需通过元素节点间接提取。
解决方案
方案一:提取父元素全部文本后过滤用户名
这种方式无需依赖DOM节点索引,兼容性更强:
public class pr1 { @Test public void Test1() throws InterruptedException { WebDriverManager.chromedriver().setup(); WebDriver driver=new ChromeDriver(); driver.get("https://www.saucedemo.com/"); // 获取登录凭据区域的全部文本 String allCredentialsText = driver.findElement(By.id("login_credentials")).getText(); // 按换行分割文本,跳过第一行说明文字,提取第一个用户名 String[] textLines = allCredentialsText.split("\\n"); if (textLines.length > 1) { String targetUsername = textLines[1]; System.out.println(targetUsername); } driver.quit(); } }
方案二:通过JavaScript精准定位文本节点
若需要指定提取某一个文本节点,可通过JS操作DOM直接获取(注意:节点索引可能随页面结构变化失效):
public class pr1 { @Test public void Test1() throws InterruptedException { WebDriverManager.chromedriver().setup(); WebDriver driver=new ChromeDriver(); driver.get("https://www.saucedemo.com/"); // 执行JS获取指定文本节点的内容 String targetUsername = (String) ((JavascriptExecutor) driver).executeScript( "return document.getElementById('login_credentials').childNodes[2].textContent.trim();" ); System.out.println(targetUsername); driver.quit(); } }
内容的提问来源于stack exchange,提问作者Swanand Yadav
相关产品推荐
相关产品推荐

