Как найти пользовательский тег, например ‹g›?

Мне приходится иметь дело с некоторыми графическими элементами на странице с тегами <g>. Я могу сделать что-то подобное, чтобы найти их, зайдя в selenium webdriver:

browser.wd.find_elements( :tag_name => "g" )

Что было бы эквивалентно watir webdriver?

Кроме того, как мне преобразовать эти элементы селена в элементы ватира?

Могу ли я как-то добавить поддержку тега <g> для локального просмотра?


person ibodog    schedule 23.05.2012    source источник


Ответы (2)


Решение 1. Эквивалент Watir-Webdriver:

Эквивалент того, что вы делали в selenium-webdriver:

browser.elements( :tag_name => "g" )

Таким образом, вы можете сделать что-то подобное, чтобы вывести текст каждого элемента:

browser.elements( :tag_name => "g" ).each do |x|
  puts g.text
end

Решение 2. Добавьте поддержку элемента G.

После запроса watir-webdriver добавьте следующий код:

module Watir
    module Container
        def g(*args)
            G.new(self, extract_selector(args).merge(:tag_name => "g"))
        end

        def gs(*args)
            GCollection.new(self, extract_selector(args).merge(:tag_name => "g"))
        end         
    end

    class G < Element
    end

    class GCollection < ElementCollection
        def element_class
            G
        end
    end
end

Затем вы можете относиться к 'g' как к любому другому элементу. Например:

puts browser.g(:index, 0).text
browser.gs.each{ |x| puts x.text }

Классы G и GCollection будут поддерживать все стандартные методы элементов. Вы можете добавить к классу дополнительные методы, если есть вещи, специфичные для этого элемента.

Обновление – пример добавления пользовательских методов:

Чтобы получить стиль курсора, вы должны добавить метод к классу G следующим образом:

class G < Element
    def cursor_style()
        assert_exists
        return @element.style("cursor")
    end
end

Это позволит вам получить свойство курсора следующим образом:

puts browser.g(:index, 0).cursor_style
#=> move

Любые пользовательские методы, которые взаимодействуют с элементом, должны начинаться с assert_exists. Затем внутри метода вы можете работать с элементом, используя переменную @element.

Обратите внимание, что поскольку элемент G наследуется от класса Element, вы также можете использовать встроенный метод стиля:

puts browser.g(:index, 0).style("cursor")
#=> move
person Justin Ko    schedule 23.05.2012
comment
Спасибо за прогулку - это сработало отлично. Как будет выглядеть дополнительный метод класса? Скажем, найти такое свойство, как <g style="cusror: move;">? - person ibodog; 24.05.2012
comment
Я добавил пример для добавления пользовательского метода в соответствии с вашим запросом. - person Justin Ko; 24.05.2012

В watir или watir-webdriver не поддерживаются нестандартные теги HTML. Отчасти потому, что список возможных имен тегов, которые нам придется поддерживать, бесконечен.

Вы можете добавить свои собственные теги, если хотите. В долгосрочной перспективе, если вам придется много иметь дело с этими пользовательскими тегами, это может быть вашим лучшим решением с точки зрения наличия вещей, которые действуют так же, как другие стандартные элементы HTML, поддерживаемые Watir API.

Вы можете использовать селектор CSS для имени тега, но это работает, только если вы придерживаетесь объектов-элементов, как описано в Watir::Exception: :MissingWayOfFindingObjectException: недопустимый атрибут: :css. Что делает вещи немного менее читабельными и/или полезными, если вы спросите меня, но может быть быстрым и простым решением, которое стоит небольших затрат в этом отношении.

Или вы можете использовать методы .driver или .wd для доступа к функциям веб-драйвера, когда они вам нужны для чего-то, что не поддерживается watir. (но это тоже не так читабельно)

person Chuck van der Linden    schedule 23.05.2012