如何使用Selenium和Java通过PageFactory等待元素的隐身

时间:2019-02-13 11:45:38

标签: java selenium pageobjects webdriverwait page-factory

是否可以使用PageFactory批注来等待Selenium中不存在的元素?

使用时:

@FindBy(css= '#loading-content')
WebElement pleaseWait;

找到元素,然后:

wait.until(ExpectedConditions.invisibilityOfElementLocated(pleaseWait));

我会得到:

org.opeqa.selenium.WebElement cannot be converted to org.openqa.selenium.By

我可以使用以下方法来做我需要做的事情:

wait.until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector('loading-content')));

但是,我希望能够使用PageFactory批注以保持框架的一致性。有办法吗?

3 个答案:

答案 0 :(得分:1)

invisibilityOfElementLocated需要一个定位器,但是您正在发送网络元素,这就是为什么它会引发错误。您可以通过使用以下方法检查Web元素列表来执行操作:

wait.until(ExpectedConditions.invisibilityOfAllElements(Arrays.asList(pleaseWait)));

更新后的答案:
如果要检查页面上是否不存在该元素,则可以检查其列表大小是否等于0,因为当未在UI上显示时,其列表大小将为0。

您可以使用以下方法获取元素的列表:

@FindBy(css='#loading-content')
List<WebElement> pleaseWait;

您可以使用以下方法检查列表大小是否等于0:

if(pleaseWait.size()==0){
     System.out.println("Element is not visible on the page");
     // Add the further code here
}

这也不会给NoSuchElement异常。

答案 1 :(得分:1)

您还可以使用正确的预期条件,

wait.until(ExpectedConditions.invisibilityOf(pleaseWait));

Reference

希望对您有帮助!

答案 2 :(得分:1)

PageObjectModel 中使用 PageFactory 时,如果您希望元素不可见,则可以使用显式等待支持常规定位器工厂,并使用以下任一解决方案:


invisibilityOfElementLocated()

invisibilityOfElementLocated()是一种期望的实现,用于检查元素在DOM上是否不可见或不存在。定义如下:

public static ExpectedCondition<java.lang.Boolean> invisibilityOfElementLocated(By locator)
An expectation for checking that an element is either invisible or not present on the DOM.

Parameters:
    locator - used to find the element

Returns:
    true if the element is not displayed or the element doesn't exist or stale element
  • 代码块:

    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 fooPage {
    
        WebDriver driver;
        public fooPage(WebDriver driver)
        {
            PageFactory.initElements(driver, this);
        }
    
        //you don't need this
        //@FindBy(css= '#loading-content')
        //WebElement pleaseWait;
    
        public void foo()
        {
            Boolean bool = new WebDriverWait(driver, 20).until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector('#loading-content')));
            //other lines of code
        }
    }
    

您也可以使用invisibilityOf()方法,如下所示:

invisibilityOf()

invisibilityOf()是用于期望检查元素不可见的实现。定义如下:

public static ExpectedCondition<java.lang.Boolean> invisibilityOf(WebElement element)
An expectation for checking the element to be invisible

Parameters:
    element - used to check its invisibility

Returns:
    Boolean true when elements is not visible anymore
  • 代码块:

    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 fooPage {
    
        WebDriver driver;
        public fooPage(WebDriver driver)
        {
            PageFactory.initElements(driver, this);
        }
    
    
        @FindBy(css= '#loading-content')
        WebElement pleaseWait;
    
        public void foo()
        {
            Boolean bool = new WebDriverWait(driver, 20).until(ExpectedConditions.invisibilityOf(fooPage.getWebElement()));
            //other lines of code
        }
    
        public WebElement getWebElement()
        {
            return pleaseWait;
        }
    }
    

您可以在How to use explicit waits with PageFactory fields and the PageObject pattern

中找到详细的讨论