2016-04-15 24 views
0

Mein Anwendungsfall variiert dafür, aber im Allgemeinen versuche ich, eine Reihe von Elementen zu sammeln und wenden Sie dann _.map() an. Das Problem ist, dass diese Reihe von .getAttribute()-Aufrufe verursachen kann, dass ein lokal funktionierender Test gegen einen Remote-Server wie Soße/Android fehlschlägt.Leadfoot + Soße: Mapping einer Sammlung von Elementen mit getAttr schlägt nur in mobilen

Ein Beispiel: alle <div class='article'><a href='articles/{id}'> auf einer Seite sammeln und dann die hrefs bekommen. Es sieht vielleicht so aus, und dieser Ansatz funktioniert, bis ich auf einer mobilen (Android-) Soßenumgebung teste. Dann bekomme ich eine Auszeit.

Ist es möglich, dass dies ein Problem in Bezug auf meine Android-Umgebung Fähigkeiten ist? Um so viele Anfragen zu häufen? Ich habe versucht, meinen Test von der Verwendung von 75 Artikeln auf nur 45 zu skalieren, und ich habe das Timeout auf 60 Sekunden erhöht und trotzdem schlägt der mobile Test fehl. vor Ort mit verchromten ist in Ordnung, Chrom Desktop + Sauce ist in Ordnung.

Nicht mein eigentlicher Test, sondern eine Annäherung des Codes ich spreche:

/// ... return this.remote 
.findAllByTagName('div.article a') 
    .then(function (articles) { 
     var promises = articles.map(function(article) { 
     return article.getAttribute('href'); 
     }); 
     Promise.all(promises) 
     .then(function (hrefs) { 
     uniques = _.uniq(hrefs); 
     assert(hrefs.length === uniques.length); 
     }); 
    }); 
+0

Welchen Fehler bekommen Sie? – jason0x43

+0

Sie sollten es wahrscheinlich mit einem häufigeren JavaScript-Client versuchen. Dieser sieht zweifelhaft nur durch seinen Titel: "Leadfoot treibt Browser wahnsinnig schnell" –

+0

@ jason0x43 - der Fehler, den ich bekomme, ist nur 'Timeout erreicht auf Android 4.4 auf Linux - unendliche Scroll funktioniert 3 mal. Dies schien der jüngste zu sein Android-Build Soße in ihrem Konfigurator angeboten und es läuft auf einem Android-Emulator. Ich nehme an, eine andere Option wäre, den Android-Emulator zu vermeiden und einfach Chrome/Safari mit mobilen Dimensionen/Fähigkeiten zu verwenden? – erikdstock

Antwort

1

Da Sie einen Timeout-Fehler sind zu sehen, würde ich weiterhin schlage das Test-Timeout zu erhöhen, bis der Test erfolgreich . Die mobilen Testumgebungen auf Sauce sind langsamer zu initialisieren und langsamer zu bedienen als die Desktopumgebungen. Daher ist es durchaus möglich, dass ein Test mit vielen Anfragen einfach sehr langsam ist.

Eine Möglichkeit, die Dinge zu beschleunigen wäre einen execute Block zu verwenden, um die Referenzen zu sammeln, wie:

.then(function (articles) { 
    return this.parent.execute(function (articles) { 
     return articles.map(function (node) { 
      return node.getAttribute('href'); 
     }); 
    }, [ articles ]); 
}) 

In dem obigen Code-Schnipsel, die articles Elementanordnung wird als Argument an den Block ausführen übergeben. Der Remote-WebDriver deserialisiert die Elementverweise in tatsächliche DOM-Elemente, die im Code execute bearbeitet werden können. Dies ist wesentlich effizienter als die Verwendung einzelner Anfragen für jedes Element, da nur eine einzige Anfrage an den entfernten Browser gestellt wird.

+0

Danke! Das erklärt alles perfekt. – erikdstock

+0

Das funktioniert nicht mit 'execute' in der mobilen [selendroid] Umgebung. Speziell bekomme ich die Selendroid Exception "Objekt [object HTMLAnchorElement] hat keine Methode 'map'". Funktioniert lokal mit Chrom-Treiber und remote mit Chrome-Browser. – erikdstock

+0

ungerade. Es hört sich an, als würde das Argument "Artikel" als ein einzelnes Element auf Selendroid enden. Der selbe Testcode verhält sich also auf Selendroid vs chromedriver anders? – jason0x43