Appium Appium 如何模拟返回按键

shimazakiharuka · 2014年06月23日 · 最后由 雪怪 回复于 2016年02月02日 · 2415 次阅读

根据网上的帖子 我试了好久了。

方法 1 AppiumDriver 实现了在上述功能,代码如下(java 版本)

driver.sendKeyEvent(66);
方法 2

HashMap keycode = new HashMap();
keycode.put("keycode", 82);
((JavascriptExecutor) driver).executeScript("mobile: keyevent", keycode);

方法 3
String cmdstr="adb shell input keyevent 66";
Runtime.getRuntime().exec(cmdstr).waitFor();
Thread.sleep(10000);

但是我的 driver 里面根本没有 driver.back(),driver.sendKeyEvent(66) 这些方法,我用的 java 语言。方法二不报错,但是运行不起来。是例子的写法有问题吗?
我的 driver 是父类继承的 Webdriver。

共收到 27 条回复 时间 点赞

driver.sendKeyEvent(AndroidKeyCode.BACK) 或者,driver.sendKeyEvent(4)
back 键的键值是 4

#1 楼 @xuxu 但是我的 driver 里面没有 sendKeyEvent 这个方法,这个方法是 webdriver 的,还是哪个别的类的。

#2 楼 @shimazakiharuka 你的 appium 版本低于 1.0 吧?

#3 楼 @xuxu 我是小白,怎么看版本。是导入的 selenium 这个版本低吗?这个函数应该在哪个 jar 包里面放着?

#4 楼 @shimazakiharuka Appium -v 看版本, 最新的 1.1 直接从 Appium import webdriver 就行了, 你可以看看 github 上面的 java-client

@shimazakiharuka 你要的这些方法是 java-client.jar 的,他扩展了一些操作

#6 楼 @eric 根据大神们的指导 我找到了那个库 并加入了自定义用户库里面,但是我的代码还是不好,以前的 WebDriver 可以运行,但是用 AppiumDriver 以后,就运行不了了。走到测试函数,就出现运行错误,但是 Appium 里面没有啥提示。是我的配置不对了吗?我已经把 java client 库加了进来,以前 selenium 里面需要改动吗?

package jp.dwango.music.appium;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.*;
import org.openqa.selenium.remote.DesiredCapabilities;
import io.appium.java_client.AppiumDriver;
import java.io.File;
import java.net.URL;
import java.util.List;

public class CMyAppium {
private AppiumDriver driver;

@Before
public void setUp() throws Exception {
File appDir = new File("/Users/di_zhou/Documents/workspace/MusicStoreAppiumTest/apps");
File app = new File(appDir,"MusicStore.apk");
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
capabilities.setCapability("deviceName", "Galaxy S4");
capabilities.setCapability("platformName", "Android");
capabilities.setCapability("platformVersion", "4.3");
capabilities.setCapability("app", app.getAbsolutePath());
driver = new AppiumDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
}

@After
public void tearDown() throws Exception {

//Delete the WebDriver object
driver.quit();
}

@Test
public void testClickDashBoardTest()
{
driver.sendKeyEvent(4);
}
}

#5 楼 @cy_suncheng Appium import webdriver 这句话是什么意思啊!我刚接触 Appium,我看网上的代码都有 public class WebDriver extends RemoteWebDriver implements HasTouchScreen{}这个重写还是什么。AppiumDriver 也需要吗?

@shimazakiharuka 确定 apk 安装成功的前提下,你可以再 driver.sendKeyEvent(4) 前面加个 thread.sleep(5000); 试试看

#9 楼 @eric 还是那种情况,就是刚一启动测试的软件,代码就自动终止报错了,tearDown() 这个函数也没走,因为下次在点运行,Appium 端口正在被占用。是我安装的包少吗?我只导入了 java client,selenium,Json 也需要导入 jar 吗?还有帖子说 pom 文件,我创建的 Java 测试工程也不带 pom 这个文件。

#8 楼 @shimazakiharuka 我说的是 python 的方法,以前不是要从 Selenium import webdriver 么, 现在直接从 Appium import webdriver 就行了, java 我不太熟, https://github.com/appium/java-client/tree/master/src/test/java/io/appium/java_client 你可以看看这里面的例子, 不过我看你贴的代码, 是不是应该要先 package io.appium.java_client; java 一般,仅供参考

@shimazakiharuka pom 那是 maven 工程,你报错报的是什么错?

#12 楼 @eric 就是运行 setup 之后,测试代码根本进不去。直接就停止了。

appium 的日志是

info: Getting focused package and activity

info: Device launched! Ready for commands

info: Setting command timeout to the default of 7200 secs
info: Appium session started with sessionId 47e9b6a9-93ef-4d8c-a8b4-9e5edd601843
POST /wd/hub/session 303 6688ms - 9b

debug: Appium request initiated at /wd/hub/session/47e9b6a9-93ef-4d8c-a8b4-9e5edd601843

info: Responding to client with success: {"status":0,"value":{"platform":"LINUX","browserName":"Android","platformVersion":"4.3","webStorageEnabled":false,"takesScreenshot":true,"javascriptEnabled":true,"databaseEnabled":false,"warnings":{},"desired":{"platformVersion":"4.3","app":"/Users/di_zhou/Documents/workspace/AppiumDemo/apps/ContactManager.apk","platformName":"Android","deviceName":"Android","appActivity":".ContactManager","appPackage":"com.example.android.contactmanager"},"app":"/Users/di_zhou/Documents/workspace/AppiumDemo/apps/ContactManager.apk","platformName":"Android","deviceName":"Android","appActivity":".ContactManager","appPackage":"com.example.android.contactmanager"},"sessionId":"47e9b6a9-93ef-4d8c-a8b4-9e5edd601843"}

debug: Request received with params: {}

GET /wd/hub/session/47e9b6a9-93ef-4d8c-a8b4-9e5edd601843 200 2ms - 857b

是不是超时了?最开始设置有问题?

@shimazakiharuka 你是在什么系统下的? 你这个路径是 linux 下的路径吧
你试试
File classpathRoot = new File(System.getProperty("user.dir"));
File appDir = new File(classpathRoot, "apps");
File app = new File(appDir, "xxx.apk");

#14 楼 @eric Mac 的,用以前的 webdriver 好使,用这个 appiumdriver 就不好使。

#14 楼 @eric 用这个了,就是手机上软件一打开,我这边的代码,就崩溃。正好是要运行测试代码的时候,测试代码里面一点都进不去。

#14 楼 @eric 谢谢前辈了 已经解决了,是因为没有 Json 的 jar 包。谢谢大神们了。

@shimazakiharuka 如果缺这个 会有错误提示的啊。。。。。我之前也遇到过的。。。会提示缺少什么 json

正好需要,学习啦。。

driver.keyevent(4)

python 中点击返回键是这样写的

键盘控件是自己写的打乱了字母的顺序, driver.sendKeyEvent(66); 一点反应没有啊 。 也不报错, 我想界面找到字母点击,

//Java
driver.sendKeyEvent(AndroidKeyCode.BACK);

6楼 已删除

java-client2.2 的包中 AppiumDriver 已经没有 sendKeyEvent 这个方法了,androidDriver 才有这个方法

楼上说到点上了,要用 androidDriver 才有这个方法
具体操作:
把 private AppiumDriver driver;换成 private AndroidDriver driver;

这样就可以使用 sendKeyEvent 方法了。

用法举例(JAVA),退格删除一个字符。

  1. driver.sendKeyEvent(67);
  2. driver.sendKeyEvent(AndroidKeyCode.BACKSPACE);

楼主可以共享一下解决方案的步骤吗,谢谢啊

官方文档更新为:Replace sendKeyEvent() method in android with pressKeyCode(int key) and added: pressKeyCode(int key, Integer metastate), longPressKeyCode(int key), longPressKeyCode(int key, Integer metastate)

@addison 感谢!用 sendKeyEvent() 一直报错,原来已经改成了 pressKeyCode() 了

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