5 votes

Comment attendre explicitement en utilisant la fabrique de pages dans Selenium ?

Je vais organiser une attente explicite dans Selenium comme ceci :

WebDriverWait = new WebDriverWait(driver,30);

WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(locator));

Le problème est que je n'ai pas le pilote dans ma classe, car j'ai utilisé la PageFactory, et non un constructeur dans une classe de test :

MyClass myform = PageFactory.InitElements(driver, MyClass.class)

Quelle est la bonne décision à prendre pour organiser une attente explicite dans ce cas ?

11voto

Ben Points 154

Je vous suggère d'utiliser la PageFactory comme prévu et d'avoir un constructeur pour votre classe où vous souhaitez utiliser l'attente explicite. Avoir une séparation entre le script et les objets de la page rend le travail beaucoup plus facile à l'avenir.

public class MyClass {

    WebDriverWait wait; 
    WebDriver driver; 
    @FindBy(how=How.ID, id="locatorId")
    WebElement locator; 

    // Construct your class here 
    public MyClass(WebDriver driver){
        this.driver = driver; 
        wait = new WebDriverWait(driver,30);
    }

    // Call whatever function you want to create 
    public void MyFunction(){
        wait.until(ExpectedConditions.presenceOfElementLocated(locator));
        // Perform desired actions that you wanted to do in myClass
    } 

Ensuite, dans votre scénario de test, utilisez du code pour effectuer votre test. Dans votre exemple, le test est contenu dans la page.

public class MyTestClass {
    public static void main (string ... args){
        WebDriver driver = new FireFoxDriver(); 
        MyClass myForm = PageFactory.initElements(driver,Myclass.class); 
        myForm.MyFunction(); 
    }
}

Cet exemple a été modelé d'après l'exemple du livre Selenium WebDriver Practical Guide qui peut être trouvé ici. ici

2voto

Enigma Points 128

Je pense qu'une meilleure solution serait de passer un pilote dans la classe de la page à partir de sa classe de test appelante. Veuillez vous référer à l'implémentation ci-dessous pour plus de clarté.

Classe de page :

public class YourTestPage {
    private WebDriver driver;
    private WebDriverWait wait;

    @FindBy(xpath = "//textarea")
    private WebElement authorField;

    public YourTestPage(WebDriver driver) {
        this.driver = driver;
        wait = new WebDriverWait(driver, 15, 50);
        PageFactory.initElements(driver,this);
    }

    public String getAuthorName() {
        wait.until(ExpectedConditions.visibilityOf(authorField)).getText();
    }
}

Classe d'essai :

public class YourTest{

    private YourTestPage yourTestPage;
    private WebDriver driver;

    @BeforeTest
    public void setup() throws IOException {
      driver = WebDriverFactory.getDriver("chrome");
      yourTestPage = new YourTestPage(driver);
    }

    @Test
    private void validateAuthorName() {     
      Assert.assertEquals(yourTestPage.getAuthorName(),"Author Name");
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X