7

亲爱的 Selenium Webdriver 专家,

我想知道 Selenium Webdriver 中的字符串匹配方法是否与 Java 中的以下代码片段一起正常工作:

if (property.findElements(By.xpath("./dl[@class='cN-featDetails']/dd[matches(class,'propertytype type-house']")).size() > 0 ) {    // line 229

下面是第 229 行正在读取的 xhtml 网页:

<dl class="cN-featDetails">
<dt class="proptype">Property type</dt>
<dd id="ctl00_ctl00_Content_Content_SrchResLst_rptResult_ctl01_EliteListingTemplate_ddPropertyType" class="propertytype type-house" title="Property type: House">House</dd>

但是,这导致了以下错误:

Address: 28B/171 Gloucester Street, Sydney
Exception in thread "main" org.openqa.selenium.InvalidSelectorException: The given selector ./dl[@class='cN-featDetails']/dd[matches(class,'propertytype type-house'] is either invalid or does not result in a WebElement. The following error occurred:
[InvalidSelectorError] Unable to locate an element with the xpath expression ./dl[@class='cN-featDetails']/dd[matches(class,'propertytype type-house'] because of the following error:
[Exception... "The expression is not a legal expression."  code: "51" nsresult: "0x805b0033 (NS_ERROR_DOM_INVALID_EXPRESSION_ERR)"  location: "

我也试过也matches(class,'propertytype.*$']")没有成功。

类的名称根据属性是房屋(type-house)还是公寓(type-apartment)而变化......

有关如何在匹配项中使用正则表达式来检查此属性类型元素中是否存在值/有效树节点的任何建议?

此代码段正在查找此 URL

我在 Windows XP 和 7 平台上使用 Selenium 2.25.0、Java 1.7.0_11。

您的建议将不胜感激。

4

1 回答 1

13

不幸的是,该matches()函数是 XPath 2.0 的一部分

WebDriver 使用仅支持 XPath 1.0的Wicked Good XPath库。

因此,您的 XPath 表达式是非法的,您应该重写它以仅使用XPath 1.0中的特性和函数。

我认为您可以简单地将matches()示例中的调用替换为contains(). 也就是说,通过 匹配类名并不是一个好习惯contains(),因为type-house也会匹配type-houses. 此外,如果您匹配propertytype type-house并且类碰巧以不同的顺序排列,它们将不会被匹配。XPath 对类和 CSS 中使用的空格分隔列表一无所知。有关这方面的更多讨论,请参见例如this

您应该真正使用 CSS 选择器:

dl.cN-featDetails > dd.propertytype.type-house
于 2013-06-08T16:05:15.023 回答