2016-09-14 105 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,因为驱动程序不会有任何引用。

相关问题