定义WebDriver时运行TestNG测试方法出现报错问题排查
问题分析与代码修正
以下是用户提供的测试代码:
package TestCart; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import static org.testng.Assert.assertEquals; import org.testng.annotations.BeforeTest; import static org.testng.Assert.assertTrue; import org.testng.annotations.Test; public class LoginEnter { private WebDriver driver; private LoginPage loginPage; private WebDriver driver; private LoginPage loginPage; @BeforeTest public void setUp() { WebDriver driver = new ChromeDriver(); loginPage = new LoginPage(driver); } @Test public void successfulLoginTest() { loginPage.open(); assertTrue(loginPage.atPage()); loginPage.enterUserName("standard_user"); loginPage.enterPassword("secret_sauce"); loginPage.clickLogin(); } @Test public void wrongPasswordLoginTest() { loginPage.open(); assertTrue(loginPage.atPage()); loginPage.enterUserName("standard_user"); loginPage.enterPassword("secret_sauce"); loginPage.clickLogin(); } @Test public void wrongLoginNameLoginTest() { driver.get("https://saucedemo.com"); driver.findElement(By.id("//*[@id=\"user-name\"]")).sendKeys("test"); driver.findElement(By.id("//*[@id=\\\"password\\\"]\"")).sendKeys("test"); assertEquals("Home Page", driver.getTitle()); } }
用户尝试重写代码、修改测试日志后,构建可正常完成但测试仍报错,此前咨询得到的回复仅提及依赖与导入检查,未解决实际问题。
代码中的核心错误点
- 重复声明成员变量:类中重复定义了
driver和loginPage,属于冗余代码,可能引发编译警告。 - 局部变量遮蔽成员变量:
setUp方法内重新声明了WebDriver driver,导致类成员变量driver始终为null,运行wrongLoginNameLoginTest时会触发空指针异常。 - 测试逻辑错误:
wrongPasswordLoginTest中使用了正确密码secret_sauce,无法验证“错误密码登录失败”的场景。 - 元素定位语法错误:
wrongLoginNameLoginTest中用By.id()传入了XPath表达式,且字符串转义错误,正确的定位应使用By.id("user-name")和By.id("password")。 - 断言逻辑错误:SauceDemo登录后的页面标题不是"Home Page",实际标题为"Swag Labs",断言不成立会导致测试失败。
修正后的代码
package TestCart; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; import org.testng.annotations.BeforeTest; import org.testng.annotations.AfterTest; import org.testng.annotations.Test; public class LoginEnter { private WebDriver driver; private LoginPage loginPage; @BeforeTest public void setUp() { // 初始化成员变量driver,避免局部变量遮蔽 driver = new ChromeDriver(); loginPage = new LoginPage(driver); driver.manage().window().maximize(); } @Test public void successfulLoginTest() { loginPage.open(); assertTrue(loginPage.atPage()); loginPage.enterUserName("standard_user"); loginPage.enterPassword("secret_sauce"); loginPage.clickLogin(); // 验证登录成功,通过目标URL判断 assertEquals(driver.getCurrentUrl(), "https://www.saucedemo.com/inventory.html"); } @Test public void wrongPasswordLoginTest() { loginPage.open(); assertTrue(loginPage.atPage()); loginPage.enterUserName("standard_user"); // 使用错误密码测试登录失败场景 loginPage.enterPassword("wrong_password"); loginPage.clickLogin(); // 验证停留在登录页且显示错误提示 assertTrue(loginPage.atPage()); assertTrue(loginPage.hasErrorMsg()); } @Test public void wrongLoginNameLoginTest() { driver.get("https://saucedemo.com"); // 正确使用ID定位元素 driver.findElement(By.id("user-name")).sendKeys("test_user"); driver.findElement(By.id("password")).sendKeys("test_password"); driver.findElement(By.id("login-button")).click(); // 验证登录失败,停留在登录页 assertEquals(driver.getCurrentUrl(), "https://www.saucedemo.com/"); // 验证错误提示元素存在 assertTrue(driver.findElement(By.cssSelector("[data-test='error']")).isDisplayed()); } @AfterTest public void tearDown() { // 关闭浏览器,释放资源 if (driver != null) { driver.quit(); } } }
配套LoginPage类实现(页面对象模型)
需确保LoginPage类已正确实现,示例如下:
package TestCart; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; public class LoginPage { private WebDriver driver; @FindBy(id = "user-name") private WebElement userNameInput; @FindBy(id = "password") private WebElement passwordInput; @FindBy(id = "login-button") private WebElement loginButton; @FindBy(css = "[data-test='error']") private WebElement errorMsg; public LoginPage(WebDriver driver) { this.driver = driver; PageFactory.initElements(driver, this); } public void open() { driver.get("https://saucedemo.com"); } public boolean atPage() { return driver.getCurrentUrl().equals("https://www.saucedemo.com/"); } public void enterUserName(String username) { userNameInput.sendKeys(username); } public void enterPassword(String password) { passwordInput.sendKeys(password); } public void clickLogin() { loginButton.click(); } public boolean hasErrorMsg() { return errorMsg.isDisplayed(); } }
额外注意事项
需确保ChromeDriver版本与本地Chrome浏览器版本匹配,可通过系统属性配置webdriver.chrome.driver路径,例如在setUp方法开头添加:
System.setProperty("webdriver.chrome.driver", "你的ChromeDriver路径");
内容的提问来源于stack exchange,提问作者Denis Kuznecow
相关产品推荐
相关产品推荐

