Watir报告实际可见的文字,如果我搜索的字符串包含括号,则不可见,除非搜索字符串以括号开头和结尾。
我正在测试一个非公共网页,其中包含(并显示)一个看起来像这样的字符串
Maintenance Configuration (2) database
搜索"维护配置(2)数据库"使用包括?返回true。 (搜索不在页面上的字符串,返回false。)
然而,搜索"维护配置(2)数据库"使用存在?还是在场?返回false并且可见?会导致崩溃。
但是,搜索"维护配置","(2)"或"数据库"使用存在?,存在?还是看得见?将返回true。
我的失败测试之一(错误)是
text = "Maintenance Configuration (2) database"
puts "present?: " + @browser.div(:text => text).present?.to_s
我的一次通过测试(真实)是
text = "Maintenance Configuration"
puts "present?: " + @browser.div(:text => text).present?.to_s
我也尝试了这个(也返回了假)。
text = "Maintenance Configuration \(2\) database"
puts "present?: " + @browser.div(:text => text).present?.to_s
另外,我出于绝望而尝试了这些
text = "Maintenance\sConfiguration\s(2)\sdatabase" # => false
text = "Maintenance\sConfiguration\s\(2\)\sdatabase" # => false
text = "(2)" # => true
text = " (2)" # => false
text = "(2) " # => false
这里的变量似乎是字符串是否包含括号 - 除了如果()位于第一个和最后一个位置,我得到了真。
我很困惑。有什么想法吗?编辑#1 - 对HTML标记请求的响应。 我不允许向您提供我正在测试的HTML标记,但我可以做得更好。我可以给你简单的HTML代码来重现问题。
<html>
<head>
</head>
<body>
<div>
Hello world<br />
foo bar(2) bletch<br />
</div>
</body>
</html>
再次,我可以看到&#34; Hello world&#34;,&#34; foo bar&#34;,&#34;(2)&#34;和&#34; bletch&#34;用.visible?试图找到&#34; foo bar(2)bletch&#34;用.visible?导致崩溃。
这还够,还是需要更多东西?
编辑#2。 (希望没有错字,因为我无法复制/粘贴)
def tester(myString)
puts ( "Testing: #{myString}" )
puts ( @browser.div(:text => /#{myString.gsub(/\s/, '\s')}/).present? )
end
when /^I test Watir$/ do
@browser.goto("file:///vagrant/test/stack.html")
Watir::Wait.until(5) { @browser.text.include? "Hello" }
tester ( "Hello world" )
tester ( "foo bar" )
tester ( "(2)" )
tester ( " bletch" )
tester ( "foo bar(2) bletch" )
end
前4个打印为true,最后一个打印为false。
答案 0 :(得分:0)
括号引起问题,因为它们最终会在正则表达式(regexp)中使用。括号具有特殊含义,需要转义才能用作文字字符。
您可以在以下行中看到正则表达式用于文本定位器(正则表达式用&#34; /&#34表示):
@browser.div(:text => /#{myString.gsub(/\s/, '\s')}/).present?
当文字&#34; foo bar(2)bletch&#34;传递给方法,由于Regexp,Watir实际上正在寻找一个包含&#34; foo bar2 bletch&#34;的文本的div。括号不包括在搜索中,因为它们只提供分组。
要完全匹配括号,需要对其进行转义。你试图用&#34; \&#34;来逃避它们是正确的。但是,你并没有逃脱&#34; \&#34;在双引号字符串中。
请注意,在括号前添加反斜杠时,实际上并不会更改双引号String。这是因为反斜杠用作转义序列。
puts "foo bar\(2\) bletch"
#=> "foo bar(2) bletch"
您还需要使用另一个反斜杠来转义字符串中的反斜杠:
puts "foo bar\\(2\\) bletch"
#=> "foo bar\(2\) bletch"
这将传递正确的字符串以在Regexp中使用。
或者,您可以使用单引号String删除其中一个转义序列:
puts 'foo bar\(2\) bletch'
#=> "foo bar\(2\) bletch"
总而言之,您需要通过执行以下操作来转义特殊字符:
# Using double-quoted string:
tester ( "foo bar\\(2\\) bletch" )
# Using single-quoted string:
tester ( 'foo bar\(2\) bletch' )