我已经能够成功地将@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);
}
}
//
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); }
}
答案 0 :(得分:1)
不使用PageFactory 就不能使用。请阅读以下内容以获得正确解释:
Page Factory将根据定义的“定位器”引用实际网页上的相应元素来初始化每个WebElement变量。这是通过使用@FindBy注释完成的。
注解
在Page Factory中,Annotations用于为WebElements提供描述性名称,以提高代码可读性。注释@FindBy用于标识页面中的Web元素。
默认情况下,PageFactory将在页面上搜索具有匹配id属性的元素,如果失败,则将按name属性进行搜索。但是,因为我们需要更多地控制HTML页面中的标识元素并将它们映射到我们的页面对象字段。
以下链接有更多详情: http://www.seleniumeasy.com/selenium-tutorials/page-factory-pattern-in-selenium-webdriver
答案 1 :(得分:0)
是的,你可以在没有Selenium的PageFactory的情况下做到这一点,但这意味着你需要实现自己的等价物。
PageFactory没有做任何神奇的事情来创建/填充元素。它的功能在于它如何处理一些更高级的东西,比如缓存,并且只在引用元素时填充(在C#实现中使用RealProxy完成,不确定Java等价物)。
另一种选择是存储By
属性,并根据需要对其进行评估。