Как мога да извършвам различни действия в зависимост от браузъра, който използвам?

Извършвам тестване с Watir в Chrome Firefox и IE. И в Chrome, и в Firefox събитието mouseover върши работа, но в IE трябва да използвам hover. Кодът работи, тъй като го тествах извън оператора 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.

Благодаря, Адам


person Adam6806    schedule 29.11.2013    source източник


Отговори (2)


Предполагам, че проблемът, който виждате, е, че винаги изпълнява частта 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
person Justin Ko    schedule 29.11.2013
comment
Много благодаря! Само за да бъде ясно, въпреки че изпълняваше другата част всеки път. - person Adam6806; 29.11.2013
comment
Опитах решението, което предоставихте, като стартирах firefox и той все още изпълни блока else. - person Adam6806; 29.11.2013
comment
Опитайте актуализирания отговор. Проблемът е, че Browser#name връща символ, а не низ. - person Justin Ko; 29.11.2013
comment
Ще го пробвам, но изглежда, че връща низ в rdoc. Watir Rdoc за browser.name - person Adam6806; 29.11.2013
comment
Да, и аз видях това. Документите ще бъдат актуализирани в следващото издание (вижте Брой 231) - person Justin Ko; 29.11.2013

Измислих временно решение. Хващам изключението уебдрайвера и спасявам с другия ред код така:

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

Все още не съм сигурен защо оригиналният код не работи.

person Adam6806    schedule 29.11.2013