4

In meinem index.html, ich sage ausdrücklich:Angular Protractor: Führen Sie Scripts in Browser-Kontext

window.myAppInstance = new MyApp.myAppConstructor(); 

In meiner To-do-spec.js, ich habe folgendes Setup:

describe('my web page', function() { 
    it('should have a "myAppInstance" object on the window', function() { 
    browser.get('https://my.web.page.com'); 

    function myTest() { 
     return Object.keys(window.myAppInstance).sort(); 
    }; 

    var p = browser.driver.executeScript(myTest); 
    p.then(function(ret) { 
     console.log("yay"); 
     console.log(ret); 
    }, function() { 
     console.log("error"); 
     console.log(arguments); 
    }); 
    }); 
}); 

Aber Winkelmesser findet meine App nicht. Stattdessen findet sie null oder nicht definiert:

error 
{ '0': 
    { [WebDriverError: unknown error: Cannot convert undefined or null to object 
(Session info: chrome=50.0.2661.102) 
... and more garbage 

Aber von Chrome Konsole, ich

window.myAppInstance 

ganz gut laufen kann, und er druckt richtig das Objekt aus.

Wie kann ich von meinem Winkelmesser-Test auf dieses Fensterobjekt zugreifen?

Edit 1: Ausführlicher über die Konstruktoren.

Edit 2: In meiner App verwende ich Winkel manual bootstrapping. Bei der weiteren Untersuchung, kann ich diese Zeile in meinem Test hinzufügen:

<snip> 
    browser.get('https://my.web.page.com'); 
    **browser.pause()** 
<snip> 

Meine Schritte jetzt: 1) Hit F12 bringen Chrome Developer Tools 2) in der Konsole suchen. Notieren Sie einen Fehler. Meine App ist abgestürzt. 3) Drücken Sie die Aktualisierungsschaltfläche im Browser manuell. 4) Beachten Sie, wie die App aktualisiert wird und alles wunderbar lädt. Ich kratze verwirrt den Kopf. Schließen daraus, dass es wahrscheinlich, dass irgendwie ist, die Seite Start ist programmatisch mit

browser.get('https://my.web.page.com'); 

unterschiedlich genug von dem Browser bis zu öffnen und das Schreiben in dieser URL zu brechen.

Ich frage mich jetzt, Was wäre mit dem Ausführen der Tests mit Winkelmesser würde meine App fehlschlagen?

Antwort

1

Es könnte ein Timing-Problem sein - der Wert ist noch nicht verfügbar, und Sie können warten müssen, denn es:

function waitForKey() { 
    return browser.executeScript("return window.myAppXXXXXXXXXXXXX"); 
} 

browser.wait(waitForKey, 5000); 
var p = browser.executeScript(myTest); 
// ... 
+0

Danke für die Antwort! Es klingt vielversprechend. Ich werde es versuchen, wenn ich wieder an meinem Computer bin. – Bill

+0

Lustig sollten Sie das Verb 'versprechen' verwenden. – targumon

1

Ihr Objekt myAppXXXXXXXXXXXXX ist wahrscheinlich noch nicht instanziiert zu dem Zeitpunkt myTest ausgeführt wird. Wenn das der Fall ist, dann ist eine Lösung executeAsyncScript rief stattdessen die Tasten des Objekts zurückzukehren, sobald das Objekt vorhanden ist:

function myTest(callback){ 
    if (window.myAppXXXXXXXXXXXXX) { 
    callback(Object.keys(window.myAppXXXXXXXXXXXXX).sort()); 
    } else { 
    setTimeout(myTest, 30); // try again in 30ms 
    } 
} 

browser.driver.executeAsyncScript(myTest) 
    .then(function(ret) { 
    console.log("yay"); 
    console.log(ret); 
    }, function() { 
    console.log("error"); 
    console.log(arguments); 
    }); 
+0

Danke für die Antwort! Es klingt vielversprechend. Ich werde es versuchen, wenn ich wieder an meinem Computer bin. – Bill