www ultimate pom pattern patron page initelements guru99 guide example espaƱol java selenium-webdriver pageobjects

ultimate - Usar PageObjects, Page Factory y WebDriverWait en Selenium WebDriver usando Java



pom pattern selenium (1)

He estado usando Selenium WebDriver para implementar pruebas funcionales para algunos proyectos con los que he trabajado. Intento usar el patrón de diseño del objeto de página con Page Factory para factorizar mis localizadores. También creé un objeto WaitTool estático (singleton) que implementa varias técnicas de espera con parámetros de tiempo de espera opcionales.

Mi problema actual es que me gustaría utilizar mis métodos de espera antes de que PageFactory intente inicializar WebElements. La razón por la que me gustaría esperar es porque PageFactory puede intentar inicializar los elementos de la página antes de que estén disponibles en la página.

Aquí hay un ejemplo de 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); } }

Aquí hay un ejemplo 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()))); } }

Tiendo a poner mi lógica en el Objeto de página tanto como sea posible (incluidas las esperas), ya que hace que los casos de prueba sean mucho más legibles.


Los WebElements en un PageFactroy son realmente aproximaciones a WebElements. Esto significa que cada vez que accede a WebElement realizará una búsqueda para encontrar el elemento en la página.

Esto tiene algunas ventajas:

  • Cuando se inicializa PageFactory, los proxies se configuran, pero los WebElements no se encuentran en ese punto (por lo que no obtendrá una NoSuchElementException)
  • Cada vez que utilice un WebElement irá y lo encontrará de nuevo, por lo que no debería ver StaleElementException

Está utilizando la anotación @CacheLookup que le está perdiendo el segundo beneficio, ya que encontrará el elemento una vez y luego mantendrá una referencia a él, ahora es mucho más probable que vea StaleElementExceptions.

Dicho esto, usted todavía conserva el beneficio principal, que es que el Selenio no irá a la página y realmente encontrará el elemento hasta que lo use por primera vez.

Entonces, en resumen, todo lo que tienes que hacer es moverte

PageFactory.initElements(driver, this);

En tu constructor y todo funcionará bien.