appium环境搭建教程(一)
Appium 是一个开源工具,用于自动化 iOS 手机、 Android 手机。专业话就不多介绍,想要做移动端app自动化,就是它了。下面详细介绍环境搭建过程,并且实现一个简单的自动化。 ...
Appium 是一个开源工具,用于自动化 iOS 手机、 Android 手机。专业话就不多介绍,想要做移动端app自动化,就是它了。下面详细介绍环境搭建过程,并且实现一个简单的自动化。 ...
准备环境 准备运行环境 appium server端 Android sdk jdk 查看元素需要的环境 appium desktop 可以查看手机内的元素 谷歌浏览器 输入chrome://inspect/#devices(需要翻墙) 我本人操作的时候是 appium desktop 和谷歌浏览器都是用的,appium desktop 本来是可以切换context的但是 我的不知道是哪里没有配置对,所以看小程序的页面元素就转战 谷歌浏览器啦。 ...
agent 初探 premain 命令式 在main方法之前执行 agentmain 以Attach的方式载入,在Java程序启动后执行,1.6提供 public interface Instrumentation { /** * 添加Transformer(转换器) * ClassFileTransformer类是一个接口,通常用户只需实现这个接口的 byte[] transform()方法即可; * transform这个方法会返回一个已经转换过的对象的byte[]数组 * @param transformer 拦截器 * @return canRetransform 是否能重新转换 */ void addTransformer(ClassFileTransformer transformer, boolean canRetransform); /** * 重新触发类加载, * 该方法可以修改方法体、常量池和属性值,但不能新增、删除、重命名属性或方法,也不能修改方法的签名 * @param classes Class对象 * @throws UnmodifiableClassException 异常 */ void retransformClasses(Class<?>... classes) throws UnmodifiableClassException; /** * 直接替换类的定义 * 重新转换某个对象,并已一个新的class格式,进行转化。 * 该方法可以修改方法体、常量池和属性值,但不能新增、删除、重命名属性或方法,也不能修改方法的签名 * @param definitions ClassDefinition对象[Class定义对象] * @throws ClassNotFoundException,UnmodifiableClassException 异常 */ void redefineClasses(ClassDefinition... definitions)throws ClassNotFoundException, UnmodifiableClassException; /** * 获取当前被JVM加载的所有类对象 * @return Class[] class数组 */ Class[] getAllLoadedClasses(); } premain方法介绍 public class AgentWithTransFormer { public static void premain(String agentOps, Instrumentation instrumentation) { System.out.println("premian start 。。"); System.out.println("agentOps = " + agentOps); instrumentation.addTransformer(new DefineTransformer(),true); } /** * */ static class DefineTransformer implements ClassFileTransformer { @Override public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { System.out.println("premain load class :" + className); return classfileBuffer; } } } premain方法会拦截大部分类(不包含有些系统类),实现类DefineTransformer需要实现transform方法,比如我们可以拦截某个类,将某个类的class文件修改,可以整个文件替换或者利用javassist自定义添加或者删除方法。 ...
观察者模式 概念 一个动作的发生可以让其他观察者知道 应用 jdk的observer和 Observable 观察者(observer)注册(addObserver())在被观察者(observable)上,通过方法notifyObservers来执行每个观察者的update方法,有意思的是,为了防止在循环执行每个观察者的update方法时,可能存在删除或者添加观察者,引起结果的不正确,执行notifyObservers方法时,都会先生成一个观察者集合快照,并给他加上了锁,使用快照来循环,就不会出现意外。 ...
缓存一致性问题 什么是缓存一致性问题? 在JMM中,每个线程都拥有自己的工作内存(逻辑概念,也叫缓存),通过bus总线与内存交互,也就是说每个线程都有自己的工作内存,可以进行读,写操作。不同线程对同一数据进行读写,就会使工作内存之间和主内存的数据不一致的情况。这时候就需要操作系统制定相关规则来维持工作内存之间和主内存的数据的一致性。 ...