根据网上的帖子 我试了好久了。
方法 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。
driver.sendKeyEvent(AndroidKeyCode.BACK) 或者,driver.sendKeyEvent(4)
back 键的键值是 4
#2 楼 @shimazakiharuka 你的 appium 版本低于 1.0 吧?
#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); 试试看
#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");
@shimazakiharuka 如果缺这个 会有错误提示的啊。。。。。我之前也遇到过的。。。会提示缺少什么 json
正好需要,学习啦。。
driver.keyevent(4)
python 中点击返回键是这样写的
键盘控件是自己写的打乱了字母的顺序, driver.sendKeyEvent(66); 一点反应没有啊 。 也不报错, 我想界面找到字母点击,
//Java
driver.sendKeyEvent(AndroidKeyCode.BACK);
java-client2.2 的包中 AppiumDriver 已经没有 sendKeyEvent 这个方法了,androidDriver 才有这个方法
楼上说到点上了,要用 androidDriver 才有这个方法
具体操作:
把 private AppiumDriver driver;换成 private AndroidDriver driver;
这样就可以使用 sendKeyEvent 方法了。
用法举例(JAVA),退格删除一个字符。
楼主可以共享一下解决方案的步骤吗,谢谢啊
官方文档更新为: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() 了