经典选择器和 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
下一句有什么区别?
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