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

Я провожу тестирование с помощью Watir в Chrome Firefox и IE. Как в Chrome, так и в Firefox событие наведения мыши делает свое дело, но в IE мне приходится использовать наведение. Код работает, поскольку я тестировал его вне оператора 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
Большое спасибо! Просто чтобы было ясно, хотя он каждый раз выполнял часть else. - 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