2016-07-28 65 views
0

使用Selenium w Java和Test NG(POM格式)將所有內容從非靜態切換爲靜態,並相應地更改所有內容,獲得NullPointerException。當所有東西都不是靜態的時候它就工作了,但是讓所有東西都靜態需要更少的代碼,所以我更喜歡這樣。當我將所有方法都改爲靜態時,發生NullPointerException

這是我的代碼..雖然試圖粘貼我的代碼出於某種原因,它不能識別導入語句作爲代碼,所以我只是沒有包含它們,但放心一切都已導入所需! :)

Package pages; 
public class locationPage { 

WebDriver driver; 
static @FindBy (id="btn_bogota") WebElement chooseBogota; 
static @FindBy (id="btn_medellin") WebElement chooseMedellin; 
static @FindBy (xpath="//title") WebElement pageTitle; 


public locationPage (WebDriver driver){ 
    this.driver=driver; 
    PageFactory.initElements(driver, this); 
} 

public static void chooseLocation (String location) { 
    if (location.equals("Bogota")) 
    { 
     chooseBogota.click(); 
    } 
    else if (location.equals("Medellin")){ 
     chooseMedellin.click(); 
    } 
} 
} 

Package testcases; 
public class selectLocation { 

WebDriver driver; 

@BeforeClass 
public void setup() throws InterruptedException{ 
    driver = new FirefoxDriver(); 
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
    driver.get("http://dev01.juanregala.com.co/");  
    //Generating Alert Using Javascript Executor 
    JavascriptExecutor javascript = (JavascriptExecutor) driver; 
    javascript.executeScript("alert('Select Location');"); 
    Thread.sleep(2000); 
    driver.switchTo().alert().accept(); 
} 

@AfterTest 
public void quit(){ 
    driver.quit(); 
} 

@Test (priority=0) 
public void location(){ 
    locationPage.chooseLocation("Medellin"); 
} 
} 

它不斷給我一個NullPointerException指

  chooseMedellin.click(); 

 locationPage.chooseLocation("Medellin"); 

我真的不知道怎麼回事,來形容我的問題: (請幫忙!

+0

也...我想你可能不理解使用'@ AfterTest'註釋TestNG中的。在每種測試方法之後,* not *運行,而是在特定TestNG套件的''節點中的所有測試之後運行。我認爲你實際上需要'@ BeforeMethod'和'@ AfterMethod'註釋,它們分別在每個**'@ Test'方法之前和之後運行。請參閱TestNG文檔:http://testng.org/doc/documentation-main.html –

+0

是的,我發佈這個問題後立刻改變了它!非常感謝您認識到:) – daniyalmistry

回答

0

您正在收到NullPointerException,因爲這些字段未初始化。您不能以這種方式使用頁面對象。即使可以,也可能不想,因爲頁面對象綁定到特定的Web驅動程序,這意味着您不能在多個測試中使用相同的頁面對象並且並行運行它們。

基本上,PageFactory只適用於對象instances。它不會初始化靜態字段,即使這樣做,您也只是從頁面的構造函數調用頁面工廠,並且永遠不會調用它,因爲您只需在該類上調用靜態方法。

您需要創建一個頁面對象的實例,然後將其與將運行頁面對象的驅動程序一起傳遞給PageFactory

簡單的例子:

public class FooTest { 

    private WebDriver driver; 
    private FooPage page; 

    @BeforeMethod 
    public void setup() { 
     driver = new FirefoxDriver(); 
     page = PageFactory.initElements(driver, FooPage.class); 
    } 

    @AfterMethod 
    public void tearDown() { 
     try { 
      driver.quit(); 
     } catch (Exception ignore) { } 
     driver = null; 
     page = null; 
    } 

    @Test 
    public void testFoo() { 

    } 
} 

public class FooPage { 
    @FindBy(id="foo") 
    private WebElement fooElement; 

    public void clickFoo() { 
     fooElement.click(); 
    } 
} 

注行:

page = PageFactory.initElements(driver, FooPage.class); 

這種方法實際上將調用FooPage默認的構造。你也可以自己實例化對象,並把它傳遞給頁面的工廠是這樣的:

page = new FooPage(); 
PageFactory.initElements(driver, page); 
+0

「您需要創建頁面對象的實例,然後將其傳遞給PageFactory以及將運行頁面對象的驅動程序。」 - 你能寫一段代碼來做這件事嗎?我有點困惑:/ – daniyalmistry

+0

@daniyalmistry我編輯了我的答案,添加了一個示例代碼。對不起,花了很多時間......忙了一天:-) –

+0

沒問題!非常感謝 :) – daniyalmistry

相關問題