【问题标题】:NullPointerException when running my test with page factory使用页面工厂运行我的测试时出现 NullPointerException
【发布时间】:2016-09-14 14:42:08
【问题描述】:

我在运行测试时遇到异常。我正在将硒与页面工厂一起使用。当我运行以下代码时,它将打开网站并失败并出现以下异常。在我的测试用例中它没有执行HomePage.ClickbtnCookieWarning()

谁能帮我理解为什么我的代码不起作用?

配置失败:@BeforeTest 设置 java.lang.NullPointerException 在 org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69) 在 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("aa@yahoo.com", "125", "Test");

    }

【问题讨论】:

  • LoginLink 为空。关键是要弄清楚为什么它没有被初始化。也许@FindBy 失败了。
  • 你需要在PageFactory.initElements..as driver = new FirefoxDriver();HomePage HomePage= PageFactory.initElements(driver, HomePage.class); login loginpage =PageFactory.initElements(driver, login.class);之前初始化webdriver
  • 谢谢。你能给我更多的细节吗?知道为什么@FindBy 失败了吗?您对我的代码有什么建议吗?
  • Saurabh Gaur:谢谢。它正在工作。如果我在同一个类中有另一个方法,例如:在我的测试用例中,我在 @Test 下有另一个方法,我需要使用 HomePage 类和登录页面类中的元素。我需要在该方法中再次使用 PageFactory.initElements 吗?有没有办法让类中的所有方法都公开以下几行? HomePage HomePage= PageFactory.initElements(driver, HomePage.class); login loginpage =PageFactory.initElements(driver, login.class);

标签: java selenium


【解决方案1】:

你得到NullPointerException是因为你在初始化之前使用了WebDriver实例。

你需要在使用这个实例之前初始化WebDriver:-

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

如果您想将WebDriver 用作singleton,它为您的所有测试方法返回单个实例,您可以follow this answer which is exactly you want

【讨论】:

    【解决方案2】:

    问题在于您正在创建新的驱动程序实例的每个类。您只需要在您的基类中创建一个驱动程序实例,您可以在其中进行浏览器设置。请参阅页面对象模型。创建 Driver 实例后,您需要在所有类中使用相同的实例。否则它会抛出 NullPointerException 因为驱动程序没有任何引用。

    【讨论】:

      猜你喜欢
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 1970-01-01
      • 2017-10-13
      相关资源
      最近更新 更多