2015-05-19 32 views
2

我首次實現了POM模型sleneium。Selenium POM模型:java.lang.NullPointerException錯誤。無法輸入webelements的值或選擇元素

我正在使用骨架函數來初始化我的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 suite的lauch期間被初始化並且因此我的元素類在第二或第三位執行而未被初始化。

以下代碼的第一行用於獲取驅動程序實例,其餘代碼用於創建對象。

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

使用objFirstClass,我可以登錄到我的系統並驗證我的登錄。 使用objSecondClass,我可以打印字符串來表示登錄成功。 但使用objThirdClass,我無法輸入WebElements或Select對象的值。

它給Null異常錯誤。

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(); 
     } 
} 
+0

大概創建[gist](https://gist.github.com/),並展示如何儘可能實例化所有三個對象並縮小原因 – Saifur

+0

連接的Gist鏈接 – Abhinav

+0

https://gist.github。 com/anonymous/29246c0de32f9290388e#file-gistfile1-txt – Abhinav

回答

0

我提到以下鏈接:

selenium webdriver select element

Select(WebElement element) 

所以,如果你做這樣的事情:

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

它應該工作。

順便說一句,我在「解決方法」中使用相同的方法,因爲我不想在需要選擇對象時投射新的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); 

它解決了問題。

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); 
    } 
} 
+0

我創建了一個基類,其中創建了所有類的對象。我已經使用了骨架函數,以便始終使用相同的web驅動程序對象。但是一旦運行測試,所有對象都會被實例化,因此找不到選擇對象。對象在第一個音符上得到實例化,並且找不到元素。我如何解決這個問題,以便使用更新的驅動程序,並在需要時填充元素。 – Abhinav

+0

我把你介紹給一個github。這就是我通常如何處理 – Saifur

+0

我已經做出更改但仍無法解決問題。但是,我可以「objThirdClass.action1();」被執行,但setelement1仍然拋出nullexceptionerror。 – Abhinav

相關問題