Please check my question asked on [stackoverflow](https://stackoverflow.com/questions/57488223/selenium-webdriverwait-untilinvisiblityofallelements-returns-timeout-on-nosuch)
## 🐛 Bug Report

When using `WebdriverWait.until(invisibilityOfAllElements(ArrayOfElements))`
And the elements are being located by Pagefactory Pattern
```
@FindBy(css=".className")
WebElement element;
```
the `isInvisible` method only catches `StaleElementException`, but in case of element located by `@FindBy` locator, the element holds ProxyElement and the actual element is looked up only when the element is referenced, and the element is referenced in `isInvisible` method by checking `!element.isDisplayed()` condition, whick causes timeout exception even though element is not present.

## To Reproduce

1. Have an element located by `@FindBy` Locator
```
@FindBy(css=".className")
WebElement element;
```
2. Check `invisibilityOFElement`

```
void fun(){
WebDriver driver = new ChromeDriver();
try{
    new WebDriverWait(driver, Duration.ofSeconds(5)).until(ExpectedConditions.invisibilityOf(element));
    }
catch(TimeoutException ex){
    }
}
```


## Expected behavior

The `invisibilityOfElement` should not throw `TimeoutException` when element is not found, instead like `StaleElementException` is caught, `NoSuchElementException` should be caught and timeout should not occur

## Environment

OS: Windows 10
Browser: Chrome
Browser version: 76.0.3809.100
Browser Driver version: ChromeDriver: 76.0.3809.68
Language Bindings version: Java, Selenium Webdriver

public List<WebElement> apply(WebDriver webDriver) {
        List<WebElement> elements = webDriver.findElements(locator);
        currentNumber = elements.size();
        return currentNumber.equals(number) ? elements : null;
      }
      @Override
      public String toString() {
        return String
          .format("number of elements found by %s to be \"%s\". Current number: \"%s\"",
                  locator, number, currentNumber);
      }
    };
  }
  /**
   * An expectation for checking given WebElement has attribute with a specific value
   *
   * @param element   used to check its parameters
   * @param attribute used to define css or html attribute
   * @param value     used as expected attribute value
   * @return Boolean true when element has css or html attribute with the value
   */
  public static ExpectedCondition<Boolean> attributeToBe(final WebElement element,
                                                         final String attribute,
                                                         final String value) {
    return new ExpectedCondition<Boolean>() {
      private String currentValue = null;
      @Override
      public Boolean apply(WebDriver driver) {
        currentValue = element.getAttribute(attribute);
        if (currentValue == null || currentValue.isEmpty()) {