обнаружение типа объекта watir webdriver

Я новичок в Watir.

Я искал способ определить тип объекта, полученного подпрограммой, чтобы применить правильный метод. Конечный результат должен быть примерно таким:

sub clickOnElement (elementId, elementRef)
element= browser.(elementId.to_sym, elementRef)
case TypeOfElement (element)
   :link            element.click
   :radio           element.set
   :checkbox        element.set
   :list            ....
end
end

Мой вопрос касается фактической реализации TypeOfElement ().

Любое предложение или указатель приветствуются: заранее спасибо

Серджио


person sbos61    schedule 15.06.2012    source источник
comment
Просто из любопытства, зачем тебе это нужно? Обычно вы знаете, с каким типом элемента работаете, поэтому можете напрямую вызывать соответствующие методы.   -  person Justin Ko    schedule 22.06.2012


Ответы (1)


Вы можете выполнить оператор case на основе класса переменной элемента (после преобразования ее в ее подтип). Таким образом, вам не нужно реализовывать свой собственный метод TypeOfElement.

Что-то типа:

e = browser.element
case e.to_subtype
    when Watir::CheckBox
        e.set
    when Watir::Anchor #Link
        e.click
    else
        raise( e.class.to_s + ' not handled' )
end

Примечание:

  • browser.element возвращает первый элемент, который будет тегом HTML. Следовательно, в приведенном выше случае оператор вызовет исключение. Я предполагаю, что e будет чем-то более конкретным.
  • В начале оператора case это просто e.to_subtype вместо e.to_subtype.class (как описано в Как отловить класс Errno :: ECONNRESET в случае, когда?).
person Justin Ko    schedule 15.06.2012
comment
Спасибо, Джастин, это было бы идеально. К сожалению, когда я запускаю свой код следующим образом: e = $ browser.element case e when Watir :: Link .... when Watir :: Checkbox .... - person sbos61; 16.06.2012
comment
Попробуйте обновленный код. Исходный код неправильно использовал Watir вместо Watir-Webdriver. - person Justin Ko; 16.06.2012
comment
Да, это работает. Мне потребовалось некоторое время, чтобы проверить это в моей среде. Спасибо!! - person sbos61; 19.06.2012
comment
У меня есть два наблюдения: 1 - вам нужно повторно выбрать объект с правильным классом, чтобы применить правильное действие. 2- НЕ работает с кнопками. Это вызывает у меня исключение, говоря, что .to_subtype неприменимо. Я все еще расследую это. Предложение приветствуется. - person sbos61; 21.06.2012
comment
Для (1) я предполагаю, что это будет зависеть от того, какие методы вы выполняете с 'e'. Вы можете переместить .to_subtype в первую строку, а не использовать его в операторе case. Для (2) вроде нормально работает с кнопками - подтип должен быть Watir :: Button. - person Justin Ko; 22.06.2012
comment
Спасибо, Джастин. Я использую bit.ly/watir-webdriver-demo для проведения теста. Довольно странное поведение с кнопками. Во-первых, я могу найти кнопку с именем, используя (: name = ›submit), но если я ищу элемент с такими же критериями, я получаю исключение. Я постараюсь обойти это, но Watir-WD не выглядит очень надежным. - person sbos61; 23.06.2012
comment
Я бы не сказал, что Watir-Webdriver ненадежен. На основании комментариев в коде: name было намеренно исключено как спецификатор для элементов. При желании вы можете изменить код в lib / watir-webdriver / locators / element_locator.rb, чтобы включить: name в массив WD_FINDERS. По причине того, что это исключено, вам следует спросить одного из разработчиков watir. - person Justin Ko; 23.06.2012
comment
Ну, это не то, чего я ожидаю: если селектор можно применить к более конкретному объекту, почему бы не применить его к более общему? - person sbos61; 23.06.2012
comment
Я не верю, что атрибут name должен применяться ко всем типам элементов. Он даже кажется обесцененным в XHTML. Я по-прежнему считаю, что вам следует пересмотреть то, что вы пытаетесь сделать. У меня были лишь редкие случаи, когда использование browser.element имело смысл. - person Justin Ko; 23.06.2012