2017-03-23 3 views
0

Ich habe eine Tabelle, in der Daten durch Auswahl einiger Filterfelder aktualisiert werden können. Ein oder mehrere Kontrollkästchen können ausgewählt werden, und nachdem jedes ausgewählt wurde, wird auf der Seite ein Drehfeld angezeigt. Nachfolgende Filter können erst ausgewählt werden, wenn die vorherige Auswahl die Tabelle aktualisiert hat. Das Problem, mit dem ich konfrontiert bin, ist, dass ich ständig StaleElementException bekomme. Dies ist, was ich in Capybara tun -Handle StaleElement Ausnahme

ich zu verstehen, habe Schwierigkeiten, warum bin ich StaleElementException sehen. AFAIK Capybara verwendet Synchronisieren, um den Knoten neu zu laden, wenn die Textmethode für einen bestimmten Knoten verwendet wird. Es kommt auch vor, dass manchmal die Tabellendaten veraltete Daten zurückgibt (dh die vor dem letzten Filter-Update)

+0

hilft das? http://stackoverflow.com/questions/25254584/capybara-synchronize-with-has-no-css – dax

+0

Was ist 'Filter'? Und von welcher Zeile erhalten Sie den StaleElement-Fehler? –

+0

@ThomasWalpole Mit Filtern meine ich Kontrollkästchen, wie Sie es auf E-Commerce-Sites für Filterprodukte sehen. Die Ausnahme ist von der letzten Zeile des obigen Codes. – Rahul

Antwort

0

Die Verwendung von all oder first deaktiviert jeglicher Elemente Nachladen zurück (Wenn Sie find verwenden das Element ist wiederaufladbar, da die Abfrage verwendet das Element zu lokalisieren ist vollständig bekannt). Das bedeutet, dass wenn sich die Seite während der Zeit ändert, in der die letzte Zeile Ihres Codes läuft, die StaleElement-Fehler auftreten. Dies ist in Ihrem Code möglich, weil has_no_css? kann ausgeführt werden, bevor das Overlay angezeigt wird. Eine Lösung hierfür ist has_css? mit einer kurzen Wartezeit, um das Overlay zu erkennen, bevor Sie überprüfen, dass es verschwindet. Die has_xxx? Methoden geben nur wahr/falsch zurück und erhöhen keine Fehler, also Worst Case has_css? vermisst das Erscheinen/Verschwinden der Überlagerung vollständig und geht im Wesentlichen für die angegebene Wartezeit in einen Schlaf über.

visit('/table-page') # table with default values is displayed 

# select all filters one by one. Wait for spinner to disappear after each selection 
filters.each do |filter| 
    check(filter); 
    has_css?('.loading_overlay', wait: 1) 
    assert_no_selector('.loading-overlay', wait: 15) 
end 

# get table data as array of arrays. Added *minimum* so it waits for table 
all('tbody tr', minimum: 1).map { |row| row.all('th,td').map(&:text) }