2016-03-18 13 views
1

Ich habe mich gefragt, ob es eine Möglichkeit gibt, mehrere Verbindungen in Gradmesser auszuwählen, wenn Sie die Menge der Verbindungen nicht kennen. Zur Zeit habe ich eine Tabelle, die mehr (unbekannt in der Menge) enthält Links, die ich ausgewählt habe (klicken und Seite bewegen) und dann eine Reihe von Prozessen für einen Test durchläuft ich schreibe:Auswahl mehrerer Verbindungen im Winkelmesser

<table border="0" class="bodyTable"> 
<tbody><tr class="a"> 
    <th>Name</th> 
    <th>Description</th></tr> 
     <tr class="b"> 
      <td><a href="Link3">Link1</a></td> 
      <td>-</td></tr> 
     <tr class="a"> 
      <td><a href="Link3">Link2</a></td> 
      <td>-</td></tr> 
     <tr class="b"> 
      <td><a href="Link3">Link3</a></td> 
      <td>-</td></tr> 
     <tr class="a"> 
      <td><a href="Link4">Link4</a></td> 
     <td>-</td></tr> 
</tbody> 

Das Problem ist (ich verwende Protractor asynchron, da dies eine nicht-eckige Anwendung ist), da die Seiten, die dem Link folgen, größtenteils identisch sind, wie wähle ich jedes Element in einer unbekannten Liste aus, ohne einen lächerlichen Betrag neu zu schreiben von Code.

Meine früheren Methoden wurden rund um die tr der in der Tabelle zu zählen und eine Reihe von Schleifen starten, aber das ist plump und gut, nur schlecht Code:

//something like this 
elements(by.tagName('tr')).count().then(function(numberOfTRs) { 
    for(int i = 1; i <= numberOfTRs; i++) 
    elements(by.tagName('tr')).get(i); 
}); 

Doch die Versprechungen auch nach der Seite ist geladen und natürlich Fehler erzeugt werden. Es sollte eine Möglichkeit geben zu warten (ohne einen Browser zu verwenden. Schlaf (...)), aber ich bin unsicher was zu tun ist. Normalerweise würde ich diese Frage recherchieren, aber ich weiß nicht einmal, wonach ich suchen soll (ich vermute, dass "Idiot, das den Winkelmesser anders verwendet, als er entworfen wurde", viel auftauchen würde).

Vielen Dank im Voraus ...

Redaktioneller Hinweis:

Eine ideale Funktion in dieser Art und Weise

element(whatever).all(listsoflinks).someFunction(function (elementToUse, index) { 
//...do stuff.... 
    //....return to page.... 
}); 

Die nächste Sache funktionieren würde ich wäre die „Jeder“ Funktion finden konnten, aber es stürzt mit Fehler ab:

Failed: Element not found in the cache - perhaps the page has changed since it was looked up 
For documentation on this error, please visit: http://seleniumhq.org/exceptions/stale_element_reference.html 
Build info: version: '2.48.2', revision: '41bccdd', time: '2015-10-09 19:59:12' 
System info: host: 'BAHCND4397GQF', ip: '10.138.1.15', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_72' 
Driver info: driver.version: unknown 

So, obviously the function is "loosing" its footing when the page change happens

Ich legte einen Zähler (console.log) in der "jeder" -Funktion und es, natürlich, fliegt durch, als ob es nicht ein Teil des Versprechens ist ...

Antwort

1

Wie wäre es mit dem Sammeln der Links in ein Array, Schleife über das Array und navigieren Sie zu jeder URL:

$$("table.bodyTable tr td a").getAttribute("href").then(function(links) { 
    for(int i = 0; i <= links.length; i++) { 
     browser.get(links[i]); 
     // do smth 
    } 
}); 
+0

Das sieht ähnlich aus wie ich zuvor versucht hatte, das Problem wäre, dass die Seite geladen würde und dann sofort die nächste Seite in der Schleife geladen würde (oder das Element, das nicht mehr da ist, weil die Seite sich geändert hat , wäre ausgewählt), könnte dies mit mehreren Browser-Implementierungen innerhalb der Schleife gelöst werden, aber das ist genauso ungeschickt wie alles andere (es muss einen Weg geben, dies ohne zu tun) – jsNoob

+0

@jsNoob es hängt davon ab, was Sie im Körper haben der Schleife. Was genau machst du da? – alecxe

+0

Festhalten an @alecxe Ich werde eine Änderung vornehmen Ich denke, ich habe die Antwort auf das, was ich zu tun versuche – jsNoob

Verwandte Themen