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

Watir element containing embedded parentheses reporting as not visible?, not present? and not exists?

Watir 报告实际可见的文本,如果我正在搜索的字符串包含括号则不可见,除非搜索字符串以括号开头和结尾。

我正在测试一个非 public 网页,其中包含(并显示)如下所示的字符串

Maintenance Configuration (2) database

使用包含搜索 "Maintenance Configuration (2) database"? return是真的。 (搜索一个不在页面上的字符串,returns false。)

但是,是否存在对 "Maintenance Configuration (2) database" 的搜索?还是现在? returns false 和可见?会导致崩溃。

但是,搜索 "Maintenance Configuration"、“(2)”或 "database" 使用 exists?, present?还是可见的?将 return 为真。

我的一个失败测试(错误)是

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

我也试过这个(也是 returned false)。

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

这里的变量似乎是字符串是否包含括号——除了如果 () 位于第一个和最后一个位置,我得到 true。

我很困惑。有什么想法吗?

编辑 #1 - 对 HTML 标记请求的响应。 我不能给你我正在测试的 HTML 标记,但我可以做得更好。我可以为您提供重现问题的简单 HTML 代码。

<html>
<head>
</head>
<body>
  <div>
    Hello world<br />
    foo bar(2) bletch<br />
  </div>
</body>
</html>

同样,我可以通过 .visible 看到 "Hello world"、"foo bar"、“(2)”和 "bletch"?试图用 .visible 查找 "foo bar(2) bletch"?导致崩溃。

够了吗?还是需要更多?

编辑#2。 (希望没有错别字,因为我做不到 copy/paste)

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。

括号导致了问题,因为它们最终会在正则表达式 (regexp) 中使用。括号有特殊含义,需要转义才能作为文字字符使用。

您可以在以下行中看到正则表达式用于文本定位器(正则表达式用“/”表示):

@browser.div(:text => /#{myString.gsub(/\s/, '\s')}/).present?

当文本 "foo bar(2) bletch" 被传递给方法时,由于 Regexp,Watir 实际上正在寻找一个 div 文本包含 "foo bar2 bletch"。括号不包含在搜索中,因为它们仅提供分组。

要从字面上匹配括号,需要对它们进行转义。你尝试用“\”来逃避它们是正确的。但是,您也没有对双引号字符串中的“\”进行转义。

请注意,当您在括号前添加反斜杠时,它实际上并没有更改双引号字符串。这是因为反斜杠被用作转义序列。

puts "foo bar\(2\) bletch"
#=> "foo bar(2) bletch"

您还需要使用另一个反斜杠转义字符串中的反斜杠:

puts "foo bar\(2\) bletch"
#=> "foo bar\(2\) bletch"

这将传递要在 Regexp 中使用的正确字符串。

或者,您可以使用单引号字符串删除其中一个转义序列:

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