2012-04-25 80 views
0

如何解析這些代碼塊的文本部分?我在java中使用Selenium客戶端驅動程序。用xpath或cssSelector解析HTML?

<li id="NOT_PUT_PREF_STORE" style=""> 
<span id="STORE_AVAIL" class="BodyLBoldGrey StockStat">Out of stock</span> <span id="InYourLocal">in your local</span> <span id="storeRollover_2"><span id="STORE_CITY" class="BodyLBoldLtgry VIBSStore1">West Hills</span></span> store<span id="notSelectOptionSOI">.</span> 
</li> 

<li id="NOT_PUT_PREF_STORE" style=""> 
<span id="STORE_AVAIL" class="BodyLLtgry StockStat">Not carried</span> <span class="BodyLLtgry" id="InYourLocal">in your local</span> <span id="storeRollover_2"><span id="STORE_CITY" class="BodyLBoldLtgry VIBSStore1">West Hills</span></span> store<span id="notSelectOptionSOI">.</span> 
</li> 

<li id="NOT_PUT_PREF_STORE" style=""> 
<span id="STORE_AVAIL" class="BodyMBold StockStatGreen">In stock</span> <span id="InYourLocal">in your local</span> <span id="storeRollover_2"><span id="STORE_CITY" class="BodyLBoldLtgry VIBSStore1">West Hills</span></span> store<span id="notSelectOptionSOI">.</span> 
</li> 

我試圖分析在webelement在這些變化的文本部分(即:不執行,庫存,出的股票)。我是一個非常新的用戶selenium和html解析,所以這真的很難讓我的功能。

我在想,這會是這樣的

WebElement driver = new FirefoxDriver(profile); 
driver.get(Url); 
System.out.println(driver.getElement(By.id("STORE_AVAIL").getText()); 

不知道我會怎麼做它cssSelector但人們告訴我,速度更快。 這項工作?

driver.getElement(By.xpath("//li[@id='NOT_PUT_PREF_STORE']./span[@id='STORE_AVAIL']").getText() 
+4

_「我正在查找的字符串實際上並不存儲在頁面源代碼中。」_那麼它如何顯示? JavaScript的? _「,但STORE_AVAIL實際上在頁面源中」_我認爲你只是與自己矛盾,但目前還不清楚。 – 2012-04-25 23:58:39

+0

順便說一句,上面的代碼是做什麼的?對我來說,它應該打印出你需要的... – 2012-04-26 05:26:04

回答

0

當我試圖找到頁面上的元素,我總是通過建立自己的定位器:

  1. ID = driver.getElement(By.id("STORE_AVAIL").getText());
  2. CSS選擇器= driver.getElement(By.css("span#STORE_AVAIL").getText());
  3. 的XPath = driver.getElement(By.xpath("//span[@id='STORE_AVAIL']").getText());

的ID似乎是最快和最簡單的,無論是爲webdriver還是爲我。 id在頁面上應該是唯一的。

CSS對我來說要多一點調查性工作,但webdriver處理它就好了。最後,xpath有時是不可避免的(除非你向開發人員購買啤酒,並且很好地要求改變應用程序,以便更快地找到它 - 畢竟,無論如何你都在爲它們進行測試)。使用IE瀏覽器定位xpath非常慢,寫入複雜的xpaths是一種拖拽。

Xpath也很脆弱,對dom的一個小改動可能導致xpath無法使用。然後你可以調試/重寫你的xpath(它聽起來很有趣)。

我的建議是使用Firefox的Firebug和FirePath插件來幫助您製作定位器。

0

當您'查看頁面源代碼'時,它將只顯示原始HTML源代碼。它會而不是顯示由AJAX調用所做的更改,這看起來像沃爾瑪頁面如何更新該部分/元素。這question提供了一個更好的解釋。

假設您使用的是Firefox(基於您使用的驅動程序),您可以轉到該頁面並單擊Ctrl + Shift + I調出Inspector工具。選擇您感興趣的元素,然後單擊[HTML]按鈕(在Inspector菜單中)查看當前源。

請注意,當您使用selenium webdriver獲取元素時,它將獲取當前值而不是頁面源中顯示的原始值。所以你不必擔心你在頁面源代碼中看到的內容。

+0

哦,我不知道它是如何工作的。謝謝,我現在再試一次,我知道這一點。 – AlbChu 2012-04-26 04:44:05

0

我試着用下面的HTML一小段代碼片段

<li id="NOT_PUT_PREF_STORE" style=""> 
 
<span id="STORE_AVAIL" class="BodyLBoldGrey StockStat">Out of stock</span> <span id="InYourLocal">in your local</span> <span id="storeRollover_2"><span id="STORE_CITY" class="BodyLBoldLtgry VIBSStore1">West Hills</span></span> store<span id="notSelectOptionSOI">.</span> 
 
</li>

我使用下面的代碼來解決這個問題。我使用XPath獲取span元素的樹,並通過解析每個元素來獲取元素的文本。

driver.navigate().to("file:///C:/Users/abc/Desktop/test.html"); 
    List<WebElement> spanEle = driver.findElements(By.xpath("//li/span")); 
    for (int i = 0; i < spanEle.size(); i++) { 
      System.out.println(spanEle.get(i).getText());