通过Selenium WebDriver和JUnit在@AfterClass注释方法中调用driver.quit()时发生java.lang.NullPointerException

时间:2018-06-08 17:52:42

标签: selenium selenium-webdriver junit webdriver selenium-chromedriver

我使用JUnit创建了一个测试,并且在类@AfterClass中,我将driver.quit()命令用于在测试完成时关闭浏览器,但是eclipse显示了java.lang.NullPointerException消息。

测试类填充多个字段,然后在基础中进行查询,在Eclipse控制台中显示结果,并关闭浏览器但显示java.lang.NullPointerException消息。

以下是日志和测试脚本。

Eclipse Console

public class validarStatus {

private static WebDriver driver;

@Before
public void setUp() throws Exception {

    System.setProperty("webdriver.chrome.driver", "E:\\Selenium\\chromedriver.exe");

}

@Test
public void validarStatusOs() throws InterruptedException {

    WebDriver driver = new ChromeDriver();
    driver.get("http://10.5.9.45/BKOMais_S86825EstrategiaBackOfficeClaroFixo");
    driver.manage().window().maximize();

    // Logar BkoMais
    driver.findElement(By.id("matricula_I")).sendKeys("844502");
    driver.findElement(By.id("senha_I")).sendKeys("Pw34Jdt#*");
    driver.findElement(By.id("bt_entrar")).click();

    // Logar na Estratégia
    driver.findElement(By.id("mn_backoffice")).click();
    driver.findElement(By.id("mn_bkoffice_prod_203")).click();// Produto
    driver.findElement(By.id("mn_bkoffice_est_57")).click();// Estratégia

    // Selecionado a atividade
    Select atividade = new Select(driver.findElement(By.id("cboAtividade")));
    atividade.selectByIndex(3);

    // Registro >> Novo
    Thread.sleep(500);
    driver.findElement(By.id("mn_registro")).click();
    driver.findElement(By.id("mn_novo_caso")).click();

    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

    // Cod Os Estratégia VREL
    String CodOs = driver.findElement(By.xpath("//*[@id=\"content\"]/div[1]/fieldset[1]/div[2]/div[3]/span"))
            .getText();

    // Campo Análise de Contrato
    Select analiseContrato = new Select(driver.findElement(By.id("cboMotivo")));
    analiseContrato.selectByIndex(5);

    try {
        // Campo Ação
        Select acao = new Select(driver.findElement(By.id("cboSubMotivo")));
        acao.selectByIndex(3);

        // Status
        WebDriverWait wait = new WebDriverWait(driver, 10);
        WebElement ele = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("cboStatus")));
        String valorStatus = ele.getText();
        // driver.findElement(By.id("cboStatus")).getText();
        Assert.assertEquals(" R", valorStatus);

        // Chamado
        driver.findElement(By.id("txtChamado")).sendKeys("Teste");

        // Observação
        driver.findElement(By.id("txtObservacao")).sendKeys("Teste 07/06/2018");

        // Botão Salvar
        driver.findElement(By.id("btnSalvar")).click();

    } catch (StaleElementReferenceException e) {

        // Campo Ação
        Select acao = new Select(driver.findElement(By.id("cboSubMotivo")));
        acao.selectByIndex(3);

        // Status
        WebDriverWait wait = new WebDriverWait(driver, 10);
        WebElement ele = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("cboStatus")));
        String valorStatus = ele.getText();

        // String valorStatus = driver.findElement(By.id("cboStatus")).getText();
        Assert.assertEquals(" R", valorStatus);
        // Chamado
        driver.findElement(By.id("txtChamado")).sendKeys("Teste");

        // Observação
        driver.findElement(By.id("txtObservacao")).sendKeys("Teste 07/06/2018");

        // Botão Salvar
        driver.findElement(By.id("btnSalvar")).click();

    } catch (Exception e) {

        // Campo Ação
        Select acao = new Select(driver.findElement(By.id("cboSubMotivo")));
        acao.selectByIndex(3);

        // Status
        String valorStatus = driver.findElement(By.id("cboStatus")).getText();
        Assert.assertEquals(" R", valorStatus);

        // Chamado
        driver.findElement(By.id("txtChamado")).sendKeys("Teste");

        // Observação
        driver.findElement(By.id("txtObservacao")).sendKeys("Teste 07/06/2018");

        // Botão Salvar
        driver.findElement(By.id("btnSalvar")).click();

    }

    // Select na base para validar o status da NU_OS
    ValidarEstrategiaPage p = new ValidarEstrategiaPage();
    p.returnNuOs(CodOs);

    // Saindo do Bko+
    Thread.sleep(1000);
    driver.findElement(By.linkText("Sair")).click();

}

@AfterClass
public static void closeBrowser() {

    driver.quit();

}}

2 个答案:

答案 0 :(得分:2)

您在方法中明确将WebDriver对象定义为局部变量:

@Test
public void validarStatusOs() throws InterruptedException {
  WebDriver driver = new ChromeDriver();

为了使'After'和'Test'方法与全局变量交互,请更改为:

@Test
public void validarStatusOs() throws InterruptedException {
  driver = new ChromeDriver();

顺便说一句,将您的班级名称从'validarStatus'更改为'ValidarStatus'。以大写字母开头的类名是Java中的一个主要最佳实践。

答案 1 :(得分:1)

根据您的代码块,您已将 WebDriver 全局实例定义为:

private static WebDriver driver;

validarStatusOs()方法中,您已将 WebDriver 的另一个本地实例初始化为:

WebDriver driver = new ChromeDriver();

当您的程序控制来自validarStatusOs()方法时,无法再访问 WebDriver 本地实例

因此,当您的程序控件进入closeBrowser()方法时,它会尝试使用 WebDriver 全局实例并抛出 {{1 }}

解决方案

当您声明 WebDriver 全局实例时,请在整个程序中使用相同的实例。所以你需要改变这一行:

java.lang.NullPointerException

要:

WebDriver driver = new ChromeDriver();