包含嵌入括号的Watir元素报告为不可见?,不存在?而不存在?

时间:2015-06-01 16:42:15

标签: watir-webdriver

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。

1 个答案:

答案 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' )