经典选择器和 xpath 选择器的区别

Difference between classic and xpath selectors

下一句有什么区别?

frame.span(:text=>'Patient')
frame.span(:xpath=>".//span[text() = 'Patient']")

第一句很好用,但是第二句用xpath我找不到页面上的元素。

总结

区别在于 space 的规范化。

如果你设置 $DEBUG=true,你会看到 Watir 将 .span(:text=>'Patient') 转换成 XPath:

.//span[normalize-space()='Patient']

因此,当文本节点有leading/trailing白色space.

时会有不同的结果

例子

例如下面的HTML,就没有leading/trailing白space:

<span>Patient</span>

因此,两种方法 return 相同的结果:

p browser.span(:text=>'Patient').exists?
#=> true
p browser.span(:xpath=>".//span[text() = 'Patient']").exists?
#=> true

但是,如果我们添加一些额外的白色space:

<span>Patient </span>

我们看到 :xpath 定位器失败,因为它正在寻找恰好 "Patient" 而不是 "Patient " 的文本节点。相反,:text 定位器将忽略 leading/trailing whitespace.

p browser.span(:text=>'Patient').exists?
#=> true
p browser.span(:xpath=>".//span[text() = 'Patient']").exists?
#=> false