代码之家  ›  专栏  ›  技术社区  ›  soccerway

在hooks.js文件中添加beforescenario时Selenium-Cucumber.js测试未能运行

  •  0
  • soccerway  · 技术社区  · 6 年前

    框架使用: 硒黄瓜JS loginApp() BeforeScenario

    `C:\Tests\cucumber\node_modules\cucumber\lib\cucumber\runtime\event_broadcaster.js:30 process.nextTick(function(){ throw error; }); // prevent swallow by unhandled rejection                                        
    TypeError: node_modules\cucumber\lib\cucumber\support_code\library.js:17 scenario.loginApp is not a function
        at C:\Tests\cucumber\step-definitions\hooks.js:4:51
        at _combinedTickCallback (internal/process/next_tick.js:73:7)
        at process._tickCallback (internal/process/next_tick.js:104:9)
        at Module.runMain (module.js:606:11)
        at run (bootstrap_node.js:390:7)
        at startup (bootstrap_node.js:150:9)`
    
    /**/Feature:**
    
    //cucumber/features
    

     Scenario: Check the register tab in application
        When After login look for "Register" in navbar
    
    
    //**lookfortab.js**
    
    //cucumber/step-definitions
    
        const expect = require('chai').expect;
        module.exports = function() {
            this.When(/^After login look for "([^"]*)" in navbar$/, function (registerText) {
            let navText = By.css('div#nav>div>ul>li>a');
            driver.wait(until.elementLocated(navText, 10000));
            return driver.findElement(navText).getText().then(el => {                   
               console.log("print text here:"+el);     
               const displayTxt = el;  
               expect(displayTxt).to.be.eql(registerText);                  
                });     
    
            })
    
        }
    
    //login.js
    
    //cucumber/page-objects
    
    
        module.exports = {  
            loginApp(){
              this.driver.helpers.loadPage('https://testingsite.com')     
              this.driver.findElement(by.id('HomeLogin_Username')).sendKeys("Tester");
              this.driver.findElement(by.id('HomeLogin_Password')).sendKeys("SomePassword123");     
              let lgBtn = By.css('div#login-fields>div>button');
              this.driver.findElement(lgBtn).click();    
            }   
    
        };
    
    //hooks.js
    
    //cucumber/step-definitions
    
    
        module.exports = function () {
            this.BeforeScenario(function(scenario, done) {
                console.log('BeforeScenario: ' + scenario.loginApp());
                done();
            });
    
        };
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   shkaper    6 年前

    首先,注意 selenium-cucumber-js 使用的是相当旧的版本 cucumber-js (1.3.3对5.0.2在写这篇文章的时候)。当你咨询的时候要记住这一点 黄瓜JS 或寻找例子。下面,我将发布链接到 cucumber-js@1.3.3 博士学位。

    至于在您的设置中不起作用的内容:

    1. scenario 传递到挂钩中的对象没有附加页面对象。它只包含一些关于场景和获取场景的方法的元信息。以下是它们的列表: cucumber-js docs
    2. 如果要从挂钩引用页面对象,可以使用全局 page 如下所述: Page objects - selenium-cucumber-js
    3. 你的 loginApp() 函数可能仍然不起作用,因为您访问WebDriver时 this.driver 和助手 this.driver.helpers . 它们也被全球定义为 硒黄瓜JS : Helpers

    所以,你的 hooks.js 应该如下所示:

    module.exports = function () {
      this.BeforeScenario(function(scenario, done) {
        console.log('BeforeScenario: ' + page.login.loginApp());
        done();
      });
    
    };
    

    还有你的 login.js :

    module.exports = {
      loginApp(){
        helpers.loadPage('https://example.com')
        driver.findElement(by.id('HomeLogin_Username')).sendKeys("Tester");
        driver.findElement(by.id('HomeLogin_Password')).sendKeys("SomePassword123");
        let lgBtn = By.css('div#login-fields>div>button');
        driver.findElement(lgBtn).click();
      }
    
    };