@@ -0,0 +1,1560 @@
+package me.alb_i986.selenium.tinafw.tasks;%0A%0Aimport me.alb_i986.selenium.tinafw.ui.LoadablePage;%0Aimport me.alb_i986.selenium.tinafw.ui.WebPage;%0A%0A/**%0A * A WebTask encapsulating a manual navigation step.%0A * Manual means that the page cannot be loaded automatically by%0A * %7B@link LoadablePage#load(Class, org.openqa.selenium.WebDriver)%7D%0A * because the target URL requires some parameters (e.g. %22/item?id=999%22),%0A * which are not known at compile-time.%0A * %3Cp%3E%0A * Those parameters should be modeled as fields.%0A * Concrete subclasses only need to define %7B@link #targetUrl()%7D%0A * and %7B@link #landingPage()%7D. That's it.%0A * %3Cp%3E%0A * If needed, they can also specialize %7B@link #run(WebPage)%7D.%0A * For example, they may need to first validate the fields:%0A * %3Cpre%3E%0A * %7B@code%0A * private String articleId;%0A * %0A * public WebPage run(WebPage previousPage) %7B%0A *    if(articleId == null %7C%7C articleId.equals(%22%22))%0A *       throw new IllegalArgumentException();%0A *       return super.run(previousPage);%0A *    %7D%0A * %7D%0A * %7D%0A * %3C/pre%3E%0A * %0A */%0Apublic abstract class ManualNavigationWebTask extends BaseWebTask %7B%0A%09%0A%09/**%0A%09 * Navigate to the relative URL %7B@link #targetUrl()%7D%0A%09 * and return the page %7B@link #landingPage()%7D.%0A%09 * %0A%09 * @return %7B@link #landingPage()%7D%0A%09 */%0A%09@Override%0A%09public WebPage run(WebPage previousPage) %7B%0A%09%09browser().browseTo(targetUrl());%0A%09%09return landingPage();%0A%09%7D%0A%0A%09/**%0A%09 * @return the %3Cb%3Erelative%3C/b%3E URL to navigate to%0A%09 */%0A%09protected abstract String targetUrl();%0A%0A%09/**%0A%09 * @return the page found at %7B@link #targetUrl()%7D%0A%09 */%0A%09protected abstract WebPage landingPage();%0A%0A%7D%0A

add ManualNavigationWebTask