0

Ich schreibe ein Selenium-Skript, um eine Chrome-App zu testen, die die Chrome.fileSystem.chooseEntry-API verwendet, um ein Verzeichnis auszuwählen. Wenn ich das manuell mache, funktioniert es gut. Aber wenn ich dies in einem Selenium-Skript zu tun, bekomme ich diesen Fehler zurück:selen + chrome.fileSystem.chooseEntry = Ungültige Aufrufseite Fehler

Unchecked runtime.lastError while running fileSystem.chooseEntry: Invalid calling page. This function can't be called from a background page.

Alle Ideen, wie Selen zu machen und chooseEntry schön zusammen spielen?

Ich habe auf den neuesten Chromedriver aktualisiert, aber immer noch kein Glück. Ich habe auch ChromeOptions angeschaut, aber nichts gesehen, das aussah, als wäre es hilfreich. Die Interwebs scheinen nicht viel zu Selenium und ChooseEntry zu sagen. Ich bin in der Version 51 von Chrome.

Ich bin zu denken, ich brauche einen speziellen Javascript-Einstiegspunkt, um die Pfadwerte für Tests anstelle von ChooseEntry zu setzen. Aber ich würde es vorziehen, keinen separaten Codeausführungspfad für meine Tests zu haben. Hat jemand eine sauberere Lösung?

EDIT: pro Antrag der Kommentator, hier ist der säumige Code:

chrome.fileSystem.chooseEntry({type:'openDirectory'},function(entry) { 
    chrome.fileSystem.getWritableEntry(entry,function(writeable_entry) { 
     console.log("got writeable entry"); 
    }); 
}, function(e) { errorHandler(e); }); 

EDIT # 2: Ich habe mit dem speziellen Hack Javascript Eintrittspunkt weg. Im manuellen Modus - d. H. Nicht unter Selenium - führe ich Code aus, der chooseEntry ausführt, und verwende dann die retainEntry-API, um die Eingabe-ID zu erhalten. Ich habe einen Einstiegspunkt in meinem Javascript hinzugefügt, um eine Eintrags-ID zu erhalten und die restoreEntry-API aufzurufen, um sie wieder in einen Eintrag umzuwandeln. Ich habe auch meinen Code geändert, also wenn dieses Eintragsobjekt gesetzt ist, dann benutze das als Datei, anstatt choiceEntry aufzurufen. Schließlich habe ich mein Selenium-Skript so geändert, dass es den Einstiegspunkt "restoreEntry" aufruft, bevor der Rest des Skripts ausgeführt wird.

Dies ist nicht ideal, da jetzt mein Testcode-Ausführungspfad etwas anders ist als mein tatsächlicher Live-Mensch-bei-der-Steuerung-Codeausführungspfad. Aber ich kann jetzt Selenium-Skripte verwenden. Natürlich, wenn jemand an einen nicht-schrecklichen Weg denken kann, diese Lösung zu lösen, würde ich gerne davon hören.

EDIT # 3: Per @ Xans Kommentar, korrigiert meine Terminologie von "Erweiterung" zu "Chrome App."

+0

Können Sie einen Teil Ihres Codes bereitstellen? – user2272115

+0

'chrome.fileSystem' ** ist keine Erweiterungs-API **, sie ist nur für Chrome Apps verfügbar. Also, was schreibst du? – Xan

+0

Whoops, Sie sind 100% korrekt. Ich habe meinen Beitrag aktualisiert, um die richtige Terminologie zu verwenden. Danke, dass du darauf hingewiesen hast. – codemonkey

Antwort

0

Ich kann nur diesen schrecklichen Hack anbieten. Für Chrome Apps unter OSX habe ich Ordnerfavoriten erstellt und benutze Robot keyPress, um die für die App benötigten "Favoritenordner" zu durchsuchen. Der einzig mögliche einlösende Faktor ist, dass er eine gültige/mögliche tatsächliche menschliche Interaktion mit der Dateischnittstelle widerspiegelt.

private void selectOSXFolderFavorite(int favorite) { 

    // With an OSX file folder dialog open, Shift-Tab to favorites list 
    robot.keyPress(KeyEvent.VK_SHIFT); 
    robot.keyPress(KeyEvent.VK_TAB); 
    robot.keyRelease(KeyEvent.VK_TAB); 
    robot.keyRelease(KeyEvent.VK_SHIFT); 

    // move to the top of favorites list 
    int i = 40; 
    while (i-- > 0) { 
     robot.keyPress(KeyEvent.VK_UP); 
     robot.keyRelease(KeyEvent.VK_UP); 
    } 
    while (favorite-- > 0) { 
     robot.keyPress(KeyEvent.VK_DOWN); 
     robot.keyRelease(KeyEvent.VK_DOWN); 
    } 

    // Send an enter key to Select the selected folder 
    robot.keyPress(KeyEvent.VK_ENTER); 
    robot.keyRelease(KeyEvent.VK_ENTER); 
} 
+0

Hallo Peinlich :) Danke für Code-Snippet. Unglücklicherweise benötige ich eines der FileEntry- oder DirectoryEntry-Objekte von Chrome, um meine spätere Arbeit zu erledigen. Das bedeutet, dass ich die ChooseEntry-API verwenden muss, um mein Ziel auszuwählen und das Entry-Objekt zu erstellen. Und es ist ChooseEntry, das den Fehler beim Ausführen unter Selenium auslöst. – codemonkey