2009-07-21 12 views
3

Ich habe zwei Dropdown-Listen, eine mit einer Liste von Ländern und eine für Staaten/Regionen, die nicht bestückt ist, bis eines der Länder ausgewählt ist. Beide Dropdown-Menüs sind in ein Updatepanel eingeschlossen. Wenn ich die USA auswähle, ist die Status-Dropdown-Liste mit den 50 Staaten gefüllt und ich kann mich von dort fortbewegen.C# mit Selen Ajax DropDownList Frage

Wir verwenden Selenium, um Tests mit diesem Code auszuführen, und die Tests werden immer unterbrochen, wenn das Status-Dropdown erreicht wird. Es dauert entweder zu lange, um die Zustandsliste zu erzeugen, oder es kann die Werte einfach nicht finden, da sie nicht im ursprünglichen HTML-Code enthalten sind, der gerendert wird. Ich habe einige Dinge über ein Javascript-Feld "WaitForCondition" gesehen, kann aber keine Details darüber finden, wie man dies in der Selenium-Dokumentation verwendet. Ich bin kein javascript, aber ich bin auch nicht der Größte. Kann mir jemand erklären, wie Sie mein Dilemma lösen könnten, und wenn es erforderlich ist, Kenntnisse über das Feld WaitForCondition zu erlangen, können Sie mir erklären, wie ich das zum Funktionieren bringen kann?

Für den Rekord habe ich diesen Beitrag gesehen: (click here for semi-useful stackoverflow post), aber ich verstehe nicht, wie ich es auf meine eigene Situation beziehen. Vielen Dank im Voraus für alles, was Sie mir geben können.

Antwort

2

So stellt sich heraus, dass ich die Lösung für mein eigenes Problem gefunden zu haben.

verwendete ich die folgende Zeile in meinem C# Tests und es findet den Wert in meinem Drop-Down-Liste sofort:

selenium.WaitForCondition("var ddl = selenium.browserbot.getCurrentWindow().document.getElementById('insert-id-of-dropdownlist-here'); ddl.options[ddl.selectedIndex].text == 'insert-text-value-to-search-for-in-dropdown-here';", "10000"); 

In der IDE ich die folgenden Parameter verwendet:

Befehl: WAITFORCONDITION

Ziel: var ddl = selen.browserbot.getCurrentWindow(). Document.getElementById ('insert-id-of-dropdownlist-here'); ddl.options [ddl.selectedIndex] .text == 'insert-the-text-Wert zur Suche nach-in-dropdown-here';

Wert: 10000

Dies ist die Seite, die schließlich ich die Lösung herauszufinden geholfen: http://wiki.openqa.org/display/SEL/waitForCondition

+0

Vielen Dank für die interessante Lösung. Ich war mit waitForCondition nicht vertraut, bevor ich den obigen Code gelesen habe. Ich denke jetzt ist die Frage: Was ist am einfachsten zu pflegen? Ein paar Zeilen Javascript oder die klobigen 'for'-Schleifen, die Selenium exportiert, wenn Sie die Wait-Methoden verwenden. :-) Ich würde generell mit der For-Schleife gehen, so dass es für Anfänger-Programmierer einfacher ist, meine Tests beizubehalten, aber ich würde daran interessiert sein, Ihre Meinung zu hören. –

+0

Es ist keine Frage, dass das Javascript ein Schmerz ist. Ich hoffe, ich muss diese Lösung nicht oft verwenden, aber sie funktioniert sehr schnell und löst mein Problem. Wir werden letztlich eine sehr große Anzahl dieser Komponententests haben, deshalb wird Geschwindigkeit hier sehr geschätzt, viel mehr als Code-Lesbarkeit. Aber ich sehe definitiv, woher du kommst. Danke für Ihre Hilfe hier. – shizbiz

4

Verwenden Sie Selenium IDE? Dies macht es sehr einfach, Ihren Code zu schreiben und ihn dann in die Sprache zu exportieren, die Sie mit Selenium RC verwenden.

In Selenium IDE finden Sie eine Methode namens "waitForText". Diese Methode verwendet einen Element-Locator als Argument und eine Zeichenfolge als Wert. Ihr Locator wäre die ID der Status-Dropdown-Liste (oder ein CSS-Selektor, wenn er eine dynamische ID hat). Verwenden Sie für den Wert etwas, das im Dropdown-Menü vorhanden ist, nachdem es geladen wurde (der letzte US-Status in der Liste ist wahrscheinlich die beste Wahl).

Lassen Sie mich wissen, wenn Sie eine Klarstellung oder zusätzliche Details benötigen.

Grüße, Mark

+1

ich Selenium IDE haben. Ihre Lösung funktioniert tatsächlich auf eine extrem seltsame (und nicht akzeptable) Weise. Die Methode "waitForText" sucht nach dem fraglichen Wert, findet ihn nicht und überschreitet das Zeitlimit. Da es jedoch so lange auf eine Auszeit gewartet hat, lässt dieser Fehler schließlich genügend Zeit verstreichen, bis die IDE erkennt, dass das Dropdown-Feld ausgefüllt wurde, und die Anweisung, die die Option auswählt, findet nun den gewünschten Wert. – shizbiz

1

Sorry, es war schwer, meinen Code zu testen, ohne die aktuelle Seite vor mir mit . Das Problem könnte sein, dass jeder Zustand ein option Element unter dem select Element ist (oder verwenden Sie vielleicht ein Javascript-Framework, das dies anders behandelt?).Wenn Sie option Elemente haben, können Sie diese verwenden:

waitForElementPresent | css=option:contains('someState') 

die exportiert als:

for (int second = 0;; second++) { 
       if (second >= 60) Assert.Fail("timeout"); 
       try 
       { 
        if (selenium.IsElementPresent("css=option:contains('someState')")) break; 
       } 
       catch (Exception) 
       {} 
       Thread.Sleep(1000); 
      }