2009-07-21 46 views
3

我有兩個下拉列表,其中一個包含一個國家列表,另一個列出的國家/地區只有在選擇其中一個國家/地區時纔會填充。這兩個下拉列表都包裝在一個更新面板中。當我選擇美國時,州下拉列表中充滿了50個州,我可以從那裏前進。帶有Selenium Ajax DropdownList的C#問題

我們使用Selenium對此代碼運行測試,並且測試在達到狀態下拉時始終中斷。它要麼需要很長的時間才能生成狀態列表,要麼它可能找不到值,因爲它們不在呈現的初始html中。我已經看到關於javascript「WaitForCondition」字段的一些內容,但在selenium文檔中找不到有關如何使用此內容的任何詳細信息。我不是一個JavaScript懶散,但它不是最大的。任何人都可以向我解釋如何解決我的困境,如果它恰好需要了解WaitForCondition字段的知識,可以向我解釋我如何才能解決這個問題?

爲了記錄,我看到這個職位:(click here for semi-useful stackoverflow post)但我不明白如何將它與我自己的情況。預先感謝您能給我的任何事情。

回答

2

因此,原來我已經找到了解決我自己的問題。

我用下面一行在我的C#的測試,它在我的下拉列表中找到值瞬間:

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"); 

在我用下面的參數IDE:

命令:waitForCondition

目標:var ddl = selenium.browserbot.getCurrentWindow()。document.getElementById('insert-id-of-dropdownlist-here'); ddl.options [ddl.selectedIndex] .text =='insert-the-text-value-to-search-for-in-drop-downdown-here';

:10000

這是最終幫我找出解決辦法的頁面: http://wiki.openqa.org/display/SEL/waitForCondition

+0

謝謝你的有趣的解決方案。在閱讀上述代碼之前,我並不熟悉waitForCondition。我想現在的問題是:哪個最容易維護?幾行javascript,或者Selenium在使用等待方法時導出的「循環」循環。 :-)我通常會使用`for`循環,以便新手程序員更容易維護我的測試,但我有興趣聽取您的意見。 – 2009-07-23 03:44:08

4

您使用的是Selenium IDE嗎?這使得編寫代碼非常容易,然後將其導出到Selenium RC使用的語言中。

在Selenium IDE中,您會找到一個名爲「waitForText」的方法。此方法將元素定位器用作參數,將字符串用作值。你的定位器將是狀態下拉列表(或一個CSS選擇器,如果它有一個動態ID)的ID。對於該值,只有在加載後才使用下拉菜單中的內容(列表中的最後一個美國州可能是最佳選擇)。

如果您需要任何澄清或更多詳細信息,請告知我們。

問候, 馬克

+1

我有硒IDE。實際上,您的解決方案的工作方式非常奇怪(並且不可接受)。 waitForText方法搜索有問題的值,沒有找到它,並最終超時。但是,因爲它等待了很長時間才能超時,最終失敗最終會讓IDE有足夠的時間來識別下拉列表已填充,並且選擇選項的語句現在可以找到它想要的值。 – shizbiz 2009-07-23 01:59:20

1

對不起,這是很難測試我的代碼,而無需在我面前有實際的頁面。問題可能是每個狀態都是select元素下的option元素(或者您使用的JavaScript框架可以以不同方式處理此問題?)。如果你有option元素,你可以這樣做:

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

其中出口爲:

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); 
      }