package jp.vmi.selenium.selenese.command; import jp.vmi.selenium.selenese.Context; import jp.vmi.selenium.selenese.result.Error; import jp.vmi.selenium.selenese.result.Result; import jp.vmi.selenium.selenese.utils.Wait; import jp.vmi.selenium.selenese.utils.Wait.StopCondition; import static jp.vmi.selenium.selenese.command.ArgumentType.*; import static jp.vmi.selenium.selenese.result.Success.*; /** * An implementation of "waitForCondition". */ public class WaitForCondition extends AbstractCommand { private static final int ARG_SCRIPT = 0; private static final int ARG_TIMEOUT = 1; WaitForCondition(int index, String name, String... args) { super(index, name, args, VALUE, VALUE); } @Override public boolean mayUpdateScreen() { return false; } @Override protected Result executeImpl(final Context context, String... curArgs) { final String script = curArgs[ARG_SCRIPT]; long timeout = Long.valueOf(curArgs[ARG_TIMEOUT]); long startTime = System.currentTimeMillis(); boolean waitResult = Wait.defaultInterval.wait(startTime, timeout, new StopCondition() { @Override public boolean isSatisfied() { Object result = context.getEval().eval(context, script); if (result == null) return false; else if (result instanceof String) return !((String) result).isEmpty(); else if (result instanceof Boolean) return (Boolean) result; else return true; } }); if (waitResult) return SUCCESS; else return new Error("Timed out after " + timeout + "ms"); } }