"的NullPointerException"尝试使用PageFactory运行我的脚本

时间:2017-02-12 18:02:33

标签: java selenium

我已经附加了POM,BaseTest和Test类。我通过右键单击项目尝试将其作为TestNG测试运行,因此下面的代码得到NullPointerException。请问可以建议吗?

POM课程:

package pom;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;

public class Introduction
{

@FindBy(xpath="//a[text()='Hello. Sign In']")
WebElement signInLink;

public Introduction(WebDriver driver)
{
PageFactory.initElements(driver, this);
}

public void signIn()
{
    signInLink.click();
}
}

BaseTest类:

package scripts;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.*;


public class BaseTest 
{
public WebDriver driver;

@BeforeSuite
public void preCondition()
{
    driver= new FirefoxDriver();
    driver.get("https://www.walmart.com/");
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}

@AfterSuite
public void postCondition()
{
    driver.close();
}
}

测试类:

package scripts;

import org.testng.annotations.Test;

import pom.Introduction;

public class SignIn extends BaseTest
{

@Test

public void validSignIn()
{
    Introduction i= new Introduction(driver);
    i.signIn();
}
}

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题。

  • 您正在{{introText}}中实例化您的网络驱动程序。这会导致每个@BeforeSuite标记仅创建一次webdriver实例。因此,所有其他<suite>方法始终会获得@Test,因为NullPointerException带注释的方法不会第二次执行。
  • 您正在使用隐式超时。请不要使用隐式超时。您可以在this SO post。
  • 中阅读更多关于隐式等待的弊端

所以要开始,我建议将测试代码更改为下面的内容

<强> BaseTest.java

@BeforeSuite

<强> SignIn.java

package scripts;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.*;

public class BaseTest {
    private static ThreadLocal<WebDriver> driver = new ThreadLocal<>();

    @BeforeMethod
    public void preCondition() {
        driver.set(new FirefoxDriver());
        driver.get().get("https://www.walmart.com/");
    }

    @AfterMethod
    public void postCondition() {
        driver.get().quit();
    }

    public final WebDriver driver() {
        return driver.get();
    }
}

我们所做的就是选择使用package scripts; import org.testng.annotations.Test; import pom.Introduction; public class SignIn extends BaseTest { @Test public void validSignIn() { Introduction i = new Introduction(driver()); i.signIn(); } } @BeforeMethod来实例化和清理webdriver,因为这些方法可以保证在每个@AfterMethod方法之前和之后执行。然后我们继续使用@Test的{​​{1}}变体,因为ThreadLocal确保每个线程都获得自己的webdriver副本,以便您可以轻松地开始并行运行测试。现在这不是一个问题,但很快你将面临这个问题,因为你开始构建你的实现。您可以阅读我的this blog帖子,了解有关如何使用TestNG求助于并行执行的更多信息。