2014-06-30 35 views
2

http://i.stack.imgur.com/L4WUv.jpg檢測下拉顯示與硒的webdriver

Link to Grid

我試圖檢測此頁面(通過文本框被過濾器所描繪的)在不同的下拉菜單。我遇到的問題是,似乎過濾器都有相同的ID。我可以讓網絡驅動程序找到初始過濾器按鈕,但不能在下拉菜單中選擇目標。

  • 請注意我所說的過濾器是漏斗按鈕中的過濾器。例如含有的isEqual等之間*

這是錯誤的,但一個例子

it('Should filter grid to -contain Civic', function() { 
    browser.element(by.id('ctl00_ContentPlaceHolder1_RadGrid1_ctl00_ctl02_ctl03_FilterTextBox_Model')).sendKeys("civic"); 
    browser.element(by.id('ctl00$ContentPlaceHolder1$RadGrid1$ctl00$ctl02$ctl03$FilterTextBox_Model')).click(); 
    browser.element(by.xpath("//*[contains(text(), 'Contains')]")).click(); 
}) 
+0

我看到他們每個人都有一個不同的ID,雖然動態,這將使它作爲一個選擇器無用。你有任何代碼嗎?你試過什麼了? – SiKing

+0

在問題中有錯字。我嘗試過的任何腳本在單擊過濾器下拉列表(我可以找到它)後都會卡住,但它似乎無法找到與特定過濾器相關的選項..包含等。 – user3779502

+0

發佈您的代碼!發佈任何錯誤!請參閱https://stackoverflow.com/help/mcve尋求幫助。 – SiKing

回答

0

注意當時正在尋找的答案是這個答案的話「後,底部編輯」。該答案的其餘部分保留,因爲它仍然有用。

測試動態生成ID和其他屬性的網頁是一項挑戰。有時你只需要弄清楚如何用xpath導航穩定的屬性。下面是找到所有四個下拉菜單的XPath:

//tr[@class='rgFilterRow']//input 

爲每一個區別,你可以這樣做:

(//tr[@class='rgFilterRow']//input)[1]  // Brand Name 
(//tr[@class='rgFilterRow']//input)[2]  // Classification 
(//tr[@class='rgFilterRow']//input)[3]  // Transmission 
(//tr[@class='rgFilterRow']//input)[4]  // Fuel 

使用數字在XPath指定元素是不是真的希望(它會如果表中列的順序發生變化,則行爲不正確),但由於所有動態ID和普遍缺乏可靠的標識屬性,因此在這種情況下可能是最好的。

編輯

我誤解你試圖讓,因爲我不敢看你鏈接到圖像。一旦你打開了這個菜單,你應該可以使用xpath來獲取你想要的文本。例如,如果您想要「包含」選項:

//a[@class='rmLink']//span[text()='Contains'] 
+0

非常感謝您的回覆。這絕對有助於下降,但我有問題的部分是過濾器(漏斗按鈕)下降,其中包含isEqual,之間等 – user3779502

+0

謝謝TJamesBoone。我會嘗試的。到目前爲止,這只是令人沮喪,因爲我認爲這是因爲兩個過濾器都稱爲「相同」列表。這可能只是因爲我用正則表達式或xpath不太好。感謝您跟上我! – user3779502

0

此頁面非常具有動態性。你最好刷一下你的XPath,因爲沒有別的東西可以幫助你。你可以使用這個:http://www.zvon.org/xxl/XPathTutorial/General/examples.html

下面是如何訪問品牌「pulldown」的簡單示例。這是用Groovy編寫的,它看起來很像Java。如果你知道的Java,你應該能夠從該得到的想法:

WebElement brandName = driver.findElement(By.id("ctl00_ContentPlaceHolder1_RadGrid1_ctl00_ctl02_ctl03_BrandNameCombo_Arrow")) 
brandName.click() // to open the "pulldown" 
List<WebElement> brandItems = driver.findElements(By.xpath("//ul[@class='rcbList']/li")) 
brandItems.each { 
    if(it.text == 'BMW') 
     it.click() 
} 

不幸的是,上述id並不十分可靠。一個更好的策略會是這樣的:

WebElement classification = driver.findElement(By.xpath("//table[@summary='combobox']//a[contains(@id, 'ClassificationCombo_Arrow')]")) 

選擇其項目是類似的。

classification.click() // to open the "pulldown" 
List<WebElement> classificationItems = driver.findElements(By.xpath("//ul[@class='rcbList']/li")) 
classificationItems.each { 
    if(it.text == 'Sedan') 
     it.click() 
} 

如果您不能完成這項任務,您應該能夠從開發同事那裏獲得關於如何查找此頁面中所有元素的幫助。

+0

謝謝SiKing,但我認爲我的第一篇文章是誤導性的。我的意思是過濾器與其中的漏斗一樣,並且基本上針對輸入的字符串運行sql類型調用。 – user3779502

+0

那到底是什麼問題?從這裏所有人提供的所有代碼中,你應該很好去。或者重寫你最初的問題;請參閱http://stackoverflow.com/help/mcve – SiKing

+0

我還沒有時間嘗試這些建議。我只是想回復並表示感謝,因爲你花時間回覆。 – user3779502