Selenium POM模型:java.lang.NullPointerException错误。无法输入webelements或select元素的值

时间:2015-05-19 13:06:04

标签: java selenium automated-tests pageobjects

我是第一次实施POM模型sleneium。

我正在使用骨架功能来初始化我的WebDriver。如下:

File pathToBinary = new File("<path>\firefox.exe");
FirefoxBinary binary = new FirefoxBinary(pathToBinary);     
FirefoxProfile profile = new FirefoxProfile();  
profile.setPreference("network.proxy.http", "<proxyaddress>");
profile.setPreference("network.proxy.http_port", "<portnumber>");
driver = new FirefoxDriver(binary, new FirefoxProfile());
driver.manage().window().maximize();

我的应用程序正常启动,我可以登录。但是当我遍历一个不同的链接时,我收到了java.lang.NullPointerException。

我已经推断出这个问题,因为它是由于所有类(不同页面)的对象在selenium套件中被初始化而导致的,因此我的元素类在第二或第三位执行尚未初始化。

以下代码中的第一行用于获取驱动程序的实例,其余代码用于创建对象。

WebDriver driver = Driver.AppDriver.getInstance();
FirstClass obFirstClass  = new FirstClass();
SecondClass objSecondClass  = new SecondClass ();   
ThirdClass objThirdClass  = new ThirdClass ();

使用objFirstClass,我可以登录我的系统并验证我的登录信息。 使用objSecondClass,我可以打印字符串来表示登录成功。 但是使用objThirdClass,我无法为WebElements或Select对象输入值。

它会出现Null Exception错误。

public class TestClass 
{
    WebDriver driver = Driver.AppDriver.getInstance();

    FirstClass obFirstClass  = new FirstClass();
    SecondClass objSecondClass  = new SecondClass ();   
    ThirdClass objThirdClass  = new ThirdClass (driver);

    @Test(priority=2)
    public void method()
        {   
            objThirdClass.action1();
            System.out.println("after action"); //-> This line is being printed

            objThirdClass.action2(param1, param2, param3);
        }           
}

public class ThirdClass {

    WebDriver driver = Driver.AppDriver.getInstance();

    public ThirdClass(WebDriver _driver){         
        //This initElements method will create all WebElements 
        driver = _driver;
        PageFactory.initElements(driver, this); 
    }

    @FindBy(xpath=<xpath>)
    WebElement elementCreate;

    @FindBy(id=<id1>)
    Select selectElement1;

    @FindBy(id=<id2>)
    Select selectElement2;

    @FindBy(id=<id3>)
    Select selectElement3;

    @FindBy(id="submit")
    WebElement elementSubmit;

    public void action1()
        {
            JavascriptExecutor executor2 = (JavascriptExecutor)driver;
            executor2.executeScript("arguments[0].click();", elementCreate);
            System.out.println("Create link found");
        }

    public void setElement1(String str1)
        {
            selectElement1.selectByVisibleText(str1);
        }

    public void setElement1(String str2)
        {
            selectElement2.selectByVisibleText(str2);
        }

    public void setElement1(String str3)
        {
            selectElement3.selectByVisibleText(str3);
        }


    public void submit()
        {
            submit.click();
        }


    public void action2(String string1, String string2, String string3,)
        {               
            this.setElement1(str1);
            this.setElement2(str2);
            this.setElement3( str3) 
            this.submit();  
        }   
}

2 个答案:

答案 0 :(得分:0)

似乎问题与driver实例有关。您需要使用测试中的驱动程序覆盖PageObject中的驱动程序。确切地说,您应该创建一个BaseClass来处理所有常见方法,驱动程序实例化,pageFactory和Elements实例化,并从每个PageObjects继承它们以减少混淆和重复。如果有帮助,我有一个例子here

public class TestClass(){
    WebDriver driver = Driver.AppDriver.getInstance();
    driver = new ChromeDriver();

    ThirdClass objThirdClass  = new ThirdClass (driver);

    public void method()
    {   
        objThirdClass.action1();
        System.out.println("after action"); //-> This line is being printed

        objThirdClass.action2(param1, param2, param3);
    }
}


public class ThirdClass {

    WebDriver driver = Driver.AppDriver.getInstance();

    public ThirdClass(WebDriver _driver){ 
        driver  = _driver;
        //This initElements method will create all WebElements 
        PageFactory.initElements(driver, this); 
    }
}

答案 1 :(得分:0)

我在下面提到的链接:

selenium webdriver select element

Select(WebElement element)

所以如果你做这样的事情:

@FindBy(id="foo")
private WebElement wannabeSelect;
Select realSelect = new Select(wannabeSelect);
realSelect.selectByValue("myValue");

它应该有用。

顺便说一句,我在&#34;解决方法&#34;中使用了与您相同的方法。因为我不想在我需要Select对象时转换新的WebElement对象。但无论如何,

sDriver.findElement(By.id("foo"));
returns WebElement, so thats why its working. You can also do this:

 WebElement wannabeSelect = sDriver.findElement(By.id("foo"));
 Select foo = new Select(wannabeSelect);

它解决了问题。