如何根据我使用的浏览器执行不同的操作?

时间:2013-11-29 04:27:30

标签: ruby cucumber watir watir-webdriver

我正在使用Chrome Firefox和IE中的Watir进行测试。在Chrome和Firefox中,mouseover事件可以解决问题,但在IE中我必须使用悬停。代码工作正如我在所有三个浏览器的if语句之外测试的那样。我似乎无法得到这个if语句正常工作。有什么想法吗?

if @browser.name == 'firefox' or 'chrome'
  @browser.span(:text => /#{tab_name}/i).parent.fire_event 'mouseover'
else
  @browser.span(:text => /#{tab_name}/i).parent.hover
end

@browser.name使用puts验证后正确返回。

谢谢, 亚当

2 个答案:

答案 0 :(得分:1)

我认为你遇到的问题是它总是执行if部分而不是else部分。您的问题可以简化为:

browser = 'ie'
if browser == 'firefox' or 'chrome'
  puts 'mouseover'
else
  puts 'hover'
end
#=> "mouseover" (which is not as desired)

问题是你的if语句说(浏览器需要等于“firefox”)或者(字符串“chrome”必须是真的)。后者将永远为真,这就是为什么你总是得到if部分执行。

你需要这样做:

browser = 'ie'
if browser == 'firefox' or browser == 'chrome'
  puts 'mouseover'
else
  puts 'hover'
end
#=> "hover" (as desired)

它也可以更好地写成:

browser = 'ie'
if ['firefox', 'chrome'].include?(browser)
  puts 'mouseover'
else
  puts 'hover'
end
#=> "hover" (as desired)

还有第二个问题 - @browser.name永远不会是'firefox'或'chrome'。 Browser#name返回符号而不是字符串。例如,使用Firefox:

require 'watir'
browser = Watir::Browser.new :firefox
puts browser.name.class
#=> Symbol
p browser.name
#=> :firefox

您需要将@browser.name与相应的符号相匹配 - :firefox:chrome

因此,采用这两个概念并回到原始代码,可以通过以下方法修复:

if [:firefox, :chrome].include?(@browser.name)
  @browser.span(:text => /#{tab_name}/i).parent.fire_event 'mouseover'
else
  @browser.span(:text => /#{tab_name}/i).parent.hover
end

答案 1 :(得分:0)

我想出了一个临时解决方案。我正在捕获webdriver的异常,并使用其他代码行进行抢救:

begin
  @browser.span(:text => /#{tab_name}/i).parent.hover
rescue Selenium::WebDriver::Error::InvalidElementStateError
  @browser.span(:text => /#{tab_name}/i).parent.fire_event 'mouseover'
end

我仍然不确定为什么原始代码不起作用。