在没有PageFactory的Selenium中使用@FindBy

时间:2017-06-19 14:25:38

标签: java selenium

我已经能够成功地将@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); }
}

2 个答案:

答案 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属性,并根据需要对其进行评估。