2016-11-16 28 views
2

這裏的基本問題是我最初嘗試登錄,啓動我的應用程序,然後運行所有規格。原來不是是一個很好的方法。量角器 - 在啓動我的測試規格之前執行登錄腳本

我無法弄清楚什麼是以下幾點:

爲什麼navpanel-spec.js低於第一次運行 - 在登錄和啓動js文件之前。換句話說,如果我在navpanel-spec.js中添加browser.pause(),它會立即暫停 - 甚至可以運行我的login-spec.js代碼。混亂!

在我Protractor.config.js文件我有幾個規格:

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 - 沒問題。

但是,我遇到問題順序啓動這些文件。與我所假設的Selenium Control-flow有關,因爲它似乎是解析所有規格文件並立即執行任何browser.命令。

我正在尋找一個解決方案,或者更好的辦法:

1)登錄到通點擊菜單中的菜單框架

2)啓動相應的URL

3)最後運行的目標步驟網址的spec.js文件2

這是我原來的navpanel-spec.js版本:

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:後得沸沸揚揚,我搬到我loginlaunch邏輯到頁面對象文件。現在我在每個獨立的測試規範開始時都會調用登錄/啓動。

這裏是我的更新navpanel-spec.js測試:

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

 
});

和我的網頁對象:

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

**更新** - @finspin爲我的登錄/啓動問題提供了頁面對象方法。 –

+0

請顯示'navpanel-spec.js' spec文件內容,謝謝。 – alecxe

回答

2

我認爲你做錯了你的規格不應該依賴於對方。規範的想法是,你可以平行運行它們並且相互獨立。

在我的項目中,我使用了從beforeAll()方法內部需要它的測試(我只在每個spec中登錄一次)調用的登錄函數。

所以我認爲如果你的規格都依賴於前一個的結果,你應該加入他們或找到一種方法使他們獨立。

祝你好運!

+0

是的,謝謝@Martin。這正是我最終做的。另一張海報也提出了頁面對象模式,我的登錄例程將在每個規範中被調用。我等着他在這裏發表他的答案... –

+0

很酷!祝你好運! –

+0

但是,我的規格不依賴於另一個。這只是我一直在努力的登錄問題。正如你所說的,無論是在每個規格運行前登錄,還是一次登錄,然後立即運行所有規格。我相信beforeAll()是你說的最好的解決方案。 –

相關問題