【发布时间】:2013-01-23 16:41:48
【问题描述】:
在 PHP 单元(使用 Selenium 服务器)中,我正在尝试检查 xpath 中的特定元素节点是否具有某个字符串值,例如
<table>
<thead></thead>
<tbody>
<tr>
<th>1</th>
<td>value 1</td>
<td>value 2</td>
<td>value c</td>
</tr>
<tr>
<th>2</th>
<td> </td>
<td> </td>
<td> </td>
</tr>
</tbody>
上面的代码,使用xpath
isElementPresent('//table/tbody/tr[last()-0]/td[last()-1]');
它会返回 true,如果我将 tr[last()-0] 更改为 tr[last()-1] 它仍然会返回 true,
自然地,isElementPresent 将与循环中生成的 xpath 一起循环(用整数替换 $i 和 $j,它们在 for() 循环中使用),因为它是,没关系,但是,我要检查的是里面什么都没有
如果我更改 xpath,则使用上面相同的 html 代码
isElementPresent('//table/tbody/tr[last()-$i]/td[last()-1 and text()="${nbsp}"]');
您会认为它会在 //table/tbody/tr[last()-0]/td[last()-1 and text()="${nbsp}"] 返回 true,在 //table/tbody/tr[last()-1]/td[last()-1 and text()="${nbsp}"] 返回 false,但这是关键
使用 Selenium IDE 1.10.0 Plugin for Firefox 来检查 xpath,方法是将其放入 Target Box 并点击 find(以检查它是否会在应该找到 xpath 时,//table/tbody/tr[last()-0]/td[last()-1 and text()="${nbsp}"] 不会突出显示倒数第二个 @最后一个tr中的987654334@,它突出显示最后一个tr中的第一个td,好像xpath是//table/tbody/tr[last()-0]/td[last()-2]
从我的实验来看,它似乎将 xapth 视为 //table/tbody/tr[last()-0]/td[text()="${nbsp}"],这只是第一个文本是空格的实例,如果第二个 tr 像这样就不好了
<tr>
<th>2</th>
<td>cows are my friends</td>
<td>let's go to my room pig!</td>
<td> </td>
</tr>
而我要使用isElementPresent('//table/tbody/tr[last()-0]/td[last()-1 and text()="${nbsp}"]');,它仍然会返回true,因为它不是查看last()-1,而是查看last()-0
所以我的问题是,如何检查特定元素节点是否具有特定字符串
注意 1:我在此页面上使用 last()-# http://www.w3schools.com/xpath/xpath_syntax.asp 它说 IE5,后来说 [0] 不是第一个,也不是 [1] 像 Firefox 或 Chrome,这在某种意义上是有道理的,因为这就是数组的索引有效,为了完全兼容,我从最后一个节点开始并向后工作,last() 将适用于 IE5 及更高版本,尽管节点应该相同,但向后移动的逻辑应该是相同的(除非微软想要重新定义该逻辑)
注意 2:我很清楚,一个简单的解决方法是向表格添加标题或 id 属性,但是我正在测试的页面是由其他人完成的,我想避免修改页面只是为了适合测试用例
注意 3:我正在测试的表是使用 JSON 字符串填充的,所以我的测试是当表没有数据时,它是否为空白,如果不是,那么 JSON 字符串在它向表中添加数据时不应该
编辑 1:似乎 ${nbsp} 在 php 中不起作用,仅在 Selenium IDE 1.10.0 插件中似乎可以识别它,但是通过按住 Alt 并输入 0160 插入空格也可以正常工作
编辑 2:目前我已将 id 属性添加到标签以使其正常工作,并且通过检查 @id=[VALUE] 和 text()=[VALUE] 可以很好地工作,但它仍然会很好得到这个问题的答案,因为当我向我的所有 html 标签添加 id、title 和/或 class 属性时,最初制作我正在测试的表格的人显然没有,正如我在注释 2 中所说,'我想避免修改页面只是为了适应测试用例'
【问题讨论】:
-
我会看看 Chrome 的开发者工具是否返回同样的问题。您可以通过运行
$x("XPathQueryHere")在Chrome 的开发者控制台中运行XPath 查询……如果您运行它,它会返回任何内容吗?想知道是 Selenium 的解析器还是实际的 XPath 有问题。 -
@Arran 我是在 Chrome 中完成的,必须将 ${nbsp} 更改为当您按住 Alt 并键入 0160 以创建空间时插入的空间(但这也适用于 Firefox)并且它是与 Firefox 稍有相同,当我将鼠标悬停在结果上时,它不是我想要的完全匹配,而且它似乎时不时地不断变化。我想如果我可以让 xpath 在 Selenium IDE 1.10.0 插件中工作,那么它可以在其他浏览器中工作(我不知道 Chrome 的开发者控制台),因为我在 IDE 中使用的只是查找功能基于 xpath 的元素
-
@Arran 我的错误,它看起来是随机切换的,因为 Chrome 返回了所有结果,而且它似乎是随机的,因为我将鼠标悬停在哪里,但是它返回了与 @987654347 匹配的所有字段@仅部分
标签: php html xpath selenium phpunit