javascript - 在 hooks.js 文件中添加 BeforeScenario 时,Selenium-cucumber.js 测试无法运行

标签 javascript node.js selenium-webdriver cucumberjs

框架使用:selenium-cucumber-js。 我正在尝试运行下面的 selenium-cucumber-js 测试。我想将 loginApp() 函数作为 hooks.js 文件中编写的 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();
        });

    };

最佳答案

首先,请注意 selenium-cucumber-js 使用的是相当旧的 cucumber-js 版本(目前为 1.3.3 与 5.0.2)写这个)。当您查阅 cucumber-js 文档或寻找示例时,请记住这一点。下面,我将发布 cucumber-js@1.3.3 文档的链接。

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

    传递到 Hook 的
  1. scenario 对象没有附加页面对象。它仅包含有关场景和获取它的方法的一些元信息。以下是它们的列表:cucumber-js docs
  2. 如果您想从 Hook 引用页面对象,可以使用全局 page,如下所述:Page objects - selenium-cucumber-js
  3. 您的 loginApp() 函数可能仍然无法工作,因为您正在以 this.driver 形式访问 webdriver,以 this.driver.helpers< 形式访问帮助程序。它们也由 selenium-cucumber-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();
  }

};

关于javascript - 在 hooks.js 文件中添加 BeforeScenario 时,Selenium-cucumber.js 测试无法运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53384522/

相关文章:

javascript - 如何检测 jQuery Mobile 中全屏工具栏的切换?

javascript - node.js:如何使用序列和 promise 来建模两个异步循环

php - Datepicker根据服务器日期/时间获取日期

node.js - 无法使用 NodeJS 从表中检索数据。错误: ORA-12560: TNS:protocol adapter error

javascript - 如何启动 react.js 的 nuka 轮播组件?

javascript - 为什么 queryAsync() 会导致添加元数据?

java - Selenium 根据文本或属性中的字符串查找元素

python - 在selenium和python中获取类的值

javascript - 相对于点居中数字

java - Regex/Java - 如何捕获动态表中字符串后面的五位数字