显式等待与页面工厂元素一起使用,等待很长时间才能响应它



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

@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")));

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

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

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

您需要使用 ExpectConditions.visibilityOfElementTLocation - 它确保:

  • 元素存在于 DOM 中

  • 元素可见

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

我有一个问题,你初始化了你的POM吗?如果没有,您需要将其初始化为波纹管:

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

OR 在构造函数中:

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

你提供的这个解释不清楚,但我会试着解释

// 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"));
}

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

显式等待 你把放在方法里面的位置,或者放在构造函数中,如果你确定等待总是需要的。

有关等待类型的更多信息: 1. Selenium Webdriver (Java( 中的显式等待类型? 2. 用显式等待替换隐式等待(Selenium webdriver & java(

消除延迟的解决方案是按预期使用PageFactory并为您的提供构造函数,您希望在其中初始化显式等待

,如下所示:
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();
}

您将在使用 Java 的 Selenium WebDriver 中找到相关讨论 使用页面对象、页面工厂和 WebDriverWait

最新更新