javascript - 制作 'common' login.js 包含;使用 nightwatch.js 测试

标签 javascript selenium npm nightwatch.js

为我的网络应用程序编写测试时;我必须首先模拟登录,然后才能运行其余测试并查看内部页面。现在我正在努力调整代码,这样我就可以为公共(public)函数创建一个“包含”;比如我的登录信息。但是,一旦我将以下代码移动到单独的文件中,并通过 require 调用包含 - 它就不再按预期运行。

即。以下登录并允许我的其他功能(如果包含在同一文件中)。高于我的其他内部屏幕功能。

// Login screen, create opportunity

this.LoginScreen = function(browser) {
        browser
                .url(Data.urls.home)
                .waitForElementVisible('#login', 2000, false)
                .click('#login')
                .waitForElementVisible('div.side-panel.open', 4000, false)
                .waitForElementVisible('input#email', 2000, false)
                .waitForElementVisible('input#password', 2000, false)
                .click('input#email')
                .pause(500)
                .setValue('input#email', Data.ProjMan.username)
                .click('input#password')
                .pause(500)
                .setValue('input#password', Data.ProjMan.password)
                .click('input#email') 
                .pause(500)
                .click('div.form.login-form .btn')
                .pause(5000)

        Errors.checkForErrors(browser);
};     

// Inner functions run after here, sequentially

但是,例如,一旦我将上述内容移动到单独的文件中; Logins.js,然后在原始测试文件的顶部调用它。 (是的,正确的路径)。

var Logins      = require("../../lib/Logins.js");

它只是不再模拟登录。有什么想法吗?我是否应该删除 this.LoginScreen 函数包装器,并以不同的方式调用它以从外部文件执行,或者除了外部 require 路径之外,我是否需要再次从原始文件中触发它?

我还尝试将“module.exports = {”包装在单独文件的登录函数周围,但仍然失败。

最佳答案

Nightwatch 允许您运行基于页面对象的测试,即您可以外部化常用测试函数并在常规测试中使用它们。这可以使用“page_objects_path”来实现' 属性(property)。我添加了常见的“登录”功能,并在项目 here 的示例“单一测试”中使用了它.

工作:

将常用函数放在 .js 文件中,并将其放在文件夹下(例如:tests/pages/login.js),并在 nightwatch 配置文件中传递文件夹路径,如下所示:

 nightwatch_config = {
      src_folders : [ 'tests/single' ],
      page_objects_path: ['tests/pages'],

下面是常见登录函数的示例(login.js):

var loginCommands = {

  login: function() {
    return this.waitForElementVisible('body', 1000)
      .verify.visible('@userName')
      .verify.visible('@password')
      .verify.visible('@submit')
      .setValue('@userName', 'Enter Github user name')
      .setValue('@password', 'Enter Github password')
      .waitForElementVisible('body', 2000)

  }
};

 module.exports = {
      commands: [loginCommands],
        url: function() {
          return 'https://github.com/login';
        },
      elements: {
        userName: {
          selector: '//input[@name=\'login\']',
          locateStrategy: 'xpath'
        },
        password: {
          selector: '//input[@name=\'password\']',
          locateStrategy: 'xpath'
        },
        submit: {
          selector: '//input[@name=\'commit\']',
          locateStrategy: 'xpath'
        }
      }
    };  

现在,在常规测试文件中,为公共(public)函数创建一个对象,如下所示并使用它。

 module.exports = {
      'Github login Functionality' : function (browser) {

    //create an object for login
    var login = browser.page.login();
    //execute the login method from //tests/pages/login.js file
    login.navigate().login();

    //You can continue with your tests below:
    // Also, you can use similar Page objects to increase reusability
        browser
        .pause(3000)
          .end();
      }
    };

关于javascript - 制作 'common' login.js 包含;使用 nightwatch.js 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52120357/

相关文章:

javascript - 如何使用 D3.js 在地理 map 中标记城市?

ruby - 即使在 selenium ruby​​ 脚本完成后如何让浏览器保持打开状态

node.js - 在电子构建器中配置 pkg 选项脚本的最佳方法是什么?

npm - 我的 chrome 版本自动更新到 115 版本,当我运行 webdriver-manager update 命令时,为什么它下载 114 版本的 chrome?

npm 错误!解析 json 时出现注册表错误 - 尝试在 Windows 8 中安装 Cordova for Ionic Framework 时

javascript - ajax调用后表消失了

javascript - 在 ES6 中,为什么不使用 this 就不能引用同级方法?

javascript - Meteor - 为什么我们需要单文件库的包?

Python- Selenium : Element is not currently visible and may not be manipulated

c# - 如何在 Selenium 中自动接受 Chrome 的 "Always open these types of links in the associated app"对话框