2017-12-21 43 views
0

추상 클래스 및 테스트 클래스를 확장하여 테스트를 만들 때 NullPointerException이 발생합니다. 오류 :TestNG Selenium 및 Page Object Pattern을 사용한 NullPointerException

java.lang.NullPointerException at pages.UserRegistrationPage.fillName(UserRegistrationPage.java:61) at UserRegistrationpageTest.fillName(UserRegistrationpageTest.java:26) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124) at org.testng.internal.Invoker.invokeMethod(Invoker.java:571) at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:707) at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:979) at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125) at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109) at org.testng.TestRunner.privateRun(TestRunner.java:648) at org.testng.TestRunner.run(TestRunner.java:505) at org.testng.SuiteRunner.runTest(SuiteRunner.java:455) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415) at org.testng.SuiteRunner.run(SuiteRunner.java:364) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1187) at org.testng.TestNG.runSuitesLocally(TestNG.java:1116) at org.testng.TestNG.runSuites(TestNG.java:1028) at org.testng.TestNG.run(TestNG.java:996) at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72) at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)

드라이버가 초기화되고 테스트 페이지가 열리 며 필드를 채우는 중에 예외가 발생합니다. 내 수업 :

public abstract class AbstractPage { 
     private WebDriver driver; 
     public AbstractPage(WebDriver driver){ 
      this.driver = driver; 
     } 
    } 

    public class UserRegistrationPage extends AbstractPage{ 

     @FindBy(id = "input-firstname") 
     private WebElement firstName; 

     @FindBy(id = "input-lastname") 
     private WebElement lastName; 

     @FindBy(id = "input-email") 
     private WebElement email; 

     @FindBy(id = "input-telephone") 
     private WebElement telephone; 

     @FindBy(xpath = "//*[@id=\"input-fax\"]") 
     private WebElement fax; 

     @FindBy(id = "input-address-1") 
     private WebElement address; 

     @FindBy(id = "input-city") 
     private WebElement city; 

     @FindBy(id = "input-postcode") 
     private WebElement postcode; 

     @FindBy(id = "input-country") 
     private WebElement country; 

     @FindBy(id = "input-zone") 
     private WebElement zone; 

     @FindBy(id = "input-password") 
     private WebElement password; 

     @FindBy(id = "input-confirm") 
     private WebElement passwordConfirm; 

     @FindBy(css = "#content input[type=\"checkbox\"]:nth-child(2)") 
     private WebElement agreeCheckbox; 

     @FindBy (xpath = "//*[@id=\"content\"]/form/div/div/input[2]") 
     private WebElement submitButton; 

     public UserRegistrationPage(WebDriver driver) { 
      super(driver); 
     } 


     public void fillName(String name){ 
      this.firstName.sendKeys(name); 
     } 
    } 

public abstract class AbstractTest { 

    protected WebDriver driver; 
    @BeforeSuite 
    public void setUpDriver(){ 
     driver = new FirefoxDriver(); 
    } 
} 

public class UserRegistrationpageTest extends AbstractTest{ 

    private UserRegistrationPage userRegistrationPage = new UserRegistrationPage(driver); 


    @BeforeTest 
    void openURL(){ 
     driver.get("http://88.119.151.54/opencartone/index.php?route=account/register"); 
    } 

    @AfterTest 
    void closeBrowser(){ 
     driver.quit(); 
    } 

    @Test 
    void fillName(){ 
     userRegistrationPage.fillName("John"); 
    } 

} 

내가 무엇을 놓치지 요?

답변

1

이유 : 그래서 당신은 생성자를 정의해야합니다.

enter image description here

이 @BeforeSuite 때문에

의 생성자 (메소드가 호출되는 UserRegistrationPage의 생성자 후 호출되는 내부 'AbstractTest'테스트를 거짓말입니다. 그래서 순서가 지금

1) 참조 AbstractPage. (여기에 귀하의 드라이버가 null입니다)

2) UserRegistrationPage의 생성자. (여기에 당신의 드라이버는 null입니다)

3) AbstractTest의 @BeforeSuite.

private UserRegistrationPage userRegistrationPage = new UserRegistrationPage(driver); 

'UserRegistrationPage'개체의 변경 초기화 위치를 해결하기 위해 (여기 드라이버가 null이되지 않습니다,하지만이 시간까지 당신은 이미 'UserRegistrationpageTest'클래스 줄을 사용하여 'UserRegistrationPage'의 객체를 초기화 한

enter image description here

+0

감사합니다! 그것은 내 문제를 해결했다. – Sig

0

'PageFactory'를 사용하는 경우 WebElements을 초기화해야합니다. AbstractPage을 연장 UserRegistrationPageWebDriver 인스턴스 driver을 사용하는 'AbstractPage'

public AbstractPage(WebDriver driver) { 
    this.driver = driver; 
    PageFactory.initElements(driver, this); 
} 
+0

이상한 아래와 같이 '의 OpenURL'안에, 지금 NullPointerException이 점점하지만 약간 다른'java.lang.NullPointerException이 \t org.openqa.selenium.support.pagefactory.DefaultEleme에서 ntLocator.findElement (DefaultElementLocator.java:69) org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke에서 \t (LocatingElementHandler.java:38) com.sun.proxy에서 \t. $ Proxy9.sendKeys (알 수없는 소스) pages.UserRegistrationPage.fillName (UserRegistrationPage.java:61) UserRegistrationpageTest.fillName에서 \t (UserRegistrationpageTest.java:26)에서 \t sun.reflect.NativeMethodAccessorImpl.invoke0 (기본 방법)에서 \t' – Sig

+0

하는 것을 시도 @Sig 그것을'UserRegistrationPage' 생성자로 옮깁니다. – Guy

+0

행운은 없지만, TestNG를 Junit으로 바꾸면 이상하게 생각합니다. – Sig

0

에 추가. 당신이 'userRegistrationPage.fillName ("존")'라인에 도달하면 'UserRegistration'페이지의 '드라이버'멤버, 널 (null) 남아 : 존재가

WebDriver driver; 

//constructor 
public UserRegistrationPage(WebDriver driver) 
{ 
    this.driver=driver; 
} 
+0

나는 OP의 코드가 이미'super (driver)'를 호출함으로써 이것을한다고 믿는다. 따라서이 생성자는 필요하지 않습니다. –