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

定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:45:06