public Object invoke(Object proxy, Method method, Object[] args) throws Throwable, TimeoutException {
		Date timeoutDate = new Date(System.currentTimeMillis() + TIMEOUT_IN_MS);
		Throwable lastThrowable = null;
		while (true) {
			try {
				WebElement webElement = locator.findElement();
				return method.invoke(webElement, args);
			} catch (InvocationTargetException ite) {
				lastThrowable = ite.getCause();
			} catch (Throwable t) {
				lastThrowable = t;
			}
			
			if (isRetryable(lastThrowable) && new Date().before(timeoutDate)) {
				sleep();
				continue;
			} else {
				throw lastThrowable;
			}
		}
	}