2017-12-21 7 views
0

Ich bekomme NullPointerException, wenn ich versuche, Test zu erstellen, indem ich abstrakte Klasse und Testklasse erweitere. Fehler:TestNG NullPointerException mit Selenium und Page Objektmuster

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)

Der Treiber initialisiert wird, öffnet sich die Testseite und Ausnahme ausgelöst wird, wenn in dem Gebiet zu füllen versuchen. Meine Klassen:

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"); 
    } 

} 

Was ich hier fehlt?

Antwort

1

Grund dafür ist: ‚Fahrer‘ Mitglied der ‚Userregistrierung‘ Seite bleibt null, wenn Sie auf ‚userRegistrationPage.fillName (‚John‘)‘ Linie erreichen.

sehen diese

enter image description here

Dies liegt daran, @BeforeSuite Konstruktor (Methode in 'AbstractTest' test liegend nach Konstruktor UserRegistrationPage aufgerufen wird, wird aufgerufen. So Sequenz jetzt

1) von AbstraktSeite. (hier ist Ihr Treiber null)

2) Konstruktor von UserRegistrationPage. (Hier ist Ihr Treiber null)

3) @BeforeSuite von AbstractTest. (Hier Ihr Fahrer nicht null sein, aber bis zu diesem Zeitpunkt haben Sie bereits Gegenstand von ‚UserRegistrationPage‘ initialisiert mit Linie in ‚UserRegistrationpageTest‘ Klasse

private UserRegistrationPage userRegistrationPage = new UserRegistrationPage(driver); 

diese Initialisierung Lage von ‚UserRegistrationPage‘, änderte Aufgabe zu lösen innen 'openURL' wie unten

enter image description here

+0

Danke! Es hat mein Problem gelöst. – Sig

0

Bei der Verwendung von 'PageFactory' müssen Sie die WebElements initialisieren. fügen sie dem 'AbstractPage'

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

Seltsam, jetzt immer Nullpointer gezeigt, aber ein bisschen anders: 'java.lang.NullPointerException \t bei org.openqa.selenium.support.pagefactory.DefaultEleme ntLocator.findElement (DefaultElementLocator.java:69) \t bei org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke (LocatingElementHandler.java:38) \t bei com.sun.proxy. Proxy9.sendKeys $ (Unbekannt Source) \t bei pages.UserRegistrationPage.fillName (UserRegistrationPage.java:61) \t bei UserRegistrationpageTest.fillName (UserRegistrationpageTest.java:26) \t bei sun.reflect.NativeMethodAccessorImpl.invoke0 (Mutter Methode) ' – Sig

+0

@Sig Versuchen Sie, Verschieben Sie es in den 'UserRegistrationPage'-Konstruktor. – Guy

+0

Kein Glück, aber was ist seltsam, wenn ich TestNG mit Junit ersetze alles funktioniert gut. – Sig

0

Die UserRegistrationPage die die AbstractPage erweitert die WebDriver Instanz driver verwendet. Daher müssen Sie den Konstruktor definieren:

WebDriver driver; 

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

Ich glaube, der OP-Code macht dies bereits, indem er 'super (driver)' aufruft. Also wird dieser Konstruktor nicht benötigt. –

Verwandte Themen