Commit bf41ac2d authored by Administrator's avatar Administrator

增加view是否显示的attribute,修复contains函数可能的NPE,增加轴函数precedingSeblingOne,修复滑动控制逻辑有误的问题

parent 14f13766
......@@ -17,6 +17,7 @@ public class SuperAppium {
public static final String selected = "selected";
public static final String index = "index";
public static final String hash = "hash";
public static final String visible = "visible";
public static String TAG = "SuperAppium";
}
......@@ -4,10 +4,13 @@ import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.SystemClock;
import android.util.Log;
import android.view.MotionEvent;
import java.lang.ref.WeakReference;
import static android.view.MotionEvent.TOOL_TYPE_FINGER;
/**
* <pre>
* author : xiaweizi
......@@ -25,7 +28,7 @@ public class SwipeUtils {
public static final int NORMAL = 100;
public static final int LOW = 1000;
private static final long DEFAULT_DURATION = 1500;
private static final long DEFAULT_DURATION = 1000;
/**
* 模拟手势滑动
......@@ -92,8 +95,14 @@ public class SwipeUtils {
dealSimulateScroll(activity, startX, startY, endX, endY, duration, period);
}
private static boolean isScrolling = false;
private static void dealSimulateScroll(ViewImage object, float startX, float startY, float endX, float endY, long duration, int period) {
long downTime = SystemClock.uptimeMillis();
if (isScrolling) {
Log.i(SuperAppium.TAG, "score task is running..");
return;
}
isScrolling = true;
Handler handler = new ViewHandler(object);
//重置相对偏移
......@@ -106,12 +115,32 @@ public class SwipeUtils {
startY -= loca[1];
endY -= loca[1];
object.dispatchInputEvent(MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_DOWN, startX, startY, 0));
object.dispatchPointerEvent(genFingerEvent(MotionEvent.ACTION_DOWN, startX, startY));
GestureBean bean = new GestureBean(startX, startY, endX, endY, duration, period);
Message.obtain(handler, 1, bean).sendToTarget();
}
private static MotionEvent genFingerEvent(int action, float x, float y) {
long downTime = SystemClock.uptimeMillis();
long eventTime = SystemClock.uptimeMillis();
MotionEvent.PointerCoords pointerCoords = new MotionEvent.PointerCoords();
pointerCoords.x = x;
pointerCoords.y = y;
MotionEvent.PointerProperties pointerProperties = new MotionEvent.PointerProperties();
pointerProperties.id = 0;
pointerProperties.toolType = TOOL_TYPE_FINGER;
MotionEvent.PointerProperties[] pointerPropertiesArray = new MotionEvent.PointerProperties[]{pointerProperties};
MotionEvent.PointerCoords[] pointerCoordsArray = new MotionEvent.PointerCoords[]{pointerCoords};
return MotionEvent.obtain(
downTime, eventTime, action,
1, pointerPropertiesArray, pointerCoordsArray,
0, 0, 0, 0, 4, 0, 0x1002, 0);
}
static class ViewHandler extends Handler {
WeakReference<ViewImage> mView;
......@@ -126,13 +155,20 @@ public class SwipeUtils {
if (theView == null) {
return;
}
long downTime = SystemClock.uptimeMillis();
GestureBean bean = (GestureBean) msg.obj;
long count = bean.count;
if (count >= bean.totalCount) {
theView.dispatchInputEvent(MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_UP, bean.endX, bean.endY, 0));
Log.i(SuperAppium.TAG, "dispatch MotionEvent.ACTION_UP...");
theView.dispatchInputEvent(genFingerEvent(MotionEvent.ACTION_UP, bean.endX, bean.endY));
isScrolling = false;
} else {
theView.dispatchInputEvent(MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_MOVE, bean.startX + bean.ratioX * count, bean.startY + bean.ratioY * count, 0));
Log.i(SuperAppium.TAG, "dispatch MotionEvent.ACTION_MOVE. now count: " + count + " totalCount: "
+ bean.totalCount + " x: "
+ (bean.startX + bean.ratioX * count)
+ " y: " + (bean.startY + bean.ratioY * count)
);
theView.dispatchPointerEvent(genFingerEvent(MotionEvent.ACTION_MOVE, bean.startX + bean.ratioX * count, bean.startY + bean.ratioY * count));
bean.count++;
Message message = new Message();
message.obj = bean;
......
......@@ -333,6 +333,11 @@ public class ViewImage {
return true;
}
public boolean dispatchPointerEvent(MotionEvent inputEvent) {
View rootView = rootViewImage().getOriginView();
return rootView.dispatchTouchEvent(inputEvent);
}
@SuppressLint("NewApi")
private boolean clickV2() {
float[] floats = measureClickPoint();
......@@ -357,6 +362,7 @@ public class ViewImage {
@SuppressLint("NewApi")
public void swipeDown(int height) {
int[] locs = new int[2];
originView.getLocationOnScreen(locs);
......@@ -373,10 +379,6 @@ public class ViewImage {
}
@SuppressLint("NewApi")
public static void main(String[] args) {
System.out.println((ThreadLocalRandom.current().nextDouble(0.4) - 0.2));
}
private MotionEvent genMotionEvent(int action, float[] point) {
long downTime = SystemClock.uptimeMillis();
......
......@@ -18,6 +18,7 @@ import com.virjar.ratel.api.extension.superappium.xmodel.view.IndexGetter;
import com.virjar.ratel.api.extension.superappium.xmodel.view.LongClickableValueGetter;
import com.virjar.ratel.api.extension.superappium.xmodel.view.PackageNameValueGetter;
import com.virjar.ratel.api.extension.superappium.xmodel.view.SelectedValueGetter;
import com.virjar.ratel.api.extension.superappium.xmodel.view.VisibleValueGetter;
import java.util.ArrayList;
import java.util.HashMap;
......@@ -42,6 +43,7 @@ public class ValueGetters {
valueGetters.add(new ClickableValueGetter());
valueGetters.add(new ContentDescriptionValueGetter());
valueGetters.add(new EnabledValueGetter());
valueGetters.add(new VisibleValueGetter());
valueGetters.add(new FocusableValueGetter());
valueGetters.add(new LongClickableValueGetter());
valueGetters.add(new PackageNameValueGetter());
......
package com.virjar.ratel.api.extension.superappium.xmodel.view;
import android.graphics.Rect;
import com.virjar.ratel.api.extension.superappium.SuperAppium;
import com.virjar.ratel.api.extension.superappium.ViewImage;
import com.virjar.ratel.api.extension.superappium.xmodel.ValueGetter;
public class VisibleValueGetter implements ValueGetter<Boolean> {
@Override
public Boolean get(ViewImage viewImage) {
return viewImage.getOriginView().getLocalVisibleRect(new Rect());
}
@Override
public boolean support(Class type) {
return true;
}
@Override
public String attr() {
return SuperAppium.visible;
}
}
......@@ -13,6 +13,7 @@ import com.virjar.ratel.api.extension.superappium.xpath.function.axis.FollowingS
import com.virjar.ratel.api.extension.superappium.xpath.function.axis.FollowingSiblingOneFunction;
import com.virjar.ratel.api.extension.superappium.xpath.function.axis.ParentFunction;
import com.virjar.ratel.api.extension.superappium.xpath.function.axis.PrecedingSiblingFunction;
import com.virjar.ratel.api.extension.superappium.xpath.function.axis.PrecedingSiblingOneFunction;
import com.virjar.ratel.api.extension.superappium.xpath.function.axis.SiblingFunction;
import com.virjar.ratel.api.extension.superappium.xpath.function.filter.AbsFunction;
import com.virjar.ratel.api.extension.superappium.xpath.function.filter.BooleanFunction;
......@@ -136,6 +137,7 @@ public class FunctionEnv {
registerAxisFunciton(new DescendantOrSelfFunction());
registerAxisFunciton(new FollowingSiblingFunction());
registerAxisFunciton(new FollowingSiblingOneFunction());
registerAxisFunciton(new PrecedingSiblingOneFunction());
registerAxisFunciton(new ParentFunction());
registerAxisFunciton(new PrecedingSiblingFunction());
registerAxisFunciton(new com.virjar.ratel.api.extension.superappium.xpath.function.axis.SelfFunction());
......
package com.virjar.ratel.api.extension.superappium.xpath.function.axis;
import com.virjar.ratel.api.extension.superappium.ViewImage;
import com.virjar.ratel.api.extension.superappium.ViewImages;
import java.util.List;
public class PrecedingSiblingOneFunction implements AxisFunction {
@Override
public ViewImages call(ViewImage e, List<String> args) {
ViewImages rs = new ViewImages();
if (e.previousSibling() != null) {
rs.add(e.previousSibling());
}
return rs;
}
@Override
public String getName() {
return "preceding-sibling-one";
}
}
......@@ -9,7 +9,11 @@ public class ContainsFunction implements FilterFunction {
@Override
public Object call(ViewImage element, List<SyntaxNode> params) {
// Preconditions.checkArgument(params.size() >= 2, "contains need 2 params");
return params.get(0).calc(element).toString().contains(params.get(1).calc(element).toString());
Object containerObjc = params.get(0).calc(element);
if (containerObjc == null) {
return false;
}
return containerObjc.toString().contains(params.get(1).calc(element).toString());
}
@Override
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment