Skip to content

Instantly share code, notes, and snippets.

@bootstraponline
Created May 7, 2014 15:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bootstraponline/a243eb4aaca2c92f0f15 to your computer and use it in GitHub Desktop.
Save bootstraponline/a243eb4aaca2c92f0f15 to your computer and use it in GitHub Desktop.
=begin
info: [UIAUTOMATOR STDOUT] ~~~~~~~~~~~~~~~~~ using indexPath: /0/0/0/0/2
info: [UIAUTOMATOR STDOUT] ~~~~~~~~~~~~~~~~~ before size: 6
info: [UIAUTOMATOR STDOUT] ~~~~~~~~~~~~~~~~~ after size: 6
info: [UIAUTOMATOR STDOUT] ~~~~~~~~~~~~~~~~~ index: 0
info: [UIAUTOMATOR STDOUT] ~~~~~~~~~~~~~~~~~ index: 0
info: [UIAUTOMATOR STDOUT] ~~~~~~~~~~~~~~~~~ index: 0
info: [UIAUTOMATOR STDOUT] ~~~~~~~~~~~~~~~~~ index: 0
info: [UIAUTOMATOR STDOUT] ~~~~~~~~~~~~~~~~~ index: 0
info: [UIAUTOMATOR STDOUT] ~~~~~~~~~~~~~~~~~ index: 2
> xpath('//android.widget.TextView').tag_name
"android.widget.Button"
=end
require 'rubygems'
require 'nokogiri'
def element_to_index_path element, result=[]
return result.join('/') if element.is_a? Nokogiri::XML::Document
parent = element.parent
index = parent ? parent.element_children.index(element) : nil
return result.join('/') unless index
result.unshift(index) # add to top
element_to_index_path parent, result
end
def index_path_to_element path, xml
# xml.element_children[0].element_children[0] etc.
paths = path.split('/')
element = xml
paths.each do |path|
element = element.element_children[path.to_i]
end
element
end
xml = "<?xml version='1.0' encoding='UTF-8' standalone='yes'?><hierarchy rotation=\"0\"><android.widget.FrameLayout index=\"0\" text=\"\" resource-id=\"\" class=\"android.widget.FrameLayout\" package=\"com.litl.FireDrill\" content-desc=\"\" checkable=\"false\" checked=\"false\" clickable=\"false\" enabled=\"true\" focusable=\"false\" focused=\"false\" scrollable=\"false\" long-clickable=\"false\" password=\"false\" selected=\"false\" bounds=\"[0,0][1200,1824]\"><android.view.View index=\"0\" text=\"\" resource-id=\"android:id/action_bar_overlay_layout\" class=\"android.view.View\" package=\"com.litl.FireDrill\" content-desc=\"\" checkable=\"false\" checked=\"false\" clickable=\"false\" enabled=\"true\" focusable=\"false\" focused=\"false\" scrollable=\"false\" long-clickable=\"false\" password=\"false\" selected=\"false\" bounds=\"[0,0][1200,1824]\"><android.widget.FrameLayout index=\"0\" text=\"\" resource-id=\"android:id/content\" class=\"android.widget.FrameLayout\" package=\"com.litl.FireDrill\" content-desc=\"\" checkable=\"false\" checked=\"false\" clickable=\"false\" enabled=\"true\" focusable=\"false\" focused=\"false\" scrollable=\"false\" long-clickable=\"false\" password=\"false\" selected=\"false\" bounds=\"[0,50][1200,1824]\"><android.widget.RelativeLayout index=\"0\" text=\"\" resource-id=\"\" class=\"android.widget.RelativeLayout\" package=\"com.litl.FireDrill\" content-desc=\"\" checkable=\"false\" checked=\"false\" clickable=\"false\" enabled=\"true\" focusable=\"false\" focused=\"false\" scrollable=\"false\" long-clickable=\"false\" password=\"false\" selected=\"false\" bounds=\"[0,50][1200,1824]\"><android.widget.Button index=\"0\" text=\"Sign In\" resource-id=\"com.litl.FireDrill:id/sign_in_button\" class=\"android.widget.Button\" package=\"com.litl.FireDrill\" content-desc=\"Sign In\" checkable=\"false\" checked=\"false\" clickable=\"true\" enabled=\"true\" focusable=\"true\" focused=\"false\" scrollable=\"false\" long-clickable=\"false\" password=\"false\" selected=\"false\" bounds=\"[1032,50][1176,146]\"/><android.widget.RelativeLayout index=\"1\" text=\"\" resource-id=\"\" class=\"android.widget.RelativeLayout\" package=\"com.litl.FireDrill\" content-desc=\"\" checkable=\"false\" checked=\"false\" clickable=\"true\" enabled=\"true\" focusable=\"false\" focused=\"false\" scrollable=\"false\" long-clickable=\"false\" password=\"false\" selected=\"false\" bounds=\"[131,304][1068,1569]\"><android.widget.LinearLayout index=\"0\" text=\"\" resource-id=\"\" class=\"android.widget.LinearLayout\" package=\"com.litl.FireDrill\" content-desc=\"\" checkable=\"false\" checked=\"false\" clickable=\"false\" enabled=\"true\" focusable=\"false\" focused=\"false\" scrollable=\"false\" long-clickable=\"false\" password=\"false\" selected=\"false\" bounds=\"[329,713][869,1159]\"><android.widget.ImageView index=\"0\" text=\"\" resource-id=\"\" class=\"android.widget.ImageView\" package=\"com.litl.FireDrill\" content-desc=\"\" checkable=\"false\" checked=\"false\" clickable=\"false\" enabled=\"true\" focusable=\"false\" focused=\"false\" scrollable=\"false\" long-clickable=\"false\" password=\"false\" selected=\"false\" bounds=\"[444,713][753,924]\"/><android.widget.ImageView index=\"1\" text=\"\" resource-id=\"\" class=\"android.widget.ImageView\" package=\"com.litl.FireDrill\" content-desc=\"\" checkable=\"false\" checked=\"false\" clickable=\"false\" enabled=\"true\" focusable=\"false\" focused=\"false\" scrollable=\"false\" long-clickable=\"false\" password=\"false\" selected=\"false\" bounds=\"[545,974][652,995]\"/><android.widget.Button index=\"2\" text=\"Get Started\" resource-id=\"com.litl.FireDrill:id/get_started_button\" class=\"android.widget.Button\" package=\"com.litl.FireDrill\" content-desc=\"Get Started\" checkable=\"false\" checked=\"false\" clickable=\"true\" enabled=\"true\" focusable=\"true\" focused=\"false\" scrollable=\"false\" long-clickable=\"false\" password=\"false\" selected=\"false\" bounds=\"[329,1045][869,1159]\"/></android.widget.LinearLayout></android.widget.RelativeLayout><android.widget.TextView index=\"2\" text=\"By continuing, you agree to the Terms of Use.\" resource-id=\"com.litl.FireDrill:id/eula\" class=\"android.widget.TextView\" package=\"com.litl.FireDrill\" content-desc=\"\" checkable=\"false\" checked=\"false\" clickable=\"true\" enabled=\"true\" focusable=\"true\" focused=\"false\" scrollable=\"false\" long-clickable=\"true\" password=\"false\" selected=\"false\" bounds=\"[314,1778][886,1824]\"/></android.widget.RelativeLayout></android.widget.FrameLayout></android.view.View></android.widget.FrameLayout></hierarchy>"
xml = Nokogiri::XML(xml)
element = xml.xpath('//android.widget.TextView')[0]
index_path = element_to_index_path(element)
# index path: 0/0/0/0/0/2
puts "index path: #{index_path}"
found_element = index_path_to_element index_path, xml
puts %Q(found element: "#{found_element.name}" with text: "#{found_element.attr(:text)}")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment