显式等待使用页面工厂元素等待很长时间来响应它

时间:2018-05-26 04:33:44

标签: selenium selenium-webdriver

我使用页面工厂类创建了一个元素。

@Findby(how=How.ID,using="userName")
private WebElement userName;

//Adding explicit wait here

WebDriverWait wait = new WebDriverWait(driver,30);
wait.until(ExpectedConditions.visibilityOf(userName)); // It is taking long time to wait even though the web element presents in the DOM

如果我使用,则在下面的语句中,当webelement出现在DOM中时,Web驱动程序会立即响应。

wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.id("userName")));

其他显式等待方法也存在同样的问题。

这是我的观察。任何想法解决这个问题都会对我有所帮助 谢谢!

3 个答案:

答案 0 :(得分:0)

对于您尝试定位元素的阶段(在DOM加载之前或之后)感到困惑。 ExpectedConditions.visibilityOf(element)只应在我们使用该元素存在于DOM中时使用,并等待它的可见性。

您需要使用ExpectedConditions.visibilityOfElementLocated - 它确保:

  • 元素存在于DOM

  • 元素可见

当您使用ExpectedConditions.visibilityOf时,它不会检查DOM中是否存在该元素。

我有一个问题,您是否初始化了POM?如果不是,您需要将其初始化为:

// To initialize elements. 
MyPage myPage = PageFactory.initElements(driver, MyPage.class);

构造函数中的OR:

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

答案 1 :(得分:0)

您提供的此解释不明确,但我会尝试解释

// in top of class, enter code with annotations for init. webElementa
@FindBy(xpath = "//button[@id='...']")
private WebElement buttonBack;() 

... n elements ... 

// in constructor initElements() takes all elements and tries to find it and assign to variables above

public Page(WebDriver driver) {
    super(driver);
    PageFactory.initElements(driver, this);
    waitForScriptsToLoad(driver); // this will wait 30s to get 

}

并尝试等待您的页面加载此方法(下图):

public static void waitForScriptsToLoad(WebDriver driver) {
    new org.openqa.selenium.support.ui.WebDriverWait(driver, 30).until((ExpectedCondition<Boolean>) wd ->
            ((JavascriptExecutor) wd).executeScript("return document.readyState").equals("complete"));
}

此方法等待unitl完成DOM准备好继续工作。如果您愿意,请点击以下链接:https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState

显式等待如果你确定总是需要等待,你可以在方法或构造函数中放置位置。

有关等待类型的更多信息:1。Types of Explicit Wait in Selenium webdriver (Java)?  2. Replace implicit wait with explicit wait (selenium webdriver & java)

答案 2 :(得分:0)

解决延迟的解决方案是按预期使用 PageFactory ,并为类构建 em>,你想初始化显式等待以及如下:

public class My_Page_Class {

    WebDriver driver;
    WebDriverWait wait; 

    //class constructor
    public Your_Page_Class(WebDriver driver)
    {
        this.driver = driver; 
        wait = new WebDriverWait(driver,10);
    }

    @Findby(how=How.ID,using="userName")
    private WebElement userName;

    // page class functions
    public void foo()
    {
        wait.until(ExpectedConditions.visibilityOf(userName));
        //other code works
    } 
}

现在,您可以从@Test带注释的类中按如下方式初始化类:

@Test (priority=0)
public void checkValidUser()
{
    //Created Page Object using Page Factory
    My_Page_Class my_page_class = PageFactory.initElements(driver, My_Page_Class.class);

    //Call the method
    my_page_class.foo();

}

您可以在Using PageObjects, Page Factory and WebDriverWait in Selenium WebDriver using Java

中找到相关的讨论