Java 在Selenium中使用@FindBy而不使用PageFactory

Java 在Selenium中使用@FindBy而不使用PageFactory,java,selenium,Java,Selenium,我已经能够成功地将@FindBy与PageFactory一起使用,但培训我的人坚持认为我仍然可以在不使用PageFactory的情况下使用@FindBy。他给我看了他的代码,快速看了一眼,他似乎没有使用PageFactory。但是,在不使用PageFactory的情况下,我总是得到NullPointerException。我让他看看我的代码,他似乎也不知道为什么我的代码不起作用。我希望我能有一双新的眼睛来启发我 下面是我的代码片段 public class BaseClass { public

我已经能够成功地将@FindBy与PageFactory一起使用,但培训我的人坚持认为我仍然可以在不使用PageFactory的情况下使用@FindBy。他给我看了他的代码,快速看了一眼,他似乎没有使用PageFactory。但是,在不使用PageFactory的情况下,我总是得到NullPointerException。我让他看看我的代码,他似乎也不知道为什么我的代码不起作用。我希望我能有一双新的眼睛来启发我

下面是我的代码片段

public class BaseClass {

public WebDriver driver;
private String title;
private Wait<WebDriver> wait;

public BaseClass(WebDriver driver, String title) {

    this.driver = driver;
    this.title = title;
    wait = new FluentWait<WebDriver>(driver).withTimeout(45, TimeUnit.SECONDS).pollingEvery(2, TimeUnit.SECONDS);
}
}

否如果不使用PageFactory,则无法使用。请阅读以下几行以获得正确的解释:

页面工厂将根据定义的“定位器”对实际网页上的对应元素进行引用,从而初始化每个WebElement变量。这是通过使用@FindBy注释完成的

注释

在页面工厂中,注释用于为Web元素提供描述性名称,以提高代码可读性。注释@FindBy用于标识页面中的Web元素

默认情况下,PageFactory将搜索页面上具有匹配id属性的元素,如果搜索失败,则将按name属性进行搜索。但是我们需要更多的控制来识别HTML页面中的元素并将它们映射到页面对象字段

以下链接提供了更多详细信息:

是的,您可以不用Selenium的PageFactory来实现,但这意味着您需要实现自己的等效功能

PageFactory没有做任何神奇的事情来创建/填充元素。它的强大之处在于它如何做一些更高级的事情,比如缓存和只在引用元素时填充(在C#实现中,这是通过使用RealProxy完成的,不确定Java等价物)


另一种选择是通过属性存储
,并根据需要对它们进行评估。

我认为没有pagefactory就没有办法使用@FindBy
public class Test extends BaseClass {


public Test(WebDriver driver) {
    super(driver, "Login page");

}


@FindBy(name="j_password")
public WebElement password;

@FindBy(name="j_username")
public WebElement username;

public void startest() throws Exception {
username.clear();
username.sendKeys(id);
password.clear();
password.sendKeys(secret); }
}