我使用页面工厂类创建了一个元素。
@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")));
其他显式等待方法也存在同样的问题。
这是我的观察。任何想法解决这个问题都会对我有所帮助 谢谢!
答案 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
中找到相关的讨论