使用Java在Selenium WebDriver中使用PageObjects、Page Factory和WebDriverWait
我一直在使用SeleniumWebDriver为我所处理的一些项目实现功能测试。我正在尝试使用页面对象设计模式和页面工厂来区分我的定位器。我还创建了一个静态WaitTool对象(singleton),它使用可选的超时参数实现了几种等待技术 我当前的问题是,我想在PageFactory尝试初始化WebElements之前使用wait方法。我想等待的原因是,PageFactory可能会在页面上提供页面元素之前尝试初始化这些元素 以下是PageObject示例:使用Java在Selenium WebDriver中使用PageObjects、Page Factory和WebDriverWait,java,selenium-webdriver,pageobjects,Java,Selenium Webdriver,Pageobjects,我一直在使用SeleniumWebDriver为我所处理的一些项目实现功能测试。我正在尝试使用页面对象设计模式和页面工厂来区分我的定位器。我还创建了一个静态WaitTool对象(singleton),它使用可选的超时参数实现了几种等待技术 我当前的问题是,我想在PageFactory尝试初始化WebElements之前使用wait方法。我想等待的原因是,PageFactory可能会在页面上提供页面元素之前尝试初始化这些元素 以下是PageObject示例: public class SignIn
public class SignInPage extends PageBase {
@FindBy(id = "username")
@CacheLookup
private WebElement usernameField;
@FindBy(id = "password")
@CacheLookup
private WebElement passwordField;
@FindBy(name = "submit")
@CacheLookup
private WebElement signInButton;
public SignInPage(WebDriver driver) {
super(driver);
WaitTool.waitForPageToLoad(driver, this);
// I'd like initialisation to occur here
}
public MainPage signInWithValidCredentials(String username, String password){
return signIn(username, password, MainPage.class);
}
private <T>T signIn(String username, String password, Class<T> expectedPage) {
usernameField.type(username);
passwordField.type(password);
signInButton.click();
return PageFactory.initElements(driver, expectedPage);
}
}
我倾向于尽可能多地将我的逻辑放在页面对象中(包括等待),因为它使测试用例更具可读性。PageFactroy中的WebElements实际上是WebElements的代理。这意味着每次访问WebElement时,它都会执行搜索以在页面上查找该元素 这有一些好处:
- 初始化PageFactory时,会配置代理,但此时找不到WebElements(因此不会出现NoTouchElementException)
- 每次您使用WebElement时,它都会再次找到它,所以您不应该使用StaleElementException
PageFactory.initElements(driver, this);
我想这意味着我不能在signIn函数中返回
PageFactory.initElements(driver,expectedPage)
。PageFactory.initElements(driver,this.class)代码>似乎不起作用。但是,提供this
或this.getClass()
是可行的,但我不确定这是否符合我的要求。很抱歉,这是我回答中的一个错误。事实上,我的意思是(答案更新为显示正确的代码段),如果我理解正确,您只是担心当您实例化类时,它将开始抛出NosUchelementException错误,因为页面可能没有加载PageFactory引用的所有WebElement。如果这是你的担忧,那就不会发生。执行“PageFactory.initElements(驱动程序,this);”时此时它将配置所有代理,但在您实际使用其中一个WebElements之前,它不会尝试在页面上查找该元素。@Ardesco:在我阅读了这篇文章和您的评论之后,我有一个问题。在这种情况下,代理是什么意思?
PageFactory.initElements(driver, this);