Pregunta ¿Es Ruby compatible con el patrón estricto de objeto de página?


He creado varios frameworks de Automatización de Pruebas usando el Patrón de Objetos de Página con Java (https://code.google.com/p/selenium/wiki/PageObjects)

Dos de los grandes beneficios que he encontrado son:

1) Puede ver qué métodos están disponibles cuando tiene una instancia de una página (por ejemplo, escribir homepage. me mostrará todas las acciones / métodos a los que puede llamar desde la página de inicio)

2) Porque los métodos de navegación (p. goToHomepage()) devuelve una instancia de la página siguiente (por ejemplo, página de inicio), puede navegar a través de sus pruebas simplemente escribiendo el código y viendo a dónde lo lleva.

p.ej.

WelcomePage welcomePage = loginPage.loginWithValidUser(validUser);
PaymentsPage paymentsPage = welcomePage.goToPaymentsPage();

Estos beneficios funcionan perfectamente con Java ya que el tipo de objeto (o página en este caso) es conocido por el IDE.

Sin embargo, con Ruby, el tipo de objeto no se arregla en ningún punto y suele ser ambiguo para el IDE. Por lo tanto, no veo cómo puede obtener estos beneficios en un conjunto de automatización creado con Ruby (por ejemplo, mediante el uso de Cucumber).

¿Alguien puede mostrarme cómo usaría Ruby con el Patrón del Objeto de Página para obtener estos beneficios?


15
2018-06-26 10:33


origen


Respuestas:


De alguna investigación adicional, parece que el requisito inicial puede cumplirse utilizando variables de instancia:

Given(/^I am on the launch page$/) do
  @launch_page ||= LaunchPage.new
end

When(/^I open the set alarm time page$/) do
  @set_alarm_page = @launch_page.goto_set_alarm_page
end

When(/^I open our apps from the home page$/) do
  @launch_page.navigation_toolbar.open_our_apps
end

Then(/^I should see the homepage alarm time is (\d+)$/) do |alarm_time|
  alarm_time_actual = @launch_page.get_alarm_time
  assert_equal(alarm_time, alarm_time_actual)
end

Siempre que en algún lugar de la clase de definición de paso cree explícitamente un nuevo objeto de página (en el ejemplo anterior: LaunchPage.new), aparecerán todas las páginas siguientes y proporcionará los valores de método / propiedad de intellisense.


9
2017-07-21 15:17



Yo uso espinacas en lugar de pepino, es casi idéntico, pero los pasos están encerrados dentro de una clase que es única para ese archivo de características, por lo que no hay fugas de objetos fuera del alcance actual.

https://github.com/codegram/spinach


6
2017-07-23 10:43



De chatear con colegas, sospecho que la siguiente podría ser la mejor solución (pero publique una respuesta alternativa si existe una mejor solución):

When(/^I buy a movie from the movie page$/) do
  movie_page = MoviePage.new
  movie_page.buyMovie("Test Movie")
  purchase_page = PurchasePage.new
  purchase_page.confirmPurchase
end

Por lo tanto, en el ejemplo anterior, NO estamos devolviendo instancias de la página siguiente cuando navegamos por la página (ya que la página devuelta sería simplemente un tipo desconocido de objeto). Además, necesitamos crear una nueva instancia de cualquier página en la que estemos (usando ".new") para que al menos podamos obtener los beneficios de intellisense de tipear "movie_page". y ver qué acciones / métodos están disponibles desde esa página.

¿Alguien tiene mejores soluciones?


3
2018-06-26 10:49