2012-04-25 83 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());