Appium ios 模拟器 执行滑动 看不到效果呢?求教。

汤穆 · 2014年05月19日 · 最后由 Anson 回复于 2014年05月19日 · 2455 次阅读

// final JavascriptExecutor js = (JavascriptExecutor) remoteWebDriver;
//
// final HashMap swipeObj = new HashMap();
// swipeObj.put("startX", 0.0);
// swipeObj.put("startY", 100.0);
// swipeObj.put("endX", 0.0);
// swipeObj.put("endY", 400.0);
// swipeObj.put("duration", 1.0);
// // 拖动
// for (int i = 0; i < 2; i++) {
// js.executeScript("mobile: swipe", swipeObj);
//
// }
// TimeUnit.SECONDS.sleep(20);

final JavascriptExecutor js = (JavascriptExecutor) remoteWebDriver;
final Map scrollObject = new HashMap();
scrollObject.put("direction", "down");
System.out.println("Scroll object:" + scrollObject.size());
for (int i = 0; i < 1; i++) {
js.executeScript("mobile: scroll", scrollObject);
}

共收到 41 条回复 时间 点赞

xcode 版本 5.1, ios 版本 7.1

info: Responding to client with success: {"status":0,"value":"","sessionId":"75d0c61a-592b-41a4-bfe9-9d48febbb09c"}
POST /wd/hub/session/75d0c61a-592b-41a4-bfe9-9d48febbb09c/url 200 1506ms - 87b
debug: Appium request initiated at /wd/hub/session/75d0c61a-592b-41a4-bfe9-9d48febbb09c/execute
debug: Request received with params: {"args":[{"direction":"down"}],"script":"mobile: scroll"}
info: Pushing command to appium work queue: "au.scrollFirstView('Down')"
debug: Sending command to instruments: au.scrollFirstView('Down')
info: [INSTSERVER] Sending command to instruments: au.scrollFirstView('Down')
info: [INST] 2014-05-19 07:30:49 +0000 Debug: target.frontMostApp().elements()[1].elements()[2].scrollDown()

info: [INSTSERVER] Socket data received (50 bytes)
info: [INSTSERVER] Socket data being routed for 'cmd' event
info: [INSTSERVER] Got result from instruments: {"status":0,"value":true}
info: Responding to client with success: {"status":0,"value":true,"sessionId":"75d0c61a-592b-41a4-bfe9-9d48febbb09c"}
POST /wd/hub/session/75d0c61a-592b-41a4-bfe9-9d48febbb09c/execute 200 289ms - 89b
debug: Appium request initiated at /wd/hub/session/75d0c61a-592b-41a4-bfe9-9d48febbb09c/execute
debug: Request received with params: {"args":[{"direction":"down"}],"script":"mobile: scroll"}
info: Pushing command to appium work queue: "au.scrollFirstView('Down')"
debug: Sending command to instruments: au.scrollFirstView('Down')
info: [INSTSERVER] Sending command to instruments: au.scrollFirstView('Down')
info: [INST] 2014-05-19 07:30:49 +0000 Debug: target.frontMostApp().elements()[1].elements()[2].scrollDown()

info: [INSTSERVER] Socket data received (50 bytes)
info: [INSTSERVER] Socket data being routed for 'cmd' event
info: [INSTSERVER] Got result from instruments: {"status":0,"value":true}

swipe 被 Apple broken 了,在 iOS 7 simulator 上。

另外,如果位置是取像素点的话,建议不要写像素,通过读取屏幕大小的方法获取座标。

int X = driver.manage().window().getSize().getWidth();
int Y = driver.manage().window().getSize().getHeight();

int sX = (int) (X * 0.9);
int sY = (int) (Y * 0.5);
int eX = (int) (X * 0.05);
int eY = sY;
int duration = 1000;

driver.swipe(sX, sY, eX, eY, duration);

#3 楼 @532589730 额, 那怎么办?

#5 楼 @tomzhangc
使用 mobile: scroll

#6 楼 @532589730 是呀, 我第二种方法用的 scroll 也看不到效果,
final JavascriptExecutor js = (JavascriptExecutor) remoteWebDriver;
final Map scrollObject = new HashMap();
scrollObject.put("direction", "down");
System.out.println("Scroll object:" + scrollObject.size());
for (int i = 0; i < 2; i++) {
js.executeScript("mobile: scroll", scrollObject);
}

TimeUnit.SECONDS.sleep(20);

8楼 已删除

#6 楼 @532589730 1.x 已经废弃了这个方法.

汤穆 #10 · 2014年05月19日 Author

#9 楼 @seveniruby 我用的 1.0 版本, 看打印日志 Responding to client with success: {"status":0,"value":true 成功了吧。 模拟器竟然没反应?

#10 楼 @tomzhangc 可能残留了一个吧, mobile 方法官方都说会废弃了. 建议换成新的方式试试, 我 IOS 不熟悉

#9 楼 @seveniruby
事实上,在 Appium 1.0 上还没有废弃。
前段时间我在 google group 上问过 Jonathan Lipps,即 swipe 的问题,他说给 js 留了后门...
但我没试怎么打开...

#12 楼 @532589730 貌似是, 我貌似也看过你的这个讨论, 这个功能我没去跟.你试试的 api, 我记得有个 Touch 相关的 api 看看官方的文档里面是提倡什么 api 的

看楼主的代码,应该还没切换到 appium 1.0 上,所以可以试试 mobile: scroll,虽然迟早要切换到 appium 1.x 上来。

#13 楼 @seveniruby
之前写的一个方法.

public class iOSGesture {
    private WebDriver wd;
    private JavascriptExecutor js;

    public iOSGesture(WebDriver wd) {
        super();
        this.wd = wd;
        this.js = (JavascriptExecutor) this.wd;
    }
       public void scroll(String direction) throws InterruptedException{
        HashMap<String, String> ScrollObject = new HashMap<String, String>();
        ScrollObject.put("direction", direction);
        this.js.executeScript("mobile: scroll", ScrollObject);
        Common.sleep(1);
    }

}


direction 只有四个值: left, right, up, down。
在 iOS7 上,是可以的。但无法拖拽一个 WebElement,从一个地方到另一个地方,但 Python 可以实现,在 iOS 7 上,之前我写过一贴子。

汤穆 #16 · 2014年05月19日 Author

#14 楼 @532589730 额, 是有用 js.executeScript("mobile: scroll", scrollObject);
模拟器也没反应, case 最终报是 成功的。
但模拟器上看不到 滑动 的效果,准确的说是屏幕一直静止。

#16 楼 @tomzhangc
妳的 scrollObject 是什么值?

汤穆 #18 · 2014年05月19日 Author

#17 楼 @532589730
final JavascriptExecutor js = (JavascriptExecutor) remoteWebDriver;
final Map scrollObject = new HashMap();
scrollObject.put("direction", "down");
//System.out.println("Scroll object:" + scrollObject.size());
for (int i = 0; i < 2; i++) {
js.executeScript("mobile: scroll", scrollObject);
}

TimeUnit.SECONDS.sleep(20);

汤穆 #19 · 2014年05月19日 Author

另外, 我使用 safari 打开一个页面, 进行滑动操作。

汤穆 #20 · 2014年05月19日 Author

final JavascriptExecutor js = (JavascriptExecutor) remoteWebDriver;
final Map<String, String> scrollObject = new HashMap<String, String>();
scrollObject.put("direction", "down");
//System.out.println("Scroll object:" + scrollObject.size());
for (int i = 0; i < 2; i++) {
    js.executeScript("mobile: scroll", scrollObject);
}

TimeUnit.SECONDS.sleep(20);

#16 楼 @tomzhangc 官方的建议是 driver.swipe(75, 500, 75, 0, 0.8)

大概下面那样子吧,没验证。

WebDriver driver;
JavascriptExecutor js = (JavascriptExecutor) driver;

HashMap<String, String> ScrollObject = new HashMap<String, String>();
ScrollObject.put("direction", [Your direction string]);     //direction = "left", "right", "up", "down"
this.js.executeScript("mobile: scroll", ScrollObject);

#21 楼 @seveniruby
这个会报错的,原因是 duration 要 int 类型,是毫秒,除非自己改 Java-Client
driver.swipe(75, 500, 75, 0, 0.8)

汤穆 #24 · 2014年05月19日 Author

#21 楼 @seveniruby 好 我试试看。

汤穆 #25 · 2014年05月19日 Author

#23 楼 @532589730 没有 swipe 这个 api

#25 楼 @tomzhangc
driver.swipe() 是 Appium 1.0 的方法来的,所以妳最好说明妳的 Appium 是什么版本的。

汤穆 #27 · 2014年05月19日 Author

#26 楼 @532589730

tomzhangc@tomMBP:searchappium$appium -v 
1.0.0

#27 楼 @tomzhangc
是的 1.0 的话,有 swipe 方法。
至于怎么"激活" "mobile:",那得摸索下了。

汤穆 #29 · 2014年05月19日 Author

#28 楼 @532589730 这个 driver 是什么类型对象?

汤穆 #30 · 2014年05月19日 Author

我这边 没有 swipe 这个方法呢。

public WebDriver remoteWebDriver;

#29 楼 @tomzhangc
Appium 1.0 的 Java 的话,应该是
private AppiumDriver driver;

请参考 appium 的示例.
https://github.com/appium/appium/tree/master/sample-code/examples/java/junit/src/test/java/com/saucelabs/appium

汤穆 #32 · 2014年05月19日 Author

#31 楼 @532589730 用这个新定义的类型,就不通用了。
同样的代码, 也是 appium1.0 我同事那边 xcode4.6.4 竟然可以滑动。

#32 楼 @tomzhangc
要看 iOS 版本的,我把 iOS 切换到 iOS6.x 后,driver.swipe() 马上可以滑动,就 4 楼代码,从右向左滑动。

汤穆 #34 · 2014年05月19日 Author

#33 楼 @532589730 ios 版本 需要 shell 下配置吗?

#34 楼 @tomzhangc
...
在 Xcode 上打开一项目,好像跑 simulator 时可以选 iOS simulator 设备的,里面就可以看到 iOS 有什么版本。
Appium 会运行指定 Xcode 的最高版本的 iOS。

另外一种方法是使用 ios-sim 查看默认 Xcode 的 iOS 版本。

我也只会这两种笨方法。

汤穆 #36 · 2014年05月19日 Author

#35 楼 @532589730 那这样的话,xcode5.1 最高 ios7.1 了。

#36 楼 @tomzhangc
那请慢读我 3 楼的回复。

汤穆 #38 · 2014年05月19日 Author

#3 楼 @532589730 那就是说 我要安装 xcode4.6 用 ios6 了。额

汤穆 #39 · 2014年05月19日 Author

多谢哈,我先升级下 xcode 再看看吧。

汤穆 #40 · 2014年05月20日 Author

#33 楼 @532589730 hi, Instruments wants permission to analyze other processes xcode4.6.3 这个问题碰到过吗?谢谢。

#39 楼 @tomzhangc 将 Xcode4.6.3 切换为默认得了么?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册