亲爱的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行的当前节点是
我以前在XML文档上使用过XPath,但是想扩展在Webdriver 2中定位元素的能力。
任何帮助都会非常棒。
非常感谢,
杰克答案 0 :(得分:3)
考虑到Zarkonnen给出的答案,我将添加到(a)点
public boolean isElementPresent(By selector)
{
return driver.findElements(selector).size()>0;
}
这个方法用于验证页面上是否存在该元素。
您还可以使用isDisplayed()方法,该方法可以与isElement配对使用:
driver.findElement(By locator).isDisplayed()
返回您的来源: 假设我们要验证页面上是否存在“更多详细信息”链接。
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元素的定位器
通过这种方式,您可以自动获取元素的xPath。请参阅附带的屏幕。
答案 1 :(得分:1)
(a)&amp; (d):您可以使用|
XPath operator在同一表达式中指定两个备用路径。
(c):您不能在byTagName中使用XPath,但您可以use //
查找给定节点的任何后代。
(e):您可以使用XPath axes之类parent
和following-sibling
来选择与给定节点相关的所有节点。
我希望这些指针很有帮助。我还建议使用优秀的Selenium Locator Rosetta Stone(PDF)作为如何构造XPath的参考。