2013-05-29 29 views
2

我想獲得的所有遊記的名字,出現在標籤的名稱來獲取標籤名稱,(他們是動態的,所以希望採取陣列具有計數) 在http://www.redbus.in/Booking/SelectBus.aspx?fromCityId=124&fromCityName=Hyderabad&toCityId=462&toCityName=Mumbai&doj=30-May-2013&busType=Any&opId=0如何在硒的HTML webdriver的

這裏的HTML文件的某些部分

<div id="t1-results"> 
<table id="t1-list5" class="list5" cellspacing="0" cellpadding="0" style="margin-top:0px;"> 
<tbody id="t1-0"> 
<tr class="r1"> 
<td class="i1">Akbar Travels</td> 
<td class="i2"> 
<td class="i3"> 
<td class="i4"> 
<td class="i5"> 
<td class="i6"> 
<td class="i7"> 
    </tr> 
<tr class="r2"> 
<tr class="r3"> 
</tbody> 
<tbody class="hrblank"> 
<tbody id="t1-1" class="G"> 
<tr class="r1"> 
<td class="i1">Omer Travels</td> 
<td class="i2"> 
<td class="i3"> 
<td class="i4"> 
<td class="i5"> 
<td class="i6"> 
<td class="i7"> 
</tr> 
<tr class="r2"> 
<tr class="r3"> 
</tbody> 
<tbody class="hrblank"> 
<tbody id="t1-2"> 
<tr class="r1"> 
<td class="i1">Sangita Travel Agency</td> 
<td class="i2"> 
<td class="i3"> 
<td class="i4"> 
<td class="i5"> 
<td class="i6"> 
<td class="i7"> 
</tr> 

我與

 List<WebElement> linkElements = driver.findElements(By.tagName("//table[@cellspacing=\"0\"]")); 

     String[] linkTexts = new String[linkElements.size()]; 

試過當我調試了作爲linkElements ArrayList<E> (id=82)
linkTexts String[0] (id=95)

不工作。

試過這也

List<WebElement> linkElements = driver.findElements(By.tagName("t1-results")); 

     String[] linkTexts = new String[linkElements.size()]; 

任何人都可以請建議我如何取的名字。

+0

我相信你的問題不在於識別元素;你需要的是迭代返回的列表並從每個列表中提取字符串。一些代碼說明如何遍歷列表,請參閱下面的Marlon Bernardes的答案。 –

回答

1

嘗試使用CSS選擇器,像這樣:

List<WebElement> linkElements = driver.findElements(By.cssSelector("table tr.r1 > td.i1")); 

我只是做了一個快速測試和驗證碼找到所有的63場比賽(在本文寫作):

driver.get("http://www.redbus.in/Booking/SelectBus.aspx?fromCityId=124&fromCityName=Hyderabad&toCityId=462&toCityName=Mumbai&doj=30-May-2013&busType=Any&opId=0"); 

//Find's the elements using a CSS selector: all td's (with class "i1"), directly inside a tr (with class r1) which are inside a table. 
List<WebElement> linkElements = driver.findElements(By.cssSelector("table tr.r1 > td.i1")); 
String[] linksText = new String[linkElements.size()]; 
int index = 0; 
for(WebElement element : linkElements){ 
    linksText[index++] = element.getText(); 
} 
+0

非常感謝你,它完美的工作。 – Learner

+0

如果它的工作完美,你可以考慮接受的答案,對嗎? :) –

0

XPath是也不錯的選擇,使用這個希望可以幫到你。

List<WebElement> linkElements = driver.findElements(By.Xpath("Your Xpath")); 
String[] linksText = new String[linkElements.size()]; 
int index = 0; 
for(WebElement element : linkElements){ 
linksText[index++] = element.getText(); 
} 
+0

XPath選擇往往是脆弱:DOM的細微變化可能導致如預期或根本不工作,你的選擇不工作。首選的選擇器順序是:Id/name> css> xpath。 –

+0

其實我花了很多時間使用XPath和無盡管CSS -selector的想法,看看下面的鏈接http://ejohn.org/blog/xpath-css-selectors/ 約翰清楚mension說,「最大的事情意識到CSS選擇器通常非常短 - 但與XPath相比,可悲的是效率低下「。 – Chetan

+0

硒recomends不使用XPath,因爲這不實現的Xpath功能的瀏覽器可能有奇怪的問題。檢查這些鏈接:http://docs.seleniumhq.org/docs/03_webdriver.jsp#by-xpath和http://stackoverflow.com/questions/13975595/why-one-should-prefer-using-css-over- XPath的中,即 –

0

嘗試用下面

int size=driver.findElements(By.cssSelector("#t1-results > #t1-list5 > tbody > tr.r1")).size(); 
for(int i=1;i<=size();i++) 
{ 
    String travelname = driver.findElement(By.cssSelector("#t1-results > #t1-list5 > tbody > tr.r1 > td.i1")) 
} 

給出的CSS伯爵概念讓我知道是上面的腳本爲你工作。

0

兩個CSS和XPath條目可用於諸如這些問題,但需要作出一些澄清:

  1. 一些CSS條目相關的經常改變風格特點,不應該被用作定位器,
  2. 將XPath定位符集體表現爲「脆弱」的特徵回到了過去的日子,當時該術語暗示了父/ html和正在尋找的結束小部件之間的完整DOM路徑。

有一些算法用於構建XPath定位器,這些算法首先被設計爲首要的,並且由於頻繁/大規模的DOM重構而具有強大的功能 - 這種定位器除了脆弱外,其他都不是。

前面提到的最後一個問題(某些瀏覽器[特別是IE]具有非標準XPath實現)不幸的是,無論您是否瞭解XPath的價值。

這不是放棄XPath作爲工具包工具的理由 - 但它可能會放棄帶有許多專有功能的瀏覽器。