当前位置: 首页 > 知识库问答 >
问题:

Serenity bdd:如何像我们在cucumberBDD中一样重用测试步骤(@步骤)(即使用Pico容器)

闻飞跃
2023-03-14

使用Serenity BDD selenium JUnit进行自动化。我在cucumberBDD方面有经验,我们可以轻松共享步骤。我想在serenity中实现同样的目标。为了简单起见,假设我们有一个登录页面和一个后续页面,上面写着名称检查页面。我为这两个页面创建了单独的POM,然后创建了相应的步骤定义(@步骤),并希望在单个脚本中使用这两个步骤定义类中定义的@步骤。这可以做到吗?

>

  • 我尝试过使用这个方法,但浏览器会在步骤(特别是步骤类)完成后立即关闭,因此其他步骤不会执行,并给出异常

    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();
    
            }
    }
    

    在< code >步骤1之后。Login_validCredentials()完成浏览器关闭,因此< code>Name_EnterDetails()上的方法出现异常

    只是想知道任何其他方法是可能的共享步骤?

    分享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个答案

    西门马鲁
    2023-03-14

    当您在注释@Steps中使用两个带有步骤的类时,您应该有:

    @Steps
    StepsLoginPage stepL; 
    @Steps 
    StepsNameCheckPage stepN;
    

    在您的情况下,第二类为空。

    祁杰
    2023-03-14

    您显示的代码应该可以正常工作,因此我怀疑问题在其他地方。

     类似资料:
    • 我正在寻找在测试用例中添加 SOAP 请求测试步骤,从不同的 TestSuite 和测试用例,我已经对部分进行了编码以添加 Groovy 脚本以满足相同的要求,但无法添加 SOAP 请求测试步骤。有什么帮助吗? 以下是我的代码:

    • 我设置了以下测试用例: 我想使用Groovy脚本测试步骤获得SoapRequest测试步骤的状态。 它可以如下所示完成: 但是我不想通过脚本运行TestStep,而只是使用soapui testrunner。在datasink测试步骤中,我可以使用这个: 不幸的是,上述方法在GroovyScript TestStep中不起作用 有什么想法吗?

    • 主要内容:1. 背景研究,2. 收集数据,3. 设定业务目标,4. 构建假设,5. 创造变体/假设,6. 运行变体,7. 分析数据A/B测试包括一系列必须按顺序进行的过程,以得出一个现实的结论。 在本章中,我们将详细讨论可用于在任何网页上运行测试的A/B测试过程的步骤 - 1. 背景研究 背景研究在A/B测试中起着至关重要的作用。 第一步是找出网站的跳出率。 这可以通过几种广泛使用的背景研究工具(如Google Analytics等)的帮助完成。 2. 收集数据 来自Google Analyti

    • 步骤一:绑定域名 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。 备注:登录后可在“开发者中心”查看对应的接口权限。 步骤二:引入JS文件 在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.6.0.js 如需进一步提升服务稳定性,当上述资源不可访问时,可改访问:http://r

    • 我对Spring批处理框架相当陌生。 我在一个作业中创建了两个步骤(我们称之为步骤1和步骤2)。我想把它们并行运行。不仅如此,step2的IteamReader还应该使用step1的itemwriter。 我的第一个问题是,在Spring批量中是否有可能做到这一点?如果是,怎么做? 其次,如果这不可能,还有什么工作可以做呢? 谢了。

    • 步骤1和步骤2是需要在安装网站上运行的安装步骤,并且只需要在chrome上运行一次来为场景创建安装。一旦完成,那么步骤3和步骤4需要在客户端网站上的不同浏览器/设备(即Chrome,Firefox,Safari,Mobile)上进行检查。 我的框架是用Cucumber和JavaScript编写的。我如何在cucumber中实现这一点,场景的一些步骤只在chrome上运行一次,其余的步骤应该在不同的