XPath相关问题,用于在Webdriver 2 Java中定位元素

时间:2012-10-10 13:58:12

标签: selenium selenium-webdriver

亲爱的Selenium Webdriver 2专家,

我是这个框架的新手,需要您对以下网页XHTML片段中的一些XPath相关问题提出建议:

   <dl class="cN-featDetails">
        <dt class="propertytype">Property type</dt>
        <!-- line 3 --> <dd id="ctl00_ctl00_Content_Content_SrchResLst_rptResult_ctl04_lstTemplate_ddPropertyType" class="propertytype type-house" title="Property type: House">House</dd>
       <!-- line 3a --> <!-- or  class="propertytype type-townhouse"--->
        .......
<div class="main-wrap">
    <div class="s-prodDetails">
        <a id="ctl00_ctl00_Content_Content_SrchResLst_rptResult_ctl04_lstTemplate_hypMainThumb" class="photo contain" href="/Property/For-Sale/House/LA/St Gabriel/?adid=2009938763">img id="ctl00_ctl00_Content_Content_SrchResLst_rptResult_ctl04_lstTemplate_imgMainThumb" title="44 Crown Street, St Gabriel" src="http://images.abc.com/img/2012814/2778/2009938763_1_PM.JPG?mod=121010-210000" alt="Main photo of 44 Crown Street, St Gabriel - More Details" style="border-width:0px;" /></a>
        <div class="description">
             <h4><span id="ctl00_ctl00_Content_Content_SrchResLst_rptResult_ctl04_lstTemplate_lblPrice">Offers Over $900,000 </span></h4>
             <h5>SOLD BY WAISE YUSOFZAI</h5><p>CHARACTER FAMILY HOME... Filled with warmth and charm, is a very well maintained family home in a quiet level street. Be...</p>
    </div>                                                                                                                                                                                                                                                                                                                        
    <a id="ctl00_ctl00_Content_Content_SrchResLst_rptResult_ctl04_lstTemplate_hypMoreDetails" class="button" href="/Property/For-Sale/House/LA/St Gabriel/?adid=2009938763">More Details</a>
    <dl id="ctl00_ctl00_Content_Content_SrchResLst_rptResult_ctl04_lstTemplate_dlAgent" class="agent">
        <!-- line 19 --> <dt>Advertiser</dt>
        <!-- line 20 --> <dd class="contain">                                       
        <!-- line 20a --> <!-- or class="" -->
            <img id="ctl00_ctl00_Content_Content_SrchResLst_rptResult_ctl04_lstTemplate_imgAgencyLogo" title="Carmen Jones Realty" src="http://images.abc.com/img/Agencys/2778/searchlogo_2778.GIF" style="border-width:0px;" />                                                                                                                                                                                                                                                     
        </dd>
    </dl>
</div>

(a)如何测试元素是否存在?例如存在第3行或第3a行但不存在两者。 findElement()方法将导致异常,这是我正在尝试避免的。另一种选择是          在检查其集合列表结果是否为空之前使用findElements()。这种方法似乎是一种漫长的方式。有没有其他更简单的方法来验证存在          一个元素没有引起异常的风险?以下陈述不起作用或导致例外:

WebElement resultsDiv = driver.findElement(By.xpath("/html/body/form/div[3]/div[2]/div[1]/h1/em"));
// If results have been returned, the results are displayed in a drop down.
if (resultsDiv.isDisplayed()) {
    break;
}

(b)是否有一种简单的方法可以通过将boolean运算符和regex作为findElement()或findElements()的一部分来验证其中任何一个元素的存在?这将大大减少          查找次数以及简化搜索。

(c)在按TagName搜索Element时是否可以使用XPath语法。例如driver.findElement(By.tagName( “/格[@类= '报告'] /结果”));

(d)是否可以在XPath搜索中使用正则表达式,例如driver.findElement(By.xpath(“// div [@ class ='main-wrap'] / dl [@ class ='agent'] /对于第20 - 20a行,dd [@ class =''OR @ class ='contains']“))?

(e)如何引用以下节点?例如假设第19行的当前节点是

Advertiser
,如何查找其标题,其类名称          可以具有“包含”或“没有”的值。第18行可能有多个标签。

我以前在XML文档上使用过XPath,但是想扩展在Webdriver 2中定位元素的能力。

任何帮助都会非常棒。

非常感谢,

杰克

2 个答案:

答案 0 :(得分:3)

考虑到Zarkonnen给出的答案,我将添加到(a)

 public boolean isElementPresent(By selector)
       {
           return driver.findElements(selector).size()>0;
       }

这个方法用于验证页面上是否存在该元素。

您还可以使用isDisplayed()方法,该方法可以与isElement配对使用:

driver.findElement(By locator).isDisplayed()

返回您的来源: 假设我们要验证页面上是否存在“更多详细信息”链接。 More Details link

String cssMoreDetails = "a[id='ctl00_ctl00_Content_Content_SrchResLst_rptResult_ctl04_lstTemplate_hypMoreDetails']";
//and you simply call the described above method
isElementPresent(By.cssSelector(cssMoreDetails));
//if you found xPath then it be
isElementPresent(By.xpath("//*..."));

并且总是尝试验证在firepath中找到的web元素的定位器

verify

通过这种方式,您可以自动获取元素的xPath。请参阅附带的屏幕。 xPath generation

答案 1 :(得分:1)

(a)&amp; (d):您可以使用| XPath operator在同一表达式中指定两个备用路径。

(c):您不能在byTagName中使用XPath,但您可以use //查找给定节点的任何后代。

(e):您可以使用XPath axes之类parentfollowing-sibling来选择与给定节点相关的所有节点。

我希望这些指针很有帮助。我还建议使用优秀的Selenium Locator Rosetta StonePDF)作为如何构造XPath的参考。