2

亲爱的 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 ) 是否有一种简单的方法可以通过将布尔运算符和正则表达式合并为 findElement() 或 findElements() 的一部分来验证任一元素的存在?这将显着减少查找的数量并简化搜索。

(c) 是否可以在通过 TagName 搜索 Element 时使用 XPath 语法。例如 driver.findElement(By.tagName("/div[@class='report']/result"));

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

(e) 如何引用紧随其后的节点?例如假设当前节点是

广告商
在第 19 行,如何查找位于 under 的标题,其中其类名的值可以是“包含”或没有“”。第 18 行可能有多个标签。

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

任何帮助都会非常感激。

非常感谢,

杰克

4

2 回答 2

3

considering the answer given by Zarkonnen, i'd add to (a) point

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

this method i use for verifying that element is present on the page.

you can also involve isDisplayed() method that can work in pair with isElement is present:

driver.findElement(By locator).isDisplayed()

Returning back to your source: Suppose we want to verify wheter 'More details' links is present on the page or not. 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("//*..."));

And always try to verify found web elements' locators in firepath

verify

In that way you can get xPath of the elment automatically. See the screen attached. xPath generation

于 2012-10-10T14:26:46.260 回答
1

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

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

(e):您可以使用XPath 轴,如parentfollowing-sibling来选择相对于给定节点的所有节点。

我希望这些指示会有所帮助。我还推荐优秀的Selenium Locator Rosetta Stone ( PDF ) 作为如何构建 XPaths 的参考。

于 2012-10-10T14:12:40.763 回答