2016-08-25 4 views
1

セレンのwebdriver、testng、およびpage factoryを使用して自動化しようとしています。しかし、私はNULLポインターの例外に直面しています。selenium webdriverのnullポインタ例外 - TestNG - PageFactory

public class BrowserOpenClose extends Common { 
    public WebDriver driver; 

    @BeforeTest 
    @Parameters("browser") 
    public void initBrowser(String browser) { 
     if (browser.equalsIgnoreCase("FF")) { 
      System.setProperty("webdriver.firefox.marionette", "./gecko/geckodriver.exe"); 
      driver = new FirefoxDriver(); 
      driver.manage().window().maximize(); 
      driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
      driver.get("https://www.flipkart.com/"); 
     } else if (browser.equalsIgnoreCase("CH")) { 
      System.setProperty("webdriver.chrome.driver", "./chrome/chromedriver.exe"); 
      driver = new ChromeDriver(); 
      driver.manage().window().maximize(); 
      driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
      driver.get("https://www.flipkart.com/"); 
     } 
    } 

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

    public class Login extends BrowserOpenClose { 

    @FindBy(xpath = "//a[text()='Log In']") 
    private WebElement loginLink; 

    @FindBy(xpath = "//input[@class='_2zrpKA']") 
    private WebElement username; 

    @FindBy(xpath = "//input[@class='_2zrpKA _3v41xv']") 
    private WebElement password; 

    @FindBy(xpath = "//button[@class='_3zLR9i _1LctnI _36SmAs']") 
    private WebElement loginButton; 

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

    public void openLoginDialog() { 
     loginLink.click(); 
    } 

    public void enterUsername(String name) { 
     username.sendKeys(name); 
    } 

    public void enterPassword(String pass) { 
     password.sendKeys(pass); 
    } 

    public void clickLogin() { 
     loginButton.click(); 
    } 

} 

    public class SwitchTShirtPage extends BrowserOpenClose { 
    WebDriver driver; 
    Login login; 

    @BeforeMethod 
    public void initElements() { 
     login = new Login(driver); 
    } 

    @Test 
    public void switchToTShirt() { 
     login.openLoginDialog(); 
     login.enterUsername("abc"); 
     login.enterPassword("xyz"); 
     login.clickLogin(); 
    } 

} 

エラートレースログ:org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElementでjava.lang.NullPointerExceptionが(DefaultElementLocator.java:69) org.openqa.seleniumで。 $ Proxy9.click(Unknown Source)at com.login.test.Login.openLoginDialog(Login.java:50):com.login.test.Login.openLoginDialog(Login.java:50) com.homepage.test.SwitchTShirtPage.switchToTShirt(SwitchTShirtPage.java:28) at sun.reflect.Nati で java.lang.reflect.Method.invoke(不明なソース)で sun.reflect.DelegatingMethodAccessorImpl.invoke(不明なソース)で sun.reflect.NativeMethodAccessorImpl.invoke(不明なソース)でveMethodAccessorImpl.invoke0(ネイティブメソッド) Invoker.invokeMethod(Invoker.java:646)at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:Invoker.java:646) にあるorg.testng.internal.InvokeMethod(MethodInvocationHelper.java:100) で、 org.testng.internal.TestMethodWorker.runでorg.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129) でorg.testng.internal.Invoker.invokeTestMethods(Invoker.java:1129)における811) (TestMethodWorker.java:112) でorg.testng.SuiteRunner.runTest(SuiteRunner.java:366)で org.testng.TestRunner.run(TestRunner.java:600)でorg.testng.TestRunner.privateRun(TestRunner.java:746)でorg.testng.SuiteRunner.runSequentially(SuiteRunner.java:361)at org.testng.SuiteRunner.privateRun(SuiteRunner.java:319) org.testng.SuiteRunner.run(SuiteRunner.java:268)at org。 org.testngでorg.testng.TestNG.runSuitesSequentially(TestNG.java:1264)で org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)でtestng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)。 TestNG.runSuitesLocally(TestNG.java:1189) org.testng.TestNG.runSuites(TestNG.java:1104)at org.testng.TestNG.run(TestNG.java:1076)at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:126) at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:152) org.testng.remote.RemoteTestNG.mainで) (RemoteTestNG.java:57)

+0

'initElements()'で 'Login'をインスタンス化している最中に、スーパークラス(' BrowserOpenClose') 'driver'リファレンスを渡す必要があります。'SwitchTShirtPage')' driver'リファレンスです。これは初期化されていません。結果として 'java.lang.NullPointerException'が返されます。 –

+0

ありがとう:) @AtulDwivedi –

答えて

0

WebDriver driverSwitchTShirtPageから初期化されず、常にnullあるん。

BrowserOpenCloseのいずれかを入力してください。SwitchTShirtPageから宣言を削除してください。

driver@BeforeTestで初期化されており、テスト(クラスのグループ)で1回のみ実行されるため、注意してください。したがって、BrowserOpenCloseの最初のインスタンスのみがdriverに初期化されます。 @BeforeTest@BeforeClassに置き換えて問題を修正することを検討してください。

+0

ありがとう:) Julien –

+0

Julien私は初期段階にあるので、@BeforeTestを使用し、後でそれぞれの注釈に変更されます。ご協力いただきありがとうございます。 –