2016-09-12 2 views
1

Ich bin neu auf Winkelmesser, Javascript und Async-Programmierung im Allgemeinen. Ich habe Probleme mit dem Beenden von geschachtelten for-Schleifen, nachdem ich festgestellt habe, dass ein bestimmtes Element auf der Seite seine Klasse geändert hat.Winkelmesser - verschachtelt für Schleife, wenn element.getAttribute ('Klasse') ändert

Leider habe ich ein Flash-Objekt auf der Seite, die ich automatisiere, dass ich interagieren muss. Ich benutze dazu direkt mouseMoves und clicks, was meiner Meinung nach zufriedenstellend ist. Ich möchte in ein 10x10-Raster klicken, bis ich auf etwas im Raster klicke, das die Klasse eines anderen Elements auf der Seite ändert. Hier ist mein Code:

var selectSeat = function() { 
    var xCoord = 157; 
    var yCoord = 57; 
    var breakLoop = false; 
    for (var i=0; i<10; i++) { 
    for (var j=0; j<10; j++) { 
     browser.actions().mouseMove(flashElement, {x: xCoord+(15*i), y: yCoord+(15*j)}).click().perform(); 
     browser.sleep(500); 
     buttonElement.getAttribute('class').then(function(attribute) { 
     if(attribute === 'black-button') { 
      breakLoop = true; 
     } 
     }) 
     if (breakLoop) { 
     return; 
     } 
     } 
    } 
}; 

ich die Werte des Attributs und breakLoop an die Konsole angemeldet habe, um sicherzustellen, dass sie wie erwartet ändern sie, und sie sind. Das Problem kommt von dem 'if (breakLoop) {return; } 'blockiert nicht, auch wenn breakLoop wahr ist. Ich weiß, dass dies Probleme aufgrund der asynchronen Natur des Winkelmessers hat, aber nach stundenlangem Suchen und Versuchen von Lösungen kann ich nicht herausfinden, was meine richtige Lösung ist.

Antwort

0

Lassen Sie mich mit einem berühmten Zitat von here

erstem Geheimnis zu meistern asynchrone Programmierung starten: Programmierung ohne Schleifen. JavaScript die Loops nur synchron laufen können, und nicht verwendet werden können asynchrone Funktionen

Damit erklärt zu wiederholen, das Problem in Ihrem Code ist die Bedingung

if (breakLoop) { 
    return; 
    } 

vor dem getAttribute() Vergleich ausführt und Wertzuweisung von Breakloop. Die Winkelmesser-Webdriver-Befehle der ersten Iterationen könnten immer noch ausgeführt werden, wenn Sie in der letzten Iteration tatsächlich nach der Bedingung suchen.

Ich würde so etwas vorschlagen. Sehen Sie einen schönen Artikel über die gleichen http://metaduck.com/01-asynchronous-iteration-patterns.html

var selectSeat = function(callback) { 
    var xCoord = 157; 
    var yCoord = 57; 
    for (var i=0; i<10; i++) { 
     for (var j=0; j<10; j++) { 
      browser.actions().mouseMove(flashElement, {x: xCoord+(15*i), y: yCoord+(15*j)}).click().perform(); 
      browser.sleep(500); 
      buttonElement.getAttribute('class').then(function(attribute) { 
       if(attribute === 'black-button') { 
        callback(); 
       } 
      }) 
      } 
    } 
}; 
+0

Wie ich schon sagte, ich bin ein Anfänger, so dass ich nicht wirklich verstehen, was die Callback-Funktion tut. Wie verlässt es die Schleife? Ich habe versucht, mit Ihrem Beispiel und eine Funktion übergeben, die einfach zurückgibt und das hat nicht funktioniert. Ich brauche nur mehr Erklärungen darüber, was dein Beispiel macht, und ich bin mir sicher, dass ich es herausfinden kann. – jamacdonald

Verwandte Themen