Разница между использованием @FindBy и By; в чем может быть причина этой ошибки?

Я автоматизирую https://www.zoho.com/login.html. На этой странице есть раздел входа в рамку. Когда я переключаюсь между разными фреймами и ищу поле «Электронная почта/телефон» (раздел «Войти»), я могу найти его и, следовательно, использовать рабочий блок (ниже), но не могу использовать аналогичный код (также ниже), единственная разница между двумя блоками так я идентифицировал свой элемент userNameInputBox.

// Это работает

       List<WebElement> iframeElements =   driver.findElements(By.tagName("iframe"));
                int nFrames = iframeElements.size();

        //Switching frame to go to login frame  
        for (int i=0; i<=nFrames ; i++) {
            System.out.println("nFrames: " +nFrames);
            driver.switchTo().frame(i);
            if (driver.findElement(By.name("lid")).isDisplayed()){


                driver.findElement(By.name("lid")).sendKeys("myuserName1");
}}

Однако, если я использую это (код ниже), он не работает и вместо этого дает мне исключение NullPointerException в строке, где я щелкаю свой userNameInput в поле имени пользователя.

///Это не работает

//Elements

    @FindBy(name="lid")
    WebElement userNameInput;

//Switching frame to go to login frame  
        for (int i=0; i<=nFrames ; i++) {
            System.out.println("nFrames: " +nFrames);
            driver.switchTo().frame(i);
            if (driver.findElement(By.name("lid")).isDisplayed()){
                userNameInput.click(); //clicking the inputBox
                userNameInput.sendKeys("myuserName"); //Sendingkeys into
}}

Может кто-нибудь объяснить, что может быть причиной такой аномалии? Или указать, что я пропустил? Я хочу использовать @FindBy для WebElement.


person PJAutomator    schedule 28.04.2017    source источник


Ответы (1)


Тег @FindBy предназначен для работы с моделью Page Object. Чтобы использовать его, вы должны инициализировать объект страницы с помощью PageFactory, чтобы поля были инициализированы, а затем «найдены» веб-драйвером.

См. https://github.com/SeleniumHQ/selenium/wiki/PageFactory для документация на него.

Поэтому, прежде чем вы попытаетесь использовать поле userNameInput, вам понадобится какая-то строка, например

PageFactory.initElements(driver, page); (где page var — это класс, использующий аннотацию @FindBy.

person nofacade    schedule 28.04.2017
comment
Точно, пропустил то же самое, что вы указали. Работает плавно. Спасибо. - person PJAutomator; 28.04.2017