【问题标题】:How to run an ordered test如何运行有序测试
【发布时间】:2015-06-13 12:25:18
【问题描述】:

我想要

  • 填写姓名和密码输入字段
  • 点击登录按钮
  • 等待页面加载
  • 点击按钮

我怎样才能做到这一点?我意识到承诺将参与其中。这是我尝试过的:

conf.js

var env = require('./environment.js');

exports.config = {
  seleniumAddress: 'http://localhost:4444/wd/hub',

  specs: ['test/e2e/app/test-spec.js'],

  baseUrl: env.baseUrl,

  onPrepare: function() {
    console.log("base url is: " + env.baseUrl);
    browser.driver.get(env.baseUrl + '#/login');

    element(by.model('my.username')).sendKeys('username');
    element(by.model('my.password')).sendKeys('password');

    console.log("clicking login button...");
    element(by.css('button.md-primary.md-button.md-default-theme')).click();

    // Login takes some time, so wait until it's done.
    // For the test app's login, we know it's done when it redirects to
    // /#/home.html.
    browser.driver.wait(function() {
      return browser.driver.getCurrentUrl().then(function(url) {
        console.log("read current url as" + url);
        console.log("returning...");

        return  /\/#\/home\//.test(url);
      });
    }, 10000);
  }
};

然后是测试。

test-spec.js

describe('Click button on home page', function() {
  it('should click the button', function() {
    console.log("looking for button on home page")
    element(by.css('button.md-fab.md-accent.md-primary.md-button.md-default-theme')).click();
  });
});

供参考

环境.js

// Common configuration files with defaults plus overrides from environment vars
var webServerDefaultPort = 9002;

module.exports = {
 // The address of a running selenium server.
 seleniumAddress:
   (process.env.SELENIUM_URL || 'http://localhost:4444/wd/hub'),

 // Capabilities to be passed to the webdriver instance.
 capabilities: {
   'browserName':
       (process.env.TEST_BROWSER_NAME || 'chrome'),
   'version':
       (process.env.TEST_BROWSER_VERSION || 'ANY')
 },

 // Default http port to host the web server
 webServerDefaultPort: webServerDefaultPort,

 // A base URL for your application under test.
 baseUrl:
   'http://' + (process.env.HTTP_HOST || 'localhost') +
         ':' + (process.env.HTTP_PORT || webServerDefaultPort)

};

输出

http://localhost:4444/wd/hub使用 selenium 服务器
[启动器] 运行 1 个 WebDriver 实例
基本网址是:http://localhost:9002
单击登录按钮...
在主页上寻找按钮

我从来没有看到"read current url as" 告诉我promise 没有执行并且我的测试执行得太早了。

所以我得到的错误是有道理的,因为测试运行得太早了:

NoSuchElementError: No element found using locator: By.cssSelector("button.md-> fab.md-accent.md-primary.md-button.md-default-theme")

【问题讨论】:

    标签: angularjs protractor


    【解决方案1】:

    wait() 调用放入beforeEach()

    describe('Click button on home page', function() {
    
      beforeEach(function () {
        browser.wait(function() {
          return browser.getCurrentUrl().then(function(url) {
            console.log("read current url as" + url);
            console.log("returning...");
    
            return  /\/#\/home\//.test(url);
          });
        }, 10000);
      });
    
      it('should click the button', function() {
        console.log("looking for button on home page")
        element(by.css('button.md-fab.md-accent.md-primary.md-button.md-default-theme')).click();
      });
    });
    

    或者,您可以等待主页上的元素变得可见:

    describe('Click button on home page', function() {
      var scope = {};
    
      beforeEach(function () {
        var EC = protractor.ExpectedConditions;
        scope.defaultTheme = element(by.css('button.md-fab.md-accent.md-primary.md-button.md-default-theme'));
        browser.wait(EC.visibilityOf(scope.defaultTheme), 10000);
      });
    
      it('should click the button', function() {
        console.log("looking for button on home page");
        scope.defaultTheme.click();
      });
    });
    

    【讨论】:

    • onPrepare: 在第一种情况下是什么样子的?
    • @P.Brian.Mackey 是的,尝试删除 onPrepare 中的等待并在 beforeEach 中使用它。
    【解决方案2】:

    在修补之后,我在以下设置中获得了最大的成功:

    • beforeAll() 用于登录
      • sendkeys()OnPrepare() 内无法为我工作。我将OnPrepare() 缩短为一个简单的重定向到登录页面。
    • 我将 config.js 设置为使用 firefox,因为我无法让 click() 在 chrome 中运行。
    • 使用 Jasmine2(默认为 Jasmine1)
    • 使用一系列browser.wait 来锻炼计时。您可以等待一个元素存在(一个仅存在于 page2 本身的元素)
      • browser.waitForAngular() 执行类似的职责。我在使用此功能时不太成功
    • Protractor configuration file documentation

    test-spec.js

        describe('Click button on home page', function() {
          beforeAll(function () {
            element(by.model('my.username')).sendKeys('username');
            element(by.model('my.password')).sendKeys('password');
            element(by.id('loginButton')).click();
    
            browser.wait(function() {
              return browser.driver.getCurrentUrl().then(function(url) {
                var result = url.indexOf("/#/home") > -1;//wait for url to change to this
                return result;
              });
            }, 10000);
          });
    
          it('should click the button', function() {
            console.log("executing test...");   
            browser.ignoreSynchronization = true;//Yea I had to use this here too...I dunno why this is required
    
            element(by.id('someButton')).click();
            browser.wait(function() {
               console.log('inside wait for vm.firstName');
               return browser.isElementPresent(by.model('vm.firstName'));
            }, 10000).then(function(){
              //rinse and repeat with more waits as pages change
            });
            expect(true).toBe(true);
          });
        });
    

    conf.js

    var env = require('./environment.js');
    
    exports.config = {
      seleniumAddress: 'http://localhost:4444/wd/hub',
    
      specs: ['test/e2e/app/test-spec.js'],
    
      baseUrl: env.baseUrl,
    
      capabilities: {
        browserName: 'firefox'
      },
    
      framework: 'jasmine2',
    
      onPrepare: function() {
        browser.driver.get(env.baseUrl + '#/login');
      }
    };
    

    环境.js

    没有变化

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 2015-02-11
      • 2014-03-14
      • 2020-09-10
      • 2015-12-21
      • 2015-09-21
      • 1970-01-01
      相关资源
      最近更新 更多