2016-09-14 94 views
0

運行我的測試時出現異常。我在頁面工廠使用硒。當我運行下面的代碼時,它會打開網站並在下面例外失敗。它在我的測試用例中不執行HomePage.ClickbtnCookieWarning()在頁面工廠運行我的測試時出現NullPointerException

有人可以幫我理解爲什麼我的代碼不工作嗎?

失敗配置:在 org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69)@BeforeTest的SetUp顯示java.lang.NullPointerException 在 org.openqa.selenium.support .pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38) 在com.sun.proxy。$ Proxy5.click(來源不明)在 pageObjects.HomePage.ClickLoginLink(HomePage.java:57)在 myaccountsuite.TC1DefaultDeliveryAddDisplay .SetUp(TC1DefaultDeliveryAddDisplay.java:29)

首頁頁面對象

public class HomePage { 

    WebDriver driver; 

    public HomePage (WebDriver driver) 
    { 
     this.driver=driver;   
    } 

    @FindBy(id="ctl00_header_hdrCookieWarning_btnHideCookieWarning") 
    WebElement btnCookieWarning; 

    @FindBy(xpath=".//*@id='ctl00_masterContainerTop_Block_637_LoginView1_ulAnonymous']/li[2]/a") 
    WebElement LoginLink; 

    public void ClickbtnCookieWarning() 
    { 
     btnCookieWarning.click(); 
    } 

    public void ClickLoginLink() 
    { 
     LoginLink.click(); 
    } 
} 

登錄頁面對象

public class login { 

    WebDriver driver; 

    public login(WebDriver driver) 
    { 
     this.driver = driver; 
    } 

    @FindBy(id="ctl00_ContentPlaceHolderMain_container_container_Block_166_lgn1_UserName") 
    WebElement UserName; 

    @FindBy(id="ctl00_ContentPlaceHolderMain_container_container_Block_166_lgn1_Password") 
    WebElement Password; 

    @FindBy(id="ctl00_ContentPlaceHolderMain_container_container_Block_166_lgn1_LoginButton") 
    WebElement btn_LogIn; 

    @FindBy(id="ctl00_ContentPlaceHolderMain_container_container_Block_166_lgn1_txtAccount") 
    WebElement Account; 

    @FindBy(id="ctl00_ContentPlaceHolderMain_container_container_Block_166_lgn1_btnHomeBranch_3") 
    WebElement btn_Continue; 

    public void userLogin(String uname, String pass, String acc) 
    { 
     UserName.sendKeys(uname); 
     Password.sendKeys(pass); 
     btn_LogIn.click(); 
     driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS); 
     Account.sendKeys(acc); 
     btn_LogIn.click(); 
     btn_Continue.click(); 
    }  
} 

我的測試

public class TC1DefaultDeliveryAddDisplay { 
    public WebDriver driver; 

    @BeforeTest(alwaysRun = true) 
    public void SetUp() { 

     HomePage HomePage = PageFactory.initElements(driver, HomePage.class); 
     login loginpage = PageFactory.initElements(driver, login.class); 

     driver = new FirefoxDriver(); 
     driver.get("http://URL/"); 
     HomePage.ClickbtnCookieWarning(); 
     HomePage.ClickLoginLink(); 
     loginpage.userLogin("[email protected]", "125", "Test"); 

    } 
+0

LoginLink爲空。關鍵是弄清楚爲什麼沒有初始化。也許@FindBy失敗了。 –

+0

你需要在'PageFactory.initElements'之前初始化webdriver,因爲'driver = new FirefoxDriver(); HomePage HomePage = PageFactory.initElements(driver,HomePage.class); login loginpage = PageFactory.initElements(driver,login.class);' –

+0

謝謝。你能否給我更多的細節?任何想法爲什麼@FindBy失敗?你有什麼建議改變我的代碼? – Prasa

回答

0

你,因爲你使用的初始化之前WebDriver實例越來越NullPointerException。如果你想使用WebDriversingleton這對於所有的測試方法,您可以follow this answer which is exactly you want返回單一實例

driver = new FirefoxDriver(); 
HomePage HomePage = PageFactory.initElements(driver, HomePage.class); 
Login loginpage =PageFactory.initElements(driver, login.class); 

- :

您需要在使用該實例作爲前初始化WebDriver

0

問題出在您創建驅動程序的新實例的每個類中。你只需要在你的瀏覽器設置的基類中創建一個驅動程序實例。請參考頁面對象模型。一旦創建了Driver實例,您需要在所有類中使用相同的方法。否則它會拋出NullPointerException,因爲驅動程序不會有任何引用。

相關問題