Модель Selenium POM: ошибка java.lang.NullPointerException. Не удается ввести значения для веб-элементов или выбрать элементы

Я впервые реализую модель POM slenium.

Я использую скелетную функцию для инициализации моего 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.

Я сделал вывод о проблеме, поскольку она возникает из-за того, что все объекты класса (разных страниц) инициализируются во время запуска набора селенов, и, следовательно, мой класс элементов, выполняемый во второй или третьей позиции, не был инициализирован.

Первая строка в приведенном ниже коде используется для получения экземпляра драйвера, а оставшийся код используется для создания объектов.

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

person Abhinav    schedule 19.05.2015    source источник
comment
Возможно, создайте gist и покажите, как вы создаете экземпляры всех трех объектов, если это возможно, и сузьте причину   -  person Saifur    schedule 19.05.2015
comment
gist.github.com/anonymous/   -  person Abhinav    schedule 19.05.2015
comment
вставьте трассировку стека. Какая строка выдает ошибку?   -  person ACV    schedule 19.05.2015


Ответы (2)


Похоже, проблема связана с экземпляром driver. Вам нужно переопределить драйвер в PageObject на тот, что был в тесте. Чтобы быть точным, вы должны создать BaseClass, который обрабатывает все распространенные методы, создание экземпляров драйвера, создание экземпляров pageFactory и Elements, и наследовать его от каждого объекта PageObject, чтобы уменьшить путаницу и дублирование. У меня есть пример здесь, если это поможет.

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); 
    }
}
person Saifur    schedule 19.05.2015
comment
Я создал базовый класс, в котором создаются объекты всех классов. Я использовал скелетную функцию, так что везде используется один и тот же объект веб-драйвера. Но после запуска теста создается экземпляр всего объекта, поэтому веб-элементы и элементы выбора не найдены. Объекты создаются на первой ноте, а элементы не найдены. Как я могу решить эту проблему, чтобы использовался обновленный драйвер, а элементы заполнялись по мере необходимости. - person Abhinav; 19.05.2015
comment
Я отослал вас на гитхаб. Я так обычно справляюсь - person Saifur; 19.05.2015
comment
Я внес изменения, но все еще не могу решить проблему. Однако я могу objThirdClass.action1(); выполняется, но setelement1 по-прежнему выдает nullexceptionerror. - person Abhinav; 20.05.2015

Я ссылался на ссылку ниже:

элемент выбора веб-драйвера селена

Select(WebElement element)

Итак, если вы сделаете что-то вроде этого:

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

Он должен работать.

Кстати, я использую тот же подход, что и вы, в «обходном пути», потому что я не хочу создавать новый объект WebElement, когда мне нужен объект Select. Но так или иначе,

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);

Это решило проблему.

person Abhinav    schedule 20.05.2015