/* * Copyright 2012-2014 eBay Software Foundation and selendroid committers. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package io.selendroid.server.model.internal.execute_native; import android.view.View; import io.selendroid.server.ServerInstrumentation; import io.selendroid.server.android.KeySender; import io.selendroid.server.android.ViewHierarchyAnalyzer; import io.selendroid.server.model.AndroidNativeElement; import io.selendroid.server.model.KnownElements; import io.selendroid.server.model.Factories; import io.selendroid.server.util.Preconditions; import io.selendroid.server.util.SelendroidLogger; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * This class contains the functionality to find an Android view with the tag name assigned to it * sample usage : WebElement element = (WebElement)webDriver.executeScript("findElementByAndroidTag", "view_test_tag"); * @deprecated Please use new implemented extension mechanism * @see <a href="https://github.com/selendroid/selendroid-extension">extension mechanism Docu</a> */ public class FindElementByAndroidTag implements NativeExecuteScript { private ServerInstrumentation serverInstrumentation; private KeySender keys; protected ViewHierarchyAnalyzer viewAnalyzer; private KnownElements knownElements; public FindElementByAndroidTag( KnownElements knownElements, ServerInstrumentation serverInstrumentation, KeySender keys) { this.serverInstrumentation = serverInstrumentation; this.keys = keys; this.knownElements = knownElements; this.viewAnalyzer = ViewHierarchyAnalyzer.getDefaultInstance(); } @Override public Object executeScript(JSONArray args) { String tagName; JSONObject result = new JSONObject(); try { tagName = args.getString(0); Collection<View> currentViews = viewAnalyzer.getViews(getTopLevelViews()); for (View view : currentViews) { Object tag = view.getTag(); if (tag!=null && tag.toString().equalsIgnoreCase(tagName)) { AndroidNativeElement element = newAndroidElement(view); result.put("ELEMENT", knownElements.getIdOfElement(element)); } } } catch (JSONException e) { SelendroidLogger.error("Cannot execute script", e); } return result; } private AndroidNativeElement newAndroidElement(View view) { Preconditions.checkNotNull(view); if (knownElements.hasElement(new Long(view.getId()))) { AndroidNativeElement element = (AndroidNativeElement) knownElements.get(new Long(view.getId())); if (element.getView().equals(view)) { return element; } } AndroidNativeElement e = Factories.getAndroidNativeElementFactory() .createAndroidNativeElement(view, serverInstrumentation, keys, knownElements); knownElements.add(e); return e; } protected List<View> getTopLevelViews() { List<View> views = new ArrayList<View>(); views.addAll(viewAnalyzer.getTopLevelViews()); if (serverInstrumentation.getCurrentActivity() != null && serverInstrumentation.getCurrentActivity().getCurrentFocus() != null) { views.add(serverInstrumentation.getCurrentActivity().getCurrentFocus()); } return views; } }