量角器 - 在启动我的测试规范之前执行登录脚本 [英] Protractor - executing login scripts prior to launching my test specs

查看:32
本文介绍了量角器 - 在启动我的测试规范之前执行登录脚本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这里的基本问题是我最初尝试登录,启动我的应用程序,然后运行所有规范.结果证明不是是一个好方法.

The basic problem is here is that I was trying to login initially, launch my app, then run ALL specs. It turned out to NOT be a good approach.

我想不通的是:

为什么下面的 navpanel-spec.js 首先运行 - 在登录和启动 js 文件之前.换句话说,如果我在 navpanel-spec.js 中添加一个 browser.pause(),它会立即暂停——甚至在运行我的 login-spec.js 代码之前.令人困惑!

Why navpanel-spec.js below was running first - before the login and launch js files. In other words, if I add a browser.pause() in navpanel-spec.js, it pauses immediately - PRIOR to even running my login-spec.js code. CONFUSING !

在我的 Protractor.config.js 文件中,我有一些规范:

In my Protractor.config.js file I have a few specs :

specs: [     
 'spec/login.js',
 'spec/launch-awesome-app.js',
 'spec/navpanel-spec.js',        
 'spec/another-spec.js',
 'spec/yet-another-spec.js'
]

login.jslaunch-awesome-app.js 工作正常.他们登录菜单系统,然后点击菜单以启动 myAwesomeapp - 没问题.

login.js and launch-awesome-app.js work fine. They log into the menu system, then click thru the menus in order to launch myAwesomeapp - no problem.

但是,我在顺序启动这些文件时遇到了问题.我假设与 Selenium 控制流有关,因为它似乎正在解析所有规范文件并立即执行任何 browser. 命令.

我正在寻找解决方案,或者更好的方法:

I'm looking for a solution, or perhaps a better approach to :

1) 登录菜单框架

2) 单击菜单以启动相应的 URL

2) Clicking thru the menus to launch the the appropriate URL

3) 最后运行针对步骤 2 中的 URL 的 spec.js 文件

3) And finally running the spec.js files which target the URL in step 2

这是我原来的 navpanel-spec.js 版本:

Here's my original navpanel-spec.js version:

describe('Testing My Awesome App', function () {
    
    var panelObj = new PanelObjects();
    
    var urlDefault = 'https://server/apps/Default.aspx?r=1';
    var urlApp = 'https://server/apps/MyAwesomeApp.html';

    browser.get(urlApp);    // Runs my AwesomeApp tests okay, HOWEVER it launches a new browser window.

    browser.get(urlDefault);    // Launches app framework with top nav menus and embedded <iframe>, 
                                // HOWEVER I cannot select iframe and successfully run tests here.

    beforeEach(function () {
        browser.sleep(5000);
        browser.waitForAngular();
    });    

    // USE-CASE OBJECT !!
    var items = browser.params.useCaseJsonFile["navigatePanels"];


    browser.getAllWindowHandles().then(function (handles) {
        handles.map(function (win, idx) {
    
            browser.driver.getCurrentUrl().then(function (curr) {
                if (curr.indexOf('Default.aspx') >= 0) {
                    browser.driver.switchTo().window(handles[idx]);        
                }
            });
        });

    });

    browser.switchTo().frame(element(by.id('1')).getWebElement());
    var testId =  element(by.id('middle'));
    console.log(testId);

    items.map(function (item) {
        if (item.enableTest) {
            var specItem = it(item.name, function () {

                console.log('------------------------------');
                console.log('---- ' + item.describe);

                browser.waitForAngular();

                // select panels, etc..
                panelObj.panelClick(item.panelName).then(function () {                    
                    // ...
                });
                
                panelObj.getPanelText(item.panelName).then(function (title) {
                    expect(title).toContain(item.panelTitle);
                });
                
            });
        }
    });

});

更新: 经过多次讨论,我将我的 loginlaunch 逻辑移到了页面对象文件中.现在我在每个独立的测试规范开始时调用 login/launch.

UPDATE: After much discussion, I moved my login and launch logic into a page objects file. And now I call login/launch at the beginning of each, independent test spec.

这是我更新的 navpanel-spec.js 测试:

Here's my updated navpanel-spec.js test:

var LoginObjects = require('../pageObjects/login-objects.js');
describe('Testing My Awesome App', function () {

var panelObj = new PanelObjects();  
var loginObj = new LoginObjects();

//var urlDefault = 'https://server/apps/Default.aspx?r=1';        
//browser.get(urlApp);    // USING PAGE OBJECTS NOW...

browser.ignoreSynchronization = true;

// LOGIN AND LAUNCH APP !!!    
loginObj.Login();
loginObj.Launch();

beforeEach(function () {
    browser.sleep(5000);
    browser.waitForAngular();
});    

// USE-CASE OBJECT !!
var items = browser.params.useCaseJsonFile["navigatePanels"];

// SWITCH TO iframe ELEMENT
loginObj.switchWindowAndFrame();

items.map(function (item) {
    if (item.enableTest) {
	var specItem = it(item.name, function () {

	    console.log('------------------------------');
	    console.log('---- ' + item.describe);

	    browser.waitForAngular();

	    // select panels, etc..
	    panelObj.panelClick(item.panelName).then(function () {                    
		// ...
	    });

	    panelObj.getPanelText(item.panelName).then(function (title) {
		expect(title).toContain(item.panelTitle);
	    });

	});
    }
});

});

和我的页面对象:

module.exports = function(){
    this.Login = function(){

        var url = browser.params.loginUrl;        
        browser.driver.get(url);        
        browser.sleep(200);
        
        var userName = browser.params.credential.userId;
        var password = browser.params.credential.password;

        element(by.id('username')).clear().then(function(){
            element(by.id('username')).sendKeys(userName);
            element(by.id('password')).sendKeys(password);
        });
        
        browser.sleep(1000);

        var that = this;

        var submitElement = element(by.id('bthLogin')); 
        submitElement.click().then(function () {
            browser.getAllWindowHandles().then(function (handles) {
                        
                // LOGIN MESSAGE WINDOW
                browser.driver.getCurrentUrl().then(function(curr){                
                    if (curr.indexOf('LoginMsg.aspx') >= 0){
                        // Do we really need to close the login successful browser ???                    
                        browser.driver.close();
                    }
                });
                
                browser.driver.switchTo().window(handles[1]);
                
            });       
        });
        
    },

    this.Launch = function(){
        var sel = '#TheMenu1 > ul > li:first-child'; 

        var elem = element(by.css(sel));
        elem.click().then(function(){
            browser.sleep(1000);

            var elem2 = element(by.cssContainingText('.rmLink', 'The First Menu Item'));               
            elem2.click();  

            // Select menu item; sleep before attempting to click().
            var subElem = element(by.cssContainingText('.rmLink', 'My Awesome App'));
            browser.sleep(1000);
            
            subElem.click();
            browser.waitForAngular(); 
        });
    },

    this.switchWindowAndFrame = function(){

        browser.getAllWindowHandles().then(function (handles) {

            handles.map(function(win, idx){
                browser.driver.getCurrentUrl().then(function(curr){                    
                    if (curr.indexOf('Default.aspx') >= 0){                
                        browser.driver.switchTo().window(handles[idx]);                        
                    }
                });
            });

        });

        browser.switchTo().frame(element(by.css('[name="1"]')).getWebElement());
    }

};

推荐答案

我认为您这样做是错误的,您的规格不应该相互依赖.规范的想法是您可以并行运行它们并且彼此独立.

I think you are doing this wrong your specs should not depend on each other. The idea of specs is that you can run them parallel and independent from each other.

在我的项目中,我在 beforeAll() 方法中使用从需要它的测试中调用的登录函数(我只在每个规范中登录一次).

In my projects I use a login function that I call from the tests that require it (I only login once in each spec) inside the beforeAll() method.

所以我认为如果你的规格都依赖于前一个的结果,你应该加入它们或找到一种方法使它们独立.

So I think that if your specs all depend on the result of the previous one you should either join them or find a way to make them independent.

祝你好运!

这篇关于量角器 - 在启动我的测试规范之前执行登录脚本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆