package com.github.andreptb.fitnesse.selenium; import java.util.function.BiConsumer; import org.apache.commons.lang3.EnumUtils; import org.apache.commons.lang3.math.NumberUtils; import org.apache.commons.lang3.tuple.Pair; import org.openqa.selenium.WebDriver; import org.openqa.selenium.support.ui.Select; import com.github.andreptb.fitnesse.util.FitnesseMarkup; /** * Utility class designed to wrap infrastructure code necessary to operate with selenium frame API. */ public class FrameWebElementHelper { /** * Utility to process FitNesse markup so can be used by Selenium WebDriver */ private FitnesseMarkup fitnesseMarkup = new FitnesseMarkup(); /** * Enum mapping possible frame relative positions */ private enum FrameRelativeSelectorType { top, parent; } /** * Enum mapping frame selectors */ private enum FrameSelectorType { /** * Relative selector, will look for siblings or parent frame */ relative((driver, value) -> { FrameRelativeSelectorType relativeSelector = FrameRelativeSelectorType.valueOf(value); if (relativeSelector == FrameRelativeSelectorType.top) { driver.switchTo().defaultContent(); } else if (relativeSelector == FrameRelativeSelectorType.parent) { driver.switchTo().parentFrame(); } }), /** * Index selector, will look for the index of the desired frame */ index((driver, value) -> driver.switchTo().frame(NumberUtils.toInt(value))); /** * Function that selects a value in a {@link Select} element */ private BiConsumer<WebDriver, String> selector; private FrameSelectorType(BiConsumer<WebDriver, String> selector) { this.selector = selector; } } public boolean select(WebDriverHelper driverHelper, String locator) { return driverHelper.doWhenAvailable(locator, (driver, parsedLocator) -> { Pair<String, String> keyValue = this.fitnesseMarkup.cleanAndParseKeyValue(parsedLocator.getOriginalSelector(), FitnesseMarkup.KEY_VALUE_SEPARATOR); FrameSelectorType frameSelector = EnumUtils.getEnum(FrameSelectorType.class, keyValue.getKey()); if (frameSelector == null) { driver.switchTo().frame(driver.findElement(parsedLocator.getBy())); return; } frameSelector.selector.accept(driver, keyValue.getValue()); }); } }