我正在获取页面工厂模型中@FindBy注释下定义的webelement的空指针异常

时间:2017-02-04 09:29:02

标签: selenium-webdriver testng-eclipse

我是Selenium学习的新手。我尝试在我的代码中使用网络元素null pointer exception时收到Milestone_Tile_Text.click;但是当我使用

时它可以正常工作
LoginTestScript.fd.findElement(By.linkText("Milestone")).click();

请参阅下面的代码我也使用PageFactory.initElements,但不知道如何解决此错误。

public class MilestoneTileModel 
{

    GenerateTestData objtestdata = new GenerateTestData() ;

        public  MilestoneTileModel() //constructor
            {
                PageFactory.initElements(LoginTestScript.fd, this);
            }

        @FindBy(xpath="//a[text()='Milestone']")
        WebElement Milestone_Tile_Text;

public void Milestone_Tile_Click()
            {
                Milestone_Tile_Text.click();
                LoginTestScript.fd.findElement(By.linkText("Milestone")).click();
LoginTestScript.fd.findElement(By.xpath("//*@id='CPH_btnAddNewMilestoneTop']")).click();
            }
}

2 个答案:

答案 0 :(得分:0)

使用init方法时,可能会更频繁地发生计时问题。

计时问题是当你初始化一个元素时,驱动程序会立即尝试查找元素,如果失败,你将不会收到任何警告,但元素将引用null。

以上情况可能会发生,例如因为页面未完全呈现或驱动程序看到旧版本的页面。

修复可以将元素定义为属性,并在属性的get上使用驱动程序从页面获取元素

请注意,selenium不承诺驱动程序会看到最新版本的页面,因此即使这可能会中断,在某些情况下重试也会有效。

答案 1 :(得分:0)

我看到的第一个问题:你没有设置LoginTestScript

首先,您需要设置PageObject变量: GoogleSearchPage page = PageFactory.initElements(driver, GoogleSearchPage.class);

丰富这一点的最佳方法是单独的页面对象模型和场景划分

你的拳头文件POM应该包含:

LoginTestPOM

 public class LoginTestPOM {
     @FindBy(xpath="//a[text()='Milestone']")
     WebElement MilestoneTileText;

     public void clickMilestoneTitleText(){
            MilestoneTitleText.click();
     }
}

TestScript

import LoginTestPOM
public class TestLogin {
    public static void main(String[] args) {
        // Create a new instance of a driver
        WebDriver driver = new HtmlUnitDriver();

        // Navigate to the right place
        driver.get("http://www.loginPage.com/");

        // Create a new instance of the login page class
        // and initialise any WebElement fields in it.
        LoginTestPOM page = PageFactory.initElements(driver, LoginTestPOM.class);

        // And now do the page action.
        page.clickMilestoneTitleText();
    }
}  

这是Page Object Pattern的基础。

注意:我只在浏览器中编写该代码,因此可能包含一些错误。

LINK:https://github.com/SeleniumHQ/selenium/wiki/PageFactory

没有页面对象模式的“丑陋”解决方案是:

UglyTestScript

public class UglyTestLogin {
    public static void main(String[] args) {
        // Create a new instance of a driver
        WebDriver driver = new HtmlUnitDriver();

        // Navigate to the right place
        driver.get("http://www.loginPage.com/");

        // DON'T create a new instance of the login page class
        // and DON'T initialise any WebElement fields in it.
        // And do the page action.
        driver.findElement(By.xpath("//a[text()='Milestone']").click()
        }
}