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());
}
};
** UPDATE ** - @finspin hat einen Seitenobjektansatz für meine Anmelde-/Startprobleme bereitgestellt. –
Bitte zeigen Sie den 'navpanel-spec.js' Spezifikationsdatei Inhalt, danke. – alecxe