Сценарий - Как переключить окно в многозадачном задании? - PullRequest
0 голосов
/ 25 января 2019

Я расширяю учебник по Slideshare На слайде 164 мы заменим группу строк кода на:

connie.attemptsTo(
            PlanAjourney.from("Waterloo").to("CanaryWharf").departingAt("09:00")
        );

Класс PlanAJourney только с первым методом from должен выглядеть примерно так:

public class PlanAjourney
{
    public static PlanAjourney from(String departure)
    {
        return Task.where("{0} chooses #departure as a departure station",
            Enter.theValue(departure).into(JourneyPlanner.DEPARTURE_STATION)
        )
    }
}

Теперь представьте, что это не одностраничное приложение, а многооконное приложение. Представьте, что Конни нужно переключиться в другое окно, чтобы увидеть JourneyPlanner.DEPARTURE_STATION.

Теперь я бы хотел, чтобы актер мог получить текущий дескриптор окна. Это было бы что-то вроде:

import net.serenitybdd.screenplay.Actor;
import net.serenitybdd.screenplay.Task;
import net.serenitybdd.screenplay.abilities.BrowseTheWeb;
import net.serenitybdd.screenplay.actions.Click;
import net.serenitybdd.screenplay.actions.Enter;
import net.serenitybdd.screenplay.actions.Switch;

    public class PlanAjourney
    {

        public static PlanAjourney from(String departure)
        {
            String currentWindowHandle = BrowseTheWeb.as(actor).getWindowHandle();
            return Task.where("{0} chooses #departure as a departure station",
                Click.on(HomePage.JOURNEY_PLANNER_LINK),
                Switch.to(getNewWindowHandle(actor, currentWindowHandle)),
                Enter.theValue(departure).into(JourneyPlanner.DEPARTURE_STATION)
            )
        }

        private static String getNewWindowHandle(Actor actor, String currentWindowHandle)
        {
            for (String windowHandle : BrowseTheWeb.as(actor).getDriver().getWindowHandles())
            {
                if (!windowHandle.equals(currentWindowHandle))
                {
                    return windowHandle;
                }
            }
            return null;
        }
    }

Но, конечно, это не компилируется, потому что актер не известен.

Как я мог получить актера? Или есть другой способ?

1 Ответ

0 голосов
/ 25 января 2019

Хорошо, я нашел решение.Сначала у нас есть метод в StepDefinition, вызывающий:

public class PlanAJourneyStepDefinitions {
    @When("^(.*) plans a journey from (.*) to (.*) departing at (.*)$")
    public void plan_a_journey(String name, String departure,
        String destination, String departureTime) throws Throwable {
        Actor theUser = theActorCalled(name);
        theUser.attemptsTo(
            PlanAjourney.from(departure, theUser)
                        .to(destination)
                        .departingAt(departureTime)
        );
    }  
}

Мы изолируем пользователя, чтобы он мог передать его / ее методу from класса PlanAjourney.

Тогда легко справитьсяс переключателем окна:

public class PlanAjourney {

    public static PlanAjourney from(String departure, Actor theUser) {
        String currentHandle = BrowseTheWeb.as(theUser).getDriver().getWindowHandle();
        return Task.where("{0} chooses #departure as a departure station",
            Click.on(HomePage.JOURNEY_PLANNER_LINK),
            Switch.toWindow(getNewWindowHandle(theUser, currentHandle)),
            Enter.theValue(departure).into(JourneyPlanner.DEPARTURE_STATION)
        );
    }

    private static String getNewWindowHandle(Actor actor, String currentWindowHandle){
        for (String windowHandle : BrowseTheWeb.as(actor).getDriver().getWindowHandles()) {
            if (!windowHandle.equals(currentWindowHandle)) {
                return windowHandle;
            }
        }
        return null;
    }
}

Но что я до сих пор не понимаю, это как заставить метод "from" возвращать экземпляр класса PlanAJourney.Но это другой вопрос, поэтому я задам другой.

...