package jp.vmi.selenium.selenese.javascript;
import java.util.Map;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import jp.vmi.selenium.selenese.ModifierKeyState;
import jp.vmi.selenium.selenese.SeleneseRunnerRuntimeException;
/**
* Override dialog interfaces.
*/
public class JSLibrary {
/**
* Key event type.
*/
@SuppressWarnings("javadoc")
public enum KeyEventType {
KEYDOWN, KEYPRESS, KEYUP;
@Override
public String toString() {
return name().toLowerCase();
}
}
private final JSFunction replaceAlertMethod;
private final JSFunction getNextAlert;
private final JSFunction isAlertPresent;
private final JSFunction setNextConfirmationState;
private final JSFunction getNextConfirmation;
private final JSFunction isConfirmationPresent;
private final JSFunction answerOnNextPrompt;
private final JSFunction getNextPrompt;
private final JSFunction isPromptPresent;
private final JSFunction triggerKeyEvent;
private final JSFunction setCursorPosition;
private final JSFunction getCursorPosition;
private final JSFunction getElementIndex;
private final JSFunction isOrdered;
private final JSFunction getTable;
private final JSFunction getText;
private final JSFunction fireEvent;
/**
* Constructor.
*/
public JSLibrary() {
Map<String, JSFunction> jsMap = JSFunction.load(JSLibrary.class.getResourceAsStream("JSLibrary.js"));
replaceAlertMethod = jsMap.get("replaceAlertMethod");
getNextAlert = jsMap.get("getNextAlert");
isAlertPresent = jsMap.get("isAlertPresent");
setNextConfirmationState = jsMap.get("setNextConfirmationState");
getNextConfirmation = jsMap.get("getNextConfirmation");
isConfirmationPresent = jsMap.get("isConfirmationPresent");
answerOnNextPrompt = jsMap.get("answerOnNextPrompt");
getNextPrompt = jsMap.get("getNextPrompt");
isPromptPresent = jsMap.get("isPromptPresent");
triggerKeyEvent = jsMap.get("triggerKeyEvent");
setCursorPosition = jsMap.get("setCursorPosition");
getCursorPosition = jsMap.get("getCursorPosition");
getElementIndex = jsMap.get("getElementIndex");
isOrdered = jsMap.get("isOrdered");
getTable = jsMap.get("getTable");
getText = jsMap.get("getText");
// fireEvent.js is copied from selenium.
fireEvent = JSFunction.loadFunction(JSLibrary.class.getResourceAsStream("fireEvent.js"));
}
/**
* Replace alert/confirm/prompt methods.
*
* @param driver WebDriver object.
* @param element target element for detecting frame/iframe.
*/
public void replaceAlertMethod(WebDriver driver, WebElement element) {
replaceAlertMethod.call(driver, element);
}
/**
* Get next alert dialog message.
*
* @param driver WebDriver object.
* @return alert dialog message.
*/
public String getNextAlert(WebDriver driver) {
String result = getNextAlert.call(driver);
if (result == null)
throw new SeleneseRunnerRuntimeException("There were no alerts");
return result;
}
/**
* Test of whether a alert dialog was displayed.
*
* @param driver WebDriver object.
* @return alert dialog is dislayed if true.
*/
public boolean isAlertPresent(WebDriver driver) {
return Boolean.TRUE.equals(isAlertPresent.call(driver));
}
/**
* Choose button on next confirm dialog.
*
* @param driver WebDriver object.
* @param state "OK" if true, otherwise "Cancel".
*/
public void setNextConfirmationState(WebDriver driver, boolean state) {
setNextConfirmationState.call(driver, state);
}
/**
* Get next confirmation dialog message.
*
* @param driver WebDriver object.
* @return confirmation dialog message.
*/
public String getNextConfirmation(WebDriver driver) {
String result = getNextConfirmation.call(driver);
if (result == null)
throw new SeleneseRunnerRuntimeException("There were no confirmations");
return result;
}
/**
* Test of whether a confirmation dialog was displayed.
*
* @param driver WebDriver object.
* @return confirmation dialog is dislayed if true.
*/
public boolean isConfirmationPresent(WebDriver driver) {
return Boolean.TRUE.equals(isConfirmationPresent.call(driver));
}
/**
* Set answer message for prompt.
*
* @param driver WebDriver object.
* @param msg answer message used on next prompt.
*/
public void answerOnNextPrompt(WebDriver driver, String msg) {
answerOnNextPrompt.call(driver, msg);
}
/**
* Get next prompt.
*
* @param driver WebDriver object.
* @return prompt.
*/
public String getNextPrompt(WebDriver driver) {
String result = getNextPrompt.call(driver);
if (result == null)
throw new SeleneseRunnerRuntimeException("There were no prompts");
return result;
}
/**
* Test of whether a prompt was displayed.
*
* @param driver WebDriver object.
* @return prompt is dislayed if true.
*/
public boolean isPromptPresent(WebDriver driver) {
return Boolean.TRUE.equals(isPromptPresent.call(driver));
}
/**
* Trigger key event.
*
* @param driver WebDriver object.
* @param element target element.
* @param eventType event type.
* @param keySequence key sequence.
* @param keyState modifier key state.
*/
public void triggerKeyEvent(WebDriver driver, WebElement element, KeyEventType eventType, String keySequence, ModifierKeyState keyState) {
int keyCode;
if (keySequence.codePointCount(0, keySequence.length()) == 1) {
keyCode = keySequence.codePointAt(0);
} else {
try {
if (keySequence.startsWith("\\"))
keyCode = Integer.parseInt(keySequence.substring(1));
else
keyCode = Integer.parseInt(keySequence);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("invalid keySequence");
}
}
triggerKeyEvent.call(driver, element, eventType.toString(), keyCode,
keyState.isControlKeyDown(), keyState.isAltKeyDown(), keyState.isShiftKeyDown(), keyState.isMetaKeyDown());
}
/**
* Set cursor poision in text field.
*
* @param driver WebDriver object.
* @param element target element.
* @param position cusror position.
*
*/
public void setCursorPosition(WebDriver driver, WebElement element, int position) {
setCursorPosition.call(driver, element, position);
}
/**
* Get cursor poision in text field.
*
* @param driver WebDriver object.
* @param element target element.
* @return cusror position.
*
*/
public long getCursorPosition(WebDriver driver, WebElement element) {
return getCursorPosition.call(driver, element);
}
/**
* Get element index.
*
* @param driver WebDriver object.
* @param element target element.
* @return element index.
*/
public long getElementIndex(WebDriver driver, WebElement element) {
return getElementIndex.call(driver, element);
}
/**
* Is ordered.
*
* @param driver WebDriver object.
* @param element1 target element 1.
* @param element2 target element 2.
* @return true if two elements are ordered.
*/
public boolean isOrdered(WebDriver driver, WebElement element1, WebElement element2) {
return Boolean.TRUE.equals(isOrdered.call(driver, element1, element2));
}
/**
* Get cell value of table.
*
* @param driver WebDriver object.
* @param table table element.
* @param row row number. (row start at 0)
* @param col column number. (column start at 0)
* @return cell element or error message string.
*/
public Object getTable(WebDriver driver, WebElement table, long row, long col) {
return getTable.call(driver, table, row, col);
}
/**
* Get text.
*
* @param driver WebDriver object.
* @param element element.
* @return text content.
*/
public String getText(WebDriver driver, WebElement element) {
return getText.call(driver, element);
}
/**
* Fire event.
*
* @param driver WebDriver object.
* @param element target element.
* @param eventName event name.
*
*/
public void fireEvent(WebDriver driver, WebElement element, String eventName) {
fireEvent.call(driver, element, eventName);
}
}