![](/img/trans.png)
[英]Selenium Webdriver: Page factory initialization using paths relative to other elements?
[英]Using PageObjects, Page Factory and WebDriverWait in Selenium WebDriver using Java
我一直在使用Selenium WebDriver為我曾經使用過的一些項目實現功能測試。 我正在嘗試使用Page Factory設計模式與Page Factory來分解我的定位器。 我還創建了一個靜態WaitTool對象(singleton),它使用可選的超時參數實現了幾種等待技術。
我目前的問題是我想在PageFactory嘗試初始化WebElements之前使用我的wait方法。 我想等待的原因是因為PageFactory可能會嘗試在頁面元素可用之前初始化頁面元素。
這是一個示例PageObject:
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);
}
}
這是一個示例TestObject:
public class SignInTest extends TestBase {
@Test
public void SignInWithValidCredentialsTest() {
SignInPage signInPage = PageFactory.initElements(driver, SignInPage.class);
MainPage mainPage = signInPage.signInWithValidCredentials("sbrown", "sbrown");
assertThat(mainPage.getTitle(), is(equalTo(driver.getTitle())));
}
}
我傾向於盡可能地將我的邏輯放在頁面對象中(包括等待),因為它使測試用例更具可讀性。
PageFactroy中的WebElements實際上是WebElements的代理。 這意味着每次訪問WebElement時,它都會執行搜索以在頁面上查找元素。
這有一些優點:
您正在使用@CacheLookup注釋,它會失去第二個好處,因為它會找到該元素一次,然后保留對它的引用,您現在更有可能看到StaleElementExceptions。
話雖如此,你仍然保留了主要的好處,即Selenium不會進入頁面並實際找到元素,直到你第一次使用它。
總而言之,您需要做的就是搬家
PageFactory.initElements(driver, this);
進入你的構造函數,一切正常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.