2013-04-25 60 views
1

我想設置一個ID爲SelectItem(更準確地說是它的選項列表),以便能夠在Selenium Grid 2測試期間識別它並且找不到辦法。我需要的是找到列表並選擇(單擊)其上的值。在Selenium Grid 2(WebDriver)測試中識別SmartGWT SelectItem的一種方法

嘗試和失敗的意圖:

  1. 用於此目的setID()ensureDebugId()通常的方法是不可用的SelectItem
  2. 方法setName()不留下任何痕跡中生成的HTML
  3. 它無法在包含SelectItem的表單上找到選項列表。 的SelectItem由分離的元件組成:

    • 標籤(標題)
    • 爲textInput(選擇的值)
    • 拾取器(按鈕顯示的選項下拉列表)
    • pickList(選項下拉列表)

    如果您將ID設置爲包含此組件的表單,以便通過className對其進行本地化,您將無法發現pickList,因爲當點擊選擇器並將生成的代碼放在表單邊界,所以你不能在表單中找到它。可以在整個文檔中找到它,但是如果有多個列表,則無法知道哪個列表屬於哪個SelectItem。

歡迎任何建議。先謝謝你。

UPDATE:我想澄清一些事情以避免誤解:我知道對於不同的Selenium工具和版本以及將其與Smart GWT一起使用的最佳方式有很多不同的觀點。這個問題沒有進入這些討論。它僅限於問題標題中指出的邊界:使用WebDriver進行Selenium Grid 2測試。一些背景:在對我們的GWT組件進行編碼時,我們使用setID()方法來標識其中的一些(仔細地,沒有重複地)用於測試目的,我們並不在意這些標識符可以在結果HTML中被讀取。 (使用ensureDebugId()歪曲了我們的觀點,出於某種原因,此外,同構的人建議忘記它)。但setID()不適用於FormItem,即我們無法將ID設置爲SelectItem(它從FormItem延伸)以便寫入將選擇第一個不爲空的選項的測試。

回答

1

我能找到的是一個SelectItem允許您設置器圖標的名稱,這東西我們從來沒有使用和/或需要:

selectItemInstance.setPickerIconName("someName"); 

這個名字是後來在生成的HTML存在。所以我們決定利用它,並以這種方式分配一個ID,就像setID()一樣。所述WebDriver方法允許稍後找到由該名稱的SelectItem元件執行以下步驟:

1)找到形式(具有內部的SelectItem元件)由它的ID

2)找到所有內部的SelectItem元件形式

formElement.findElements(By.className("selectItemControl"));

3)選擇具有pickerIconName等於與setPickerIconName()(通過找到的元素)循環分配的ID的所述一個:

selectItemElement.findElement(By.xpath("//*[@*='" + pickerIconNameID + "']")); 

4)找到時,點擊它來獲得所產生的選項列表

pickerElement.click(); 

注:生成選項列表不是第一次點擊前SelectItem元素和然後繼續,從可見變爲不可見。生成時,它超出了包含相應SelectItem的表單的邊界。這可能是一個問題,因爲如果窗口中有多個SelectItem元素(很可能),則必須找到正確的選項列表。可能會應用幾個標準來找到它。我們選擇了選項列表的位置作爲最簡單也是最可靠的選項:「粘貼」到SelectItem元素的選項列表應該是正確的。

5)找到所有的選項列表窗口上:

driver.findElementsByClassName("pickListMenuBody") 

6)選擇的SelectItem正確選項列表:使用WebElementgetLocation()getSize()方法,檢查其中的選項列表中找到相交/觸摸通過發現SelectItem元素(「selectItemControl」)步驟2和3

就是這樣,從這裏只是選擇在「listTable」必要的項目(包含在選項列表中元素,即「pickListMenuBody」),因爲你可能做了不止一次。

請記住在搜索元素時將加載時間考慮在內,並將實用程序/基礎結構代碼與測試代碼分開,否則這將變得一團糟。

這不是最優雅的解決方案,但它對我們很有用,我相信GWT和Selenium團隊會及時提供更好的解決方案。

歡迎任何意見和建議(僅限使用Selenium Grid 2)。謝謝。

0

有一個關於如何使用硒與智能GWT這裏大量的文檔資料:

http://www.smartclient.com/smartgwtee-latest/javadoc/com/smartgwt/client/docs/UsingSelenium.html

你不希望像你討論使用方法。由智能GWT生成的DOM被認爲是內部細節,而不是直接使用DOM,我們爲您提供基於抽象定位器的更強大的方法。

+0

謝謝你試圖幫助,但你的迴應並不回答我的問題。可能是我自己解釋不夠好,但重點是我討論的方法** IS **在鏈接的頁面上推薦的方式;它說:_「一個主要定位器基於智能GWT小部件的ID」_。我沒有在Selenium IDE中使用它,而是在使用Selenium Grid 2(WebDriver)的自動化測試中使用它。爲了通過它的定位器GWT定位一個小部件,可以在編寫組件時分配這個ID。我不直接使用DOM,我使用RemoteWebDriver來查找元素。 – 2013-04-29 21:34:59

+0

我試圖做同樣的事情 - 從SelectItem選項列表中選擇一個選項 - 使用Selenium IDE作爲鏈接頁面上的參考工具,以便了解它如何處理它。沒門。 Selenium IDE也不能「看見」它,它不能參照列表記錄點擊(即指向它的scLocator)。 – 2013-05-06 16:40:37

相關問題