How to add explicit wait in PageFactory in PageObjectModel?

橙三吉。 提交于 2019-12-17 07:54:21

问题


I have added hardcode wait thread.sleep() in my below code. How to use explicit wait. I want to wait till "username" WebElement appear. My program is working perfectly. I have already written testcases.

package com.pol.zoho.PageObjects;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.ui.WebDriverWait;

public class ZohoLoginPage {

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

@FindBy(xpath=".//*[@id='lid']")
public WebElement email;

@FindBy(xpath=".//*[@id='pwd']")
public WebElement password;

@FindBy(xpath="//*[@id='signin_submit']")
public WebElement signin;

public void doLogin(String username,String userpassword)
{
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    email.sendKeys(username);
    password.sendKeys(userpassword);
    signin.click();
}

}


回答1:


When using PageFactory in PageObjectModel if you expect the element to be loaded through some JavaScript and it might not be present on the page already you can use the Explicit Wait support with a normal locator factory as follows:

  • Code Block:

    package com.pol.zoho.PageObjects;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.support.FindBy;
    import org.openqa.selenium.support.PageFactory;
    import org.openqa.selenium.support.ui.ExpectedConditions;
    import org.openqa.selenium.support.ui.WebDriverWait;
    
    public class ZohoLoginPage {
    
        WebDriver driver;
        public ZohoLoginPage(WebDriver driver)
        {
            PageFactory.initElements(driver, this);
        }
    
        @FindBy(xpath=".//*[@id='lid']")
        public WebElement email;
    
        @FindBy(xpath=".//*[@id='pwd']")
        public WebElement password;
    
        @FindBy(xpath="//*[@id='signin_submit']")
        public WebElement signin;
    
        public void doLogin(String username,String userpassword)
        {
            WebElement element = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(ZohoLoginPage.getWebElement()));
            email.sendKeys(username);
            password.sendKeys(userpassword);
            signin.click();
        }
    
        public WebElement getWebElement()
        {
            return email;
        }
    
    }
    

You can find a detailed discussion in How to use explicit waits with PageFactory fields and the PageObject pattern




回答2:


You have two options:

1- You can use implicity wait while initializing the driver.

driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);

2- Use explicty wait for the username field only:

WebDriverWait wait = new WebDriverWait(driver,30);
WebElement element = wait.until(
                    ExpectedConditions.visibilityOf(By.id(identifier)));


来源:https://stackoverflow.com/questions/54158166/how-to-add-explicit-wait-in-pagefactory-in-pageobjectmodel

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!