我是Ruby新手,我不太了解这里发生的事情,
此代码有效
chrome = Watir::Browser.new:chrome
firefox = Watir::Browser.new:firefox
ie = Watir::Browser.new:ie
browser_conf = {
"chrome" => chrome,
"firefox" => firefox,
"ie" => ie
}
但是以下代码会产生语法错误:
browser_conf = {
"chrome" => Watir::Browser.new:chrome,
"firefox" => Watir::Browser.new:firefox,
"ie" => Watir::Browser.new:ie
}
语法错误,意外'}',期待keyword_end }
为什么会这样?有没有办法可以隐式编写而不将它们分配给单独的变量?
答案 0 :(得分:6)
这里有一些稍微不正确的语法,在new
调用结束时有一个冒号(:)。例如。
chrome = Watir::Browser.new:chrome
这可能会混淆散列解析器,它可以使用冒号作为键/值分隔符,因为ruby 1.9。 E.g。
hash = {foo: 'bar'}
但是,无论周围环境如何,都可以强制要求对一段代码进行评估,方法是将其包装在括号中。您可能会发现此代码有效:
browser_conf = {
"chrome" => (Watir::Browser.new:chrome),
"firefox" => (Watir::Browser.new:firefox),
"ie" => (Watir::Browser.new:ie)
}
更新:我刚检查了Watir文档,我相信你正在调用new
。浏览器的符号是new
的参数。所以应该在空格之后,或在括号中。如果没有空格或括号,它并不总是能够将其解析为参数。
这是正确的代码:
browser_conf = {
"chrome" => Watir::Browser.new(:chrome),
"firefox" => Watir::Browser.new(:firefox),
"ie" => Watir::Browser.new(:ie)
}
答案 1 :(得分:4)
我认为这是问题
chrome = Watir::Browser.new:chrome
firefox = Watir::Browser.new:firefox
ie = Watir::Browser.new:ie
将其更改为(参数的paranthesis)
chrome = Watir::Browser.new(:chrome)
firefox = Watir::Browser.new(:firefox)
ie = Watir::Browser.new(:ie)
或(参数前的空格)
chrome = Watir::Browser.new :chrome
firefox = Watir::Browser.new :firefox
ie = Watir::Browser.new :ie
答案 2 :(得分:3)
传递没有括号的方法参数很容易变得模棱两可。以此哈希文字为例:
{ 1 => foo 2, 3 => 4 }
可以解释为:
{ 1 => foo(2, 3 => 4) }
或作为:
{
1 => foo(2),
3 => 4
}
此数组文字相同:
[foo 2, 3, 4]
那可能是:
[foo(2, 3, 4)]
[foo(2, 3), 4]
[foo(2), 3, 4]
当Ruby的解析器遇到这种歧义时,它通常会引发SyntaxError
。然后,您必须明确提供括号。
在你的情况下:
{ 'chrome' => Watir::Browser.new(:chrome) }
答案 3 :(得分:1)
您在浏览器名称参数前缺少空格。 给予paranthesis或空间。 或者动态地做它。 任何这些帖子都可以帮助你进行stackoverflow -
如果要通过命令行调用不同的环境,请转到 - link-one
对于要传递的Ruby符号,请参考 - link-two
否则,
与Watir vs Webdriver进行比较,请访问 - External Link
您需要对env.sh进行更改,并确保传递'browser-type'或等效变量,您可以在配置文件中引用该变量并实例化相应的变量。 希望它有所帮助!