【问题标题】:NullPointerException when I changed all my methods to static当我将所有方法更改为静态时出现 NullPointerException
【发布时间】:2016-12-03 12:57:36
【问题描述】:

使用 Selenium w Java 和测试 NG(POM 格式)将所有内容从非静态切换到静态并相应地更改所有内容,得到 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");

我不确定如何描述我的问题:(请帮忙!

【问题讨论】:

  • 另外......我想你可能不理解 TestNG 中 @AfterTest 注释的使用。这不是在每个测试方法之后运行,而是在该特定 TestNG 套件的<test> 节点中的所有测试之后运行。我认为您实际上想要 @BeforeMethod@AfterMethod 注释,它们分别在 each @Test 方法之前和之后运行。请参阅 TestNG 文档:testng.org/doc/documentation-main.html
  • 是的,我在发布问题后立即更改了它!谢谢你承认:)

标签: eclipse selenium static webdriver pom.xml


【解决方案1】:

您收到 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);

【讨论】:

  • "您需要创建页面对象的实例,然后将其与将运行页面对象的驱动程序一起传递给 PageFactory。" ——你能写一段代码来做这件事吗?我有点困惑:/
  • @daniyalmistry 我编辑了答案以添加示例示例代码。很抱歉花了这么多时间……忙碌了一天:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 2013-07-16
  • 1970-01-01
  • 2016-07-27
  • 2014-07-20
相关资源
最近更新 更多