我不得不处理页面中带有<g>
标签的一些图形项目。我可以通过放入 selenium webdriver 来做这样的事情来找到它们:
browser.wd.find_elements( :tag_name => "g" )
watir webdriver 的等价物是什么?
另外,我如何将这些硒元素转换为 watir 元素?
我可以添加对<g>
标签的支持以某种方式在本地等待吗?
我不得不处理页面中带有<g>
标签的一些图形项目。我可以通过放入 selenium webdriver 来做这样的事情来找到它们:
browser.wd.find_elements( :tag_name => "g" )
watir webdriver 的等价物是什么?
另外,我如何将这些硒元素转换为 watir 元素?
我可以添加对<g>
标签的支持以某种方式在本地等待吗?
解决方案 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
watir 或 watir-webdriver 不支持非标准 HTML 标签。部分原因是我们必须支持的可能标签名称列表是无穷无尽的。
如果你愿意,你可以在你自己的自定义标签中进行猴子补丁。从长远来看,如果您将不得不大量处理这些自定义标签,那么这可能是您最好的解决方案,因为它的行为就像 Watir api 支持的其他标准 HTML 元素一样。
您可以在标签名称上使用 CSS 选择器,但这仅在您坚持元素对象时才有效,如Watir::Exception::MissingWayOfFindingObjectException: invalid attribute: :css中所述。如果您问我,哪种方式会使事情变得不那么可读和/或有用,但在这方面可能是一个快速而简单的解决方案,值得付出微薄的代价。
或者,当您需要 watir 不支持的东西时,您可以使用.driver
or方法来访问 webdriver 功能。.wd
(但这也不那么可读)