Cómo manejar la navegación de páginas utilizando la página Object Model

RL:

Estoy tratando de utilizar el modelo de objetos de página para mis pruebas y estoy tratando de estructurar mis clases de página para poder hacer un "constructor de patrón-como" estructura (no he visto muy a menudo, así que no hago saber si tiene un nombre o si es incluso una cosa) como en este ejemplo:

public class Page1 implements Page  {
   public static Page1 goOn(){
       return new Page1();
   }

   public Page1 action1() {
       return this;
   }

   public Page2 gotoPage2() {
       return new Page2();
   }
}

public class Page2 implements Page  {
    public Page2 action2() {
        return this;
    }

    public Page2 gotoPage1() {
        return new Page2();
    }
 }

Y luego usarlo como:

Page1.goOn()
     .action1()
     .gotoPage2() //it return a Page2 object which mean you cant use Page1 methods anymore
     .action2()   // avoiding using the Page1 object which wouldnt be usable anymore if we stored it
     .goToPage1() //and poof we can only use Page1 methods again
     .action1()
     //etc...

Así es cómo me las arreglaría "lineal" cambio de página, que permite algunas buenas cosas con auto-completado y te obliga a hacer solamente acciones válidas antes de tiempo de compilación (que creo que es genial, ya que odio los errores de ejecución> :()

Entonces estoy tratando de manejar una página de login (su mayor parte un simple ejemplo de lo que voy a tener que hacer a continuación), hay 2 salidas diferentes posibles dependiendo de si el inicio de sesión falla o no. En este caso específico que podría haber hecho 2 funciones: public Page1 logIn(){...}y public Page2 "logInButFail(){...}, pero por varias razones me gustaría hacer algo como:

public Page logIn(User user) {
    //do the login in the page
    //IF login worked:
    //return new Page2();
    //ELSE
    //return this; // or new Page1(), 
}

El problema es, para seguir adelante con los métodos que encadenar cosita que tenía antes de que tenga que hacer moldes inseguras, que ... puedo manejarlos bastante bien y con seguridad pero significa regla sagrada de java de ruptura sobre la escritura ... Y así, El cerebro de mi abanico de tipos estáticos lil' ha estado luchando para decidir qué hacer.

Entonces:

  • ¿Hay una manera de hacerlo sin hacer moldes inseguras?
  • Si no es así, habría de hacerlo:
  • Hacer un código eficiente utilizando moldes inseguros (que en realidad son bien porque si esos moldes fallan Eso significa que la prueba ha fallado antes)?
  • Hacer menos eficiente código java, pero mantener feliz? :)

Gracias por cualquier ayuda sobre el tema, si necesita más explicación me pregunta voy a hacer mi mejor esfuerzo para explicar con más precisión (también si se sabe cómo esta práctica se llama Me interesa) :)

EDIT: después de usar la dinámica logIn()utilizo la siguiente función de hacer valer el tipo de la página (aquí es donde tengo que hacer el reparto insegura Trato de evitar):

public <T extends Page> T assertPage(Class<T> type){
  boolean isgood = (this.getClass.equals(type));
  assertTrue(isgood);
  if(isgood){
    return (T)this; //this is the unsafe cast im trying to avoid
  }else{
    //throw an exception as this is not supposed to happen
  }
}
Gennady Zyablitsev:

Por lo tanto, desea método de página a objetos, cosa que va a volver conditionaly instancia de la Página 1 Página 2 o. Para ello, ha creado el método del tipo de página. Y desea ejecutar este método y continuará trabajando con instancia de la Página 1 Página 2 o depende de la condición sin el molde. ¿Derecho? Puede hacerlo a través de los genéricos. Aquí es ejemplo simplificado:

class Page{
    <T extends Page> T conditionalAction( T pageObject ){
        return pageObject;
    }
}
class Page1 extends Page{
    Page1 action1(){ return this; }
}
class Page2 extends Page{
    Page2 action2(){ return this; }
}

Ahora, usted puede hacer algo como:

Page1 page1 = new Page1();
Page2 page2 = new Page2();
page1.action1()
     .conditionalAction( page1 )
     .action1()
     .conditionalAction( page2 )
     .action2();

Usted es libre de utilizar tal método de cualquier tipo de retorno genéricos en su padre / clase clild.

Y si quieres sólo para afirmar la clase que se obtiene de un método, que puede hacer el registro de entrada:

public Page conditionalAction( boolean condition ) {
    if ( condition ) {
        return new Page1();
    } else {
        return new Page2();
    }
}

// en la prueba

Page result = new Page1().conditionalAction( true );
if ( result instanceof Page1 ){
    Page1 page1 = (Page1) result;
} else if ( result instanceof Page2 ){
    Page2 page2 = (Page2) result;
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=361823&siteId=1
Recomendado
Clasificación