Wenn Sie das App-Fenster-Handle erhalten können, wird Selenium Webdriver weiterhin funktionieren. Ich entdeckte dies zufällig, als ich am Ende einer Reihe von fehlgeschlagenen Tests einen Anruf an driver.getAllWindowHandles()
hatte. Die Tests sind fehlgeschlagen, weil sie nicht den Verweis auf das Anwendungsfenster-Handle hatten, sondern - unerwartet - den letzten Aufruf, bei dem zwei Fenster-Handles zurückgegeben wurden.
Es scheint, als ob das App-Fenster-Handle nie nach dem Aufruf driver.getAllWindowHandles()
erscheint, aber wenn Sie diese Funktion aufrufen, erhält sein Callback schließlich ein Array von Fenster-Handles, die die Browser-Handles [0] und App [1] enthalten . Ich habe dies über Rekursion, aber nicht mit einer einfachen while-Schleife (etwas, was Web-Treiber asynchron ist) zu arbeiten.
Zum Beispiel, wenn Sie die Javascript-Implementierung von Webdriver graben, versuchen Sie den folgenden Test von dieser relevanten bug report.
describe('A chrome app html page', function() {
var appHandle = "";
var recursionDepth= 0, maxDepth = 100; // edit as necessary.
function getAppWindow(){
browser.driver.getAllWindowHandles().then(function(handles){
if(handles.length == 1){
recursionDepth += 1;
if (recursionDepth == maxDepth) return false;
getAppWindow();
}
if(handles.length == 2){
browser.driver.switchTo().window(handles[1]);
browser.driver.getWindowHandle().then(function(currentHandle){
console.log("handles are" + handles);
console.log("current handle is " + currentHandle);
appHandle = currentHandle;
});
}
});
}
getAppWindow();
it('is on the second window handle', function(){
expect(browser.driver.getWindowHandle()).toEqual(appHandle);
}, 20000);
});
Sie müssen die --load-und-Start-app = Flagge irgendwo gesetzt, wie Antony aus helfend hingewiesen hat. Meine Winkelmesserkonfigurationsdatei sieht so aus:
exports.config = {
seleniumAddress: '<address of server>',
capabilities: {
'browserName': 'chrome',
'chromeOptions':{
'args': ['load-and-launch-app=<path to app code directory>']
}
},
specs: ['<path to tests>']
}