使用@FindBy 和 By 的区别;这个错误可能是什么原因?

Difference between using @FindBy and By; what could be thre reason for this error?

我正在自动化 https://www.zoho.com/login.html。此页面在框架内有登录部分。当我切换不同的框架并搜索我的 Email/Phone 字段(登录部分)时,我可以找到它然后使用工作块(下面)但不能使用类似的代码(也在下面)之间的唯一区别两块是我如何识别我的 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");
}}

但是,如果我使用这个(下面的代码)它不起作用,而是在我单击我的 userNameInput 到用户名字段的行中给我 NullPointerException。

///这是行不通的

//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
}}

谁能解释一下这种异常的原因是什么?或者指出我错过了什么?我想为 WebElement 使用 @FindBy。

@FindBy 标签设计用于页面对象模型。要使用它,您必须使用 PageFactory 初始化页面对象,以便初始化字段,然后由 webdriver "found"。

有关它的文档,请参阅 https://github.com/SeleniumHQ/selenium/wiki/PageFactory

因此,在您尝试使用 userNameInput 字段之前,您必须有一些像

这样的行

PageFactory.initElements(driver, page); (其中 page var 是使用 @FindBy 注释的 class。