2016-11-17 2 views
0

Fondamentalement, je voudrais faire une assertion (à partir de ma classe de test) qu'un WebElement contient du texte(). Puisque tous mes WebElements sont définis dans mon page.class, je pense que je dois les rendre publics pour le faire.Utilisation de WebElements à partir des POM PageFactory dans ma classe de test

Je rencontre quelques problèmes avec le pilote web et les éléments, et je pense que c'est peut-être parce que plusieurs classes de test accèdent à WebElements à partir de la classe page simultanément. Ma question est: Y a-t-il une raison pour que WebElements soit privé?

Exemple de code:

Tous les tutoriels PageFactory j'ai vu dire de faire vos WebElements privé, comme

@FindBy(xpath = "//*[@id='searchStringMain']") 
    private WebElement searchField; 

Mais pour affirmer qu'un élément contient du texte (d'une autre classe), je dois définir les comme ceci:

@FindBy(xpath = "(//*[contains (text(),'Hrs')])[2]") 
    public static WebElement yourLoggedTime; 
+0

Le but de PageObjects est d'encapsuler des détails sur les éléments de page. Si vous les avez rendus publics alors quand (pas si) l'un d'entre eux a changé, vous devrez traquer tous les endroits que vous avez référencés et dupliquer le changement. En encapsulant des éléments Web dans un objet de page, vous le modifiez une fois. Vos tests doivent se soucier du comportement (par exemple searchFor) et non des détails sur les éléments manipulés. Les détails de l'élément se trouvent uniquement dans PageObjects. – MikeJRamsey56

Répondre

1

Considérons cet exemple:

package org.openqa.selenium.example; 

import org.openqa.selenium.By; 
import org.openqa.selenium.support.FindBy; 
import org.openqa.selenium.support.How; 
import org.openqa.selenium.WebElement; 

public class GoogleSearchPage { 
    // The element is now looked up using the name attribute 
    @FindBy(how = How.NAME, using = "q") 
    private WebElement searchBox; 


    public void searchFor(String text) { 
     // We continue using the element just as before 
     searchBox.sendKeys(text); 
     searchBox.submit(); 
    } 
} 

La boîte de recherche est privée mais la méthode searchFor est publique. Le test utiliserait searchFor mais jamais searchBox.

Je place généralement l'appel initElements de la fabrique de pages dans la dernière ligne du constructeur de la page. Cela rend toutes les fonctions publiques disponibles pour les tests. Alors

package org.openqa.selenium.example; 

import org.openqa.selenium.By; 
import org.openqa.selenium.support.FindBy; 
import org.openqa.selenium.support.How; 
import org.openqa.selenium.WebElement; 

public class GoogleSearchPage { 
    public WebDriver driver; 
    // The element is now looked up using the name attribute 
    @FindBy(how = How.NAME, using = "q") 
    private WebElement searchBox; 

    public GoogleSearchPage(WebDriver driver) { 
     this.driver = driver 
     PageFactory.initElements(driver, this); 
    } 


    public void searchFor(String text) { 
     // We continue using the element just as before 
     searchBox.sendKeys(text); 
     searchBox.submit(); 
    } 
} 

Dans votre test, vous pouvez faire quelque chose comme:

new GoogleSearchPage(webDriver).searchFor("Foo"); 
0

Vous pouvez garder votre classe déposée public, mais comme une pratique standard, il est conseillé d'avoir getter pour la classe déposée plutôt que directe déposée accès.
Le problème est static mot-clé que vous utilisez avec public. Lorsque vous utilisez l'annotation @FindBy avec filed (webelement), elle s'initialise au moment de l'initialisation de la classe (ou en fonction de votre implémentation où initElements() appelé). Il est donc bon d'avoir webelementpublic mais pas static. Par exemple:

Dans votre classe de page:

@FindBy(xpath = "(//*[contains (text(),'Hrs')])[2]") 
public WebElement yourLoggedTime; 

Dans l'essai:

String yourLoggedTime = pageObj.yourLoggedTime.getText(); //pageObj is object of your page class 
+0

Rompre l'encapsulation en exposant des WebElements qui pourraient avoir de l'importance si yourLoggedTime est utilisé dans de nombreux tests. Je préférerais avoir une méthode d'objet page qui décrit un comportement et renvoie une chaîne mais je suppose que c'est une question de goût. – MikeJRamsey56