2016-04-07 5 views
0

Ich habe ein Array, die ich gesammelt:Kann nicht Text eines Elements in einem Array Zugriff mit Pageobject und Watir

array= @browser.ul(:class => 'parent').links 

Ich bin dann in das Array iterieren den Text auf ein bestimmtes Element zuzugreifen versuchen, das Array wie folgt:

array.each_with_index do |i, index| 

Wenn ich etwas tun:

array[index] 

bekomme ich das Ankerelement-Objekt zurück. Und wenn ich das tue:

array[index].element 

Ich werde ein HTML-Element-Objekt zurück erhalten. Aber wenn ich versuche, etwas elementspezifisches zu bekommen, wie zum Beispiel:

dann bekomme ich einen "Unable to locate element" -Fehler.

Ich verwende Watir, Page Object und Ruby. Hier

ist der Umfang der gesamten Arrays Iteration, es ist ziemlich einfach:

array= @browser.ul(:class => 'parent').links 
array.each_with_index do |i, index| 
    if index == array.length-1 
    sleep 1 
    @browser.button(:text => 'Complete').when_present.click 
    else 
    sleep 1 
    @browser.button(:text => 'Complete').when_present.click 
    @browser.a(:text => 'Next').when_present.click 
    end 
end 

Ich versuche, ein elsif hinzuzufügen, die für den Text eines Link überprüft, so dass, wenn es auf dieser bestimmten Seite/Link es tut etwas Besonderes, während auf dieser Seite.

Zum Beispiel in Pseudocode:

Wenn Array-Element text = "Anweisungen", dann die komplette Schaltfläche nicht klicken, gleich neben klicken.

Ich glaube, ich offen sein würde dies in irgendeiner Weise zu lösen, die mir den Link lässt erkennen es aktuell ist, so dass ich eine Reihe Aktion durchführen kann, aber ich dachte, den Text des aktuellen Link greifen würde am einfachsten, daher die Frage.

Wie kann ich auf den Text oder bestimmte Attribute eines Elements in diesem Array zugreifen?

+0

Zwischen dem Zeitpunkt, an dem Sie das 'array' erstellen und dann' array [index] 'aufrufen, führen Sie Aktionen durch, die einen Teil der Seite aktualisieren würden? –

+0

Wahrscheinlich. Grundsätzlich bewegt sich die Iteration durch jede Verbindung. Also klickt es auf einen "vollständigen" Knopf, der einige Sachen auf der Seite verbirgt und dann auf einen "nächsten" Knopf klickt, der ihn zum nächsten Link im Array bewegt. Dann beginnt die nächste Iteration und es wiederholt sich. Ich kann mit dem ganzen Abschnitt des Array-Codes aktualisieren, wenn das hilft. Wenn ich das Array [index] ausprobiert habe (ich habe versucht herauszufinden, ob und wie ich auf den Text zugreifen könnte), war es im Debug-Modus auf den vollständigen Button-Schritt klicken, also wenn ein Element aus dem Array geladen werden soll. – Mayshar

+3

Willkommen bei Stack Overflow. Bitte lesen Sie "[mcve]". Nur eine Beschreibung des Problems lässt uns versuchen, sich vorzustellen, was Sie tun, aber Code und Daten machen es sehr offensichtlich. Wir können Ihnen breite Antworten geben, aber Stack Overflow ist eine detaillierte Antwort. Bitte geben Sie weitere Informationen an, einschließlich des minimalen Codes/der erforderlichen Daten, um das Problem zu veranschaulichen. Es muss nicht Watir verwenden, einfach die minimale Struktur in Ihrem Code neu erstellen. Es hilft uns, dir zu helfen. –

Antwort

1

Höchstwahrscheinlich ändern sich die DOMs Ihrer Elemente nach einer Interaktion (wie das Klicken auf die Schaltfläche "Complete").

Mein Vorschlag ist, alle Elemente nach jeder Interaktion noch einmal zu finden.

versuchen, etwas wie folgt aus:

array = @browser.ul(:class => 'parent').links 
index = 0 
array.length.times do 
    sleep 1 
    if index == array.length-1 
    @browser.button(:text => 'Complete').when_present.click 
    array = @browser.ul(:class => 'parent').links #We are finding new array after possible change 
    elsif array[index].text == 'Instructions' 
    @browser.a(:text => 'Next').when_present.click 
    else 
    @browser.button(:text => 'Complete').when_present.click 
    @browser.a(:text => 'Next').when_present.click 
    end 
    array = @browser.ul(:class => 'parent').links #And once again 
    index = index+1 
end 

Achtung: Ich kann nicht garantieren, dass der obige Code funktioniert, weil ich keine Seite habe es zu testen auf sicher zu sein. Wenn es nicht funktioniert - versuchen Sie, es mit der Idee zu ändern

+0

Also, etwas wie Array [index] .text SOLLTE den Text des Elements zurückziehen? Das ist die ursprüngliche Frage, WIE bekomme ich den Text? Wenn das funktionieren sollte, kann ich einstellen, wie es gelöst werden kann. Als ich das oben versuchte, war ich im Debug-Modus, so dass es auf der gleichen Seite und dem gleichen Bildschirm für Minuten zu einer Zeit saß, so erfrischend das DOM sollte nicht ein Problem gewesen sein, hatte es viel Zeit zum Zurücksetzen. – Mayshar

+0

Ja. Ich habe es sogar nochmal überprüft. array [1] .text gibt den Text des Elements an. – Antesser

+0

Dieser spezifische Code wurde nicht funktionieren, aber das Konzept war die richtige Antwort. Ich musste auf der Seitenaktualisierung warten und das Array nach jeder Nichtanweisungsseite neu erstellen. Bis jetzt funktioniert es. – Mayshar

1

Iterating über eine Liste von Links und nur Informationen auf ihnen ziehen ist ziemlich einfach und sollte zuverlässig arbeiten, solange das DOM nicht ändert. Sobald Sie anfangen, auf Dinge zu klicken oder Aktionen auszuführen, die eine Aktualisierung der Seite oder der gesamten Seite bewirken, sind alle Wetten deaktiviert, da Ihre Sammlung Verweise auf Elemente in der Benutzeroberfläche enthalten kann, die gelöscht oder ersetzt wurden.

Sie scheinen auch ein wenig verwirrt darüber, wie der. Iterator funktioniert.Die Grundform dieser Methode gibt nacheinander jedes Objekt in der Auflistung zurück. Die with_index-Version gibt jedes Objekt und seinen Index innerhalb des Arrays zurück. In den meisten Fällen verwenden Sie das Formular "with_index" nicht, es sei denn, Sie interessieren sich für den Index.

Zum Beispiel Ihrer Sammlung und Ausgabe des Text jeden Link zu gehen, können Sie einfach

links_list = @browser.ul(:class => 'parent').links 
links_list.each do |link| 
    puts "the link text is: #{link.text}" 
end 

tun könnten, wenn Sie den Index jeden Link, um anzuzeigen, wollen, dann könnte man tun

links_list = @browser.ul(:class => 'parent').links 
links_list.each_with_index do |link, index| 
    puts "the text for link number #{index} is: #{link.text}" 
end 

Wenn Sie sich durch eine Liste von Links wie diesem und Dinge mit den Seiten arbeiten, die Seitenaktualisierungen verursachen können, dann sind Sie besser dran, eine Taktik wie die in der anderen Antwort, wo Sie eine Schleife erstellen Base d off die Größe der Liste, aber holen Sie die Liste innerhalb der Schleife, so dass es immer "frisch" und nicht potenziell Verweise auf Objekte, die nicht mehr im DOM sind.

Verwandte Themen