2016-07-04 13 views
1

OK Ich bin neu in PhantomJS und der ganzen Headless-Browsing-Sache. Ich benutze Selenium und PhantomJS, um meine Website zu testen. Die Site basiert auf C# mit .NET MVC. PhantomJS kann anscheinend keine JS-Skripts kompilieren, die Klassendefinitionen enthalten.PhantomJS kompiliert JavaScript-Skripte mit Klassendefinitionen nicht

Die Index.cshtml enthält Verweise auf nur zwei Skripte:

@section scripts { 

    <script src="~/Scripts/foo.js"></script> 
    <script src="~/Scripts/bar.js"></script> 
} 

Der Inhalt foo.js sind:

function add(a, b) { 
    console.log("this works...") 
    return a + b; 
} 

class Polygon { 
    constructor(height, width) { 
     this.height = height; 
     this.width = width; 
    } 
} 

der Inhalt bar.js sind:

console.log("1 + 2 = ", add(1, 2)); 

Ich spiele Selen mit F # 's REPL. Der Code auf der Seite zu navigieren:

let driver = new OpenQA.Selenium.PhantomJS.PhantomJSDriver(@"C:\pathToPhantomJS\"); 
    let url = "http://myLocalHost:12345/home/index" 

    driver.Navigate().GoToUrl(url) 
    let logs = driver.Manage().Logs.GetLog(OpenQA.Selenium.LogType.Browser) 
    logs |> Seq.iter (fun l -> printf "%s\n" l.Message) 

Wenn ich versuche, die index.cshtml Seite mit PhantomJS zu treffen, bekomme ich folgende Fehlermeldung:

[ERROR - 2016-07-04T21:19:44.274Z] Session [f2c46410-422c-11e6-881e-555d71de793e] - page.onError - msg: ReferenceError: Can't find variable: add

phantomjs://platform/console++.js:263 in error [ERROR - 2016-07-04T21:19:44.275Z] Session [f2c46410-422c-11e6-881e-555d71de793e] - page.onError - stack:
global code (http://localhost:56135/Scripts/bar.js:1)

phantomjs://platform/console++.js:263 in error

Der Fehler erscheint, sobald ich ausführen die erste Zeile (Navigieren). Aber sobald ich die Klassendefinition entfernen (von Polygon) aus foo.js, ist alles prima an:

this works...

1 + 2 = 3

Es gibt kein Problem mit diesem in Chrom/Firefox. Ich habe überall gesucht und das einzige, was ich finden kann, das diesem Problem nahe kommt, ist die ganze "inkusive Ausführung"/"Sandbox" -Ding mit page.evaluate() (siehe here). Aber ich benutze offensichtlich keine page.evaluate() hier, und auch weil die Skripte in der Reihenfolge im Mark-up referenziert werden, SOLLTE der Browser in der Lage sein, die Definitionen aufzunehmen. Tatsächlich tut es genau das, es scheint nur zu brechen, wenn es eine Klassendefinition enthält.

Wenn es hilft, ich verwende Windows 10 und Version 2.1.1 von PhantomJS. Ich bekomme das gleiche Problem, wenn ich PhantomJS über die Eingabeaufforderung des Windows ausführe, also glaube ich nicht, dass dies ein Selenium-Problem ist.

Kann mir bitte jemand helfen?

Danke!

Antwort

1

Es stellt sich heraus, dass dies ein Problem mit PhantomJS-Unterstützung für ECMA6 ist; Ich verwende TypeScript und kompiliere es in ECMA6, das für Chrome/Firefox funktioniert, aber noch nicht für PhantomJS.