Android get view hierarchy for all windows in activity

I am doing SKD for automation. Therefore, my needs are slightly different from normal application development.

Requirement : Get ViewHierarchy of current activity. Problem : I understood correctly when Spinner is not open. I do not get spinner details when it is open.

I use the following code to get the hierarchy. Questions : Does Spinner work in another window, and why am I not getting it? What will be the way to get it?

//This is how I start recursion to get view hierarchy View view = getWindow().getDecorView().getRootView(); if (view instanceof ViewGroup) { ViewGroup group = (ViewGroup) view; dumpViewHierarchyWithProperties( group, 0); } //Functions to get hierarchy private void dumpViewHierarchyWithProperties(ViewGroup group,int level) { if (!dumpViewWithProperties(group, level)) { return; } final int count = group.getChildCount(); for (int i = 0; i < count; i++) { final View view = group.getChildAt(i); if (view instanceof ViewGroup) { dumpViewHierarchyWithProperties((ViewGroup) view, level + 1); } else { dumpViewWithProperties(view, level + 1); } } } private boolean dumpViewWithProperties(View view,int level) { //Add to view Hierarchy. return true; } 
+6
source share
1 answer

I managed to get an open hierarchy of viewing pop-ups using parts of your code in addition to some other reflection magic, here is the full code, keep in mind that reflection will affect the performance of your SDK and applications that use it.

 //Function to get all available windows of the application using reflection private void logRootViews() { try { Class wmgClass = Class.forName("android.view.WindowManagerGlobal"); Object wmgInstnace = wmgClass.getMethod("getInstance").invoke(null, (Object[])null); Method getViewRootNames = wmgClass.getMethod("getViewRootNames"); Method getRootView = wmgClass.getMethod("getRootView", String.class); String[] rootViewNames = (String[])getViewRootNames.invoke(wmgInstnace, (Object[])null); for(String viewName : rootViewNames) { View rootView = (View)getRootView.invoke(wmgInstnace, viewName); Log.i(TAG, "Found root view: " + viewName + ": " + rootView); getViewHierarchy(rootView); } } catch (Exception e) { e.printStackTrace(); } } //Functions to get hierarchy private void getViewHierarchy(View view) { //This is how I start recursion to get view hierarchy if (view instanceof ViewGroup) { ViewGroup group = (ViewGroup) view; dumpViewHierarchyWithProperties(group, 0); } else { dumpViewWithProperties(view, 0); } } private void dumpViewHierarchyWithProperties(ViewGroup group, int level) { if (!dumpViewWithProperties(group, level)) { return; } final int count = group.getChildCount(); for (int i = 0; i < count; i++) { final View view = group.getChildAt(i); if (view instanceof ViewGroup) { dumpViewHierarchyWithProperties((ViewGroup) view, level + 1); } else { dumpViewWithProperties(view, level + 1); } } } private boolean dumpViewWithProperties(View view, int level) { //Add to view Hierarchy. if (view instanceof TextView) { Log.d(TAG, "TextView from hierarchy dumped: " + view.toString() + " with text: " + ((TextView) view).getText().toString() + " ,in Level: " + level); } else { Log.d(TAG, "View from hierarchy dumped: " + view.toString() + " ,in Level: " + level); } return true; } 
+1
source

All Articles