2016-07-28 80 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