org.openqa.selenium.support.pagefactory.DefaultElementLocator Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of selenium-support Show documentation
Show all versions of selenium-support Show documentation
Selenium automates browsers. That's it! What you do with that power is entirely up to you.
// Licensed to the Software Freedom Conservancy (SFC) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The SFC licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package org.openqa.selenium.support.pagefactory;
import org.openqa.selenium.By;
import org.openqa.selenium.SearchContext;
import org.openqa.selenium.WebElement;
import java.lang.reflect.Field;
import java.util.List;
/**
* The default element locator, which will lazily locate an element or an element list on a page. This class is
* designed for use with the {@link org.openqa.selenium.support.PageFactory} and understands the
* annotations {@link org.openqa.selenium.support.FindBy} and {@link org.openqa.selenium.support.CacheLookup}.
*/
public class DefaultElementLocator implements ElementLocator {
private final SearchContext searchContext;
private final boolean shouldCache;
private final By by;
private WebElement cachedElement;
private List cachedElementList;
/**
* Creates a new element locator.
*
* @param searchContext The context to use when finding the element
* @param field The field on the Page Object that will hold the located value
*/
public DefaultElementLocator(SearchContext searchContext, Field field) {
this(searchContext, new Annotations(field));
}
/**
* Use this constructor in order to process custom annotations.
*
* @param searchContext The context to use when finding the element
* @param annotations AbstractAnnotations class implementation
*/
public DefaultElementLocator(SearchContext searchContext, AbstractAnnotations annotations) {
this.searchContext = searchContext;
this.shouldCache = annotations.isLookupCached();
this.by = annotations.buildBy();
}
/**
* Find the element.
*/
@Override
public WebElement findElement() {
if (cachedElement != null && shouldCache()) {
return cachedElement;
}
WebElement element = searchContext.findElement(by);
if (shouldCache()) {
cachedElement = element;
}
return element;
}
/**
* Find the element list.
*/
@Override
public List findElements() {
if (cachedElementList != null && shouldCache()) {
return cachedElementList;
}
List elements = searchContext.findElements(by);
if (shouldCache()) {
cachedElementList = elements;
}
return elements;
}
/**
* Returns whether the element should be cached.
*
* @return {@code true} if the element should be cached
*/
protected boolean shouldCache() {
return shouldCache;
}
@Override
public String toString() {
return this.getClass().getSimpleName() + " '" + by + "'";
}
}