serenity bdd: как повторно использовать этапы теста (@steps), как мы это делаем в BDD-огурце (т.е. используя пико-контейнер) - PullRequest
0 голосов
/ 10 мая 2018

Использование Serenity BDD + селен + Junit для автоматизации. У меня есть опыт в BDD огурцов, где мы можем легко делиться шагами. Я хочу достичь того же в безмятежности. Для простоты, скажем, у нас есть Страница входа в систему , а на следующей странице написано Страница проверки имени . Я создал отдельное POM для этих двух страниц и затем соответствующие определения шагов (@steps) и хотел использовать @steps, определенные в этих двух классах определения шагов, в одном сценарии. Можно ли это сделать?

  1. Я пытался использовать это, но браузер закрывается, как только завершается шаг в определенном классе шагов, поэтому другие шаги не выполняются и выдают исключение

    public class AA_NameCheck{
    
        @Managed(driver="edge",clearCookies=ClearCookiesPolicy.BeforeEachTest)
        WebDriver driver;
    
        @Steps
        StepsLoginPage stepL;
        StepsNameCheckPage stepN;
    
        @Test
        public void NameCheck_ValidUser() throws InterruptedException{
            stepL.Launch();
            stepL.Login_ValidCredential();
            stepN.Enter_NameDetails();
    
            }
    }
    

После того, как stepL.Login_validCredentials() завершит работу, браузер закроется, и, таким образом, произойдет исключение в методах Name_EnterDetails()

.
  1. Я попытался вместо того, чтобы создать отдельное определение шага, сохраняя @steps в POM, это сработало, но тогда шаги не видны в отчете спокойствия.

Просто хотел узнать, возможен ли какой-либо другой подход для обмена шагами?

Совместное использование POM и определение шага, пожалуйста, посмотрите

POM для страницы проверки имени:

public class NameCheckPage extends PageObject {

    public NameCheckPage(WebDriver driver) {
        super(driver);
    }

    Actions action=new Actions(getDriver());


    @FindBy(id="xx")
    public WebElementFacade EngName;

    @FindBy(id="xx")
    public WebElementFacade SecondEngName;

    @FindBy(id="xx")
    public WebElementFacade ThirdEngName;


    @FindBy(xpath="xx")
    public List<WebElementFacade> NameCheckBtns;

    @FindBy(id="xx")
    public WebElementFacade PreliminaryStatusChk;


    public void Enter_FirstEngName() {
        EngName.isVisible();
        EngName.sendKeys("xylon");
    }

    public void Enter_EnglishName(String name) {
        EngName.isVisible();
        EngName.sendKeys(name);
    }

    public void Enter_SecEngName() {
        SecondEngName.isVisible();
        SecondEngName.sendKeys("xylonone");
    }

    public void Enter_ThirdEngName() {
        ThirdEngName.isVisible();
        ThirdEngName.sendKeys("xylontwo");
    }

    public void Enter_FirstEngNameone() {
        EngName.isVisible();
        EngName.sendKeys("xylo");
    }

    public void Enter_SecEngNameone() {
        SecondEngName.isVisible();
        SecondEngName.sendKeys("xyloone");
    }

    public void Enter_ThirdEngNameone() {
        ThirdEngName.isVisible();
        ThirdEngName.sendKeys("xylotwo");
    }

    public void AddCompany() {

        action.click(NameCheckBtns.get(1)).perform();
    }

    public void AddSecondCompany() {
        action.click(NameCheckBtns.get(2)).perform();
        }

    public void PrelimCheck() throws InterruptedException {

        for(WebElement btns:NameCheckBtns) {
            System.out.println("Buttons :"+btns.getText());
        }

        System.out.println(NameCheckBtns.get(4).getText());


        JavascriptExecutor js=(JavascriptExecutor)getDriver();
        js.executeScript("arguments[0].scrollIntoView();", NameCheckBtns.get(4));

        action.click(NameCheckBtns.get(4)).perform();
        PreliminaryStatusChk.isVisible();
        System.out.println(PreliminaryStatusChk.getText());
    }

Определение шага для страницы входа в систему:

public class StepsLoginPage extends ScenarioSteps  {
    private static final long serialVersionUID = 1L;
    LoginPage login;

    @Step
    public void Launch() {
    login.Launch();
    }
    @Step
    public void Login_ValidCredential() {
        login.Launch();
        login.Enter_Username();
        login.Enter_Password();
        login.Click_LoginBtn();
         //tried using return but of no help the browser still closes
        //return new NameCheckPage(login.getDriver());
}

Определение шага для страницы проверки имени:

public class StepsNameCheckPage extends ScenarioSteps{
    private static final long serialVersionUID = 1L;
    NameCheckPage namechk;
    @Step
    public void Enter_NameDetails() throws InterruptedException {
        namechk.Enter_FirstEngName();
        namechk.AddCompany();
        namechk.Enter_SecEngName();
        namechk.AddCompany();
        namechk.Enter_ThirdEngName();
        namechk.PrelimCheck();
}

Тест:

public class AA_NameCheck{

    @Managed(driver="edge",clearCookies=ClearCookiesPolicy.BeforeEachTest)
    WebDriver driver;

    @Steps
    StepsLoginPage stepL;
    StepsNameCheckPage stepN;

    @Test
    public void NameCheck_ValidUser() throws InterruptedException{
        stepL.Launch();
        stepL.Login_ValidCredential();
        stepN.Enter_NameDetails();

        }
}

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Когда вы используете два класса с шагами в аннотации @Steps, вы должны иметь:

@Steps
StepsLoginPage stepL; 
@Steps 
StepsNameCheckPage stepN;

В вашем случае второй класс равен нулю.

0 голосов
/ 10 мая 2018

Код, который вы показываете, должен работать нормально, поэтому я подозреваю, что проблема в другом месте.

...