這裏的基本問題是我最初嘗試登錄,啓動我的應用程序,然後運行所有規格。原來不是是一個很好的方法。量角器 - 在啓動我的測試規格之前執行登錄腳本
我無法弄清楚什麼是以下幾點:
爲什麼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.js
和launch-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:後得沸沸揚揚,我搬到我login
和launch
邏輯到頁面對象文件。現在我在每個獨立的測試規範開始時都會調用登錄/啓動。
這裏是我的更新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());
}
};
**更新** - @finspin爲我的登錄/啓動問題提供了頁面對象方法。 –
請顯示'navpanel-spec.js' spec文件內容,謝謝。 – alecxe