SpectrumLocatingElementHandler.java

package io.github.giulong.spectrum.internals.page_factory;

import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.support.pagefactory.ElementLocator;
import org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler;

import java.lang.reflect.Method;

@Slf4j
public class SpectrumLocatingElementHandler extends LocatingElementHandler {

    private final ElementLocator elementLocator;
    private final boolean secured;

    public SpectrumLocatingElementHandler(final ElementLocator elementLocator, final boolean secured) {
        super(elementLocator);
        this.elementLocator = elementLocator;
        this.secured = secured;
    }

    @Override
    public Object invoke(final Object proxy, Method method, final Object[] args) throws Throwable {
        if ("toString".equals(method.getName())) {
            return method.invoke(elementLocator, args);
        }

        if (secured && "sendKeys".equals(method.getName())) {
            log.trace("Intercepting sendKeys on a @Secured WebElement");
            final CharSequence firstCharSequence = ((CharSequence[]) args[0])[0];
            ((CharSequence[]) args[0])[0] = String.format("@Secured@%s@Secured@", firstCharSequence);
        }

        return super.invoke(proxy, method, args);
    }
}