2016-11-16 4 views
2

Das grundlegende Problem ist hier, dass ich versuchte, mich zuerst anzumelden, starten Sie meine App, dann führen Sie alle Spezifikationen. Es stellte sich heraus, NICHT ein guter Ansatz sein.Winkelmesser - Ausführen von Anmeldeskripts vor dem Starten meiner Testspezifikationen

Was ich nicht herausfinden konnte, ist die folgende:

Warum navpanel-spec.js unten zuerst ausgeführt wurde - vor der Anmeldung und Start js Dateien. Mit anderen Worten, wenn ich eine browser.pause() in navpanel-spec.js hinzufüge, wird sofort angehalten - bevor ich meinen login-spec.js Code ausführe. VERWIRREND !

In meiner Protractor.config.js Datei habe ich ein paar Daten:

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

login.js und launch-awesome-app.js funktionieren. Sie loggen sich in das Menüsystem ein und klicken dann durch die Menüs, um myAwesomeapp zu starten - kein Problem.

ABER, habe ich Probleme beim sequentiellen Start dieser Dateien. Etwas, was mit dem Selenium-Kontrollfluss zu tun hat, nehme ich an, da er anscheinend alle Spezifikationsdateien analysiert und alle browser. Befehle sofort ausführt.

Ich bin auf der Suche nach einer Lösung, oder vielleicht einen besseren Ansatz zu:

1) Einloggen im Menü Rahmen

2) Durch Klicken durch die Menüs die die entsprechende URL zu starten

3) Und schließlich die spec.js Dateien ausgeführt wird, die die URL-Ziel in Schritt 2

Hier ist meine ursprüngliche 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); 
 
       }); 
 
       
 
      }); 
 
     } 
 
    }); 
 

 
});

UPDATE: Nach vielen Diskussionen, zog ich meine login und launch Logik in eine Auslagerungsdatei Objekte. Und jetzt rufe ich login/launch am Anfang jeder, unabhängigen Testspezifikation auf.

Hier ist meine aktualisiert 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) { 
 
\t var specItem = it(item.name, function() { 
 

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

 
\t  browser.waitForAngular(); 
 

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

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

 
\t }); 
 
    } 
 
}); 
 

 
});

und meine Seite Objekte:

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()); 
 
    } 
 

 
};

+0

** UPDATE ** - @finspin hat einen Seitenobjektansatz für meine Anmelde-/Startprobleme bereitgestellt. –

+0

Bitte zeigen Sie den 'navpanel-spec.js' Spezifikationsdatei Inhalt, danke. – alecxe

Antwort

2

Ich denke, dass Sie das falsch machen, sollten Ihre Spezifikationen nicht voneinander abhängen. Die Idee der Spezifikationen ist, dass Sie sie parallel und unabhängig voneinander ausführen können.

In meinen Projekten verwende ich eine Login-Funktion, die ich von den Tests, die es erfordern (ich melde mich nur einmal in jeder Spezifikation) innerhalb der beforAll() -Methode aufrufen.

Also ich denke, wenn Ihre Spezifikationen alle auf das Ergebnis der vorherigen abhängen, sollten Sie entweder beitreten oder einen Weg finden, um sie unabhängig zu machen.

Viel Glück!

+0

Ja danke @Martin. Genau das habe ich getan. Ein anderes Poster hatte auch das Muster der Seitenobjekte vorgeschlagen, wo meine Login-Routine für jede Spezifikation aufgerufen würde. Ich habe darauf gewartet, dass er hier seine Antwort schreibt ... –

+0

Cool! Viel Glück! –

+0

Allerdings hängen meine Spezifikationen NICHT voneinander ab. Es ist nur das Login-Problem, mit dem ich Probleme hatte. Wie Sie gesagt haben, melden Sie sich entweder an, bevor jede Spezifikation ausgeführt wird, ODER wenn Sie sich nur einmal anmelden und dann alle Spezifikationen sofort ausführen. Ich glaube, das beforeAll() ist die beste Lösung, wie Sie gesagt haben. –

Verwandte Themen