如何找到<g>?</g>等自定义标签

时间:2012-05-23 03:35:06

标签: watir-webdriver

我必须处理包含<g>标签的网页中的某些图形项目。我可以通过放入selenium webdriver来做这样的事情来找到它们:

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

watir webdriver的等价物是什么?

另外,我如何将这些selenium元素转换为watir元素?

我可以以某种方式在本地添加对<g>标记的支持吗?

2 个答案:

答案 0 :(得分:6)

解决方案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

答案 1 :(得分:1)

watir或watir-webdriver中不支持非标准HTML标记。部分原因是我们必须支持的可能标签名称列表是无穷无尽的。

如果您愿意,可以在自己的自定义标签中进行monkeypatch。从长远来看,如果您不得不经常处理这些自定义标签,那么就像Watir api支持的其他标准HTML元素一样,这可能是您最好的解决方案。

您可以在标记名称上使用CSS选择器,但这只有在您坚持使用元素对象时才有效,如Watir::Exception::MissingWayOfFindingObjectException: invalid attribute: :css中所述。如果你问我,哪种方式会让事情变得不那么可读和/或有用,但在这方面可能是一个快速而简单的解决方案,值得花费很少。

或者您可以使用.driver.wd方法在您需要watir不支持的内容时访问webdriver功能。 (但这也不太可读)