【问题标题】:Appium not able to identify and scroll element on android deviceAppium 无法在 android 设备上识别和滚动元素
【发布时间】:2018-11-17 09:52:07
【问题描述】:

我正在 android 的时钟应用程序上尝试一段 appium 自动化代码,但我的代码倾向于跳过滚动逻辑。我还尝试使用 findelement() 和 gettext() 来识别元素,但仍然不成功。以下是代码:

package com.test.Clock; 
import org.testng.annotations.Test; 
import io.appium.java_client.AppiumDriver; 
import io.appium.java_client.MobileElement; 
import io.appium.java_client.PerformsTouchActions; 
import io.appium.java_client.TouchAction; 
import io.appium.java_client.android.AndroidDriver; 
import org.testng.annotations.BeforeClass; 
import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.HashMap; 
import java.util.concurrent.TimeUnit; 
import org.openqa.selenium.By; 
import org.openqa.selenium.Dimension; 
import org.openqa.selenium.JavascriptExecutor; 
import org.openqa.selenium.NoSuchFrameException; 
import org.openqa.selenium.Point; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.interactions.touch.TouchActions; 
import org.openqa.selenium.remote.DesiredCapabilities; 
import org.openqa.selenium.remote.RemoteWebDriver; 
import org.openqa.selenium.support.ui.WebDriverWait; 
import org.testng.annotations.AfterClass; 

public class Clock { 

static WebDriver driver; 
//static AndroidDriver driver; 

@BeforeClass public void setUp() throws MalformedURLException{ DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability("BROWSER_NAME", "Android"); capabilities.setCapability("VERSION", "7.0"); capabilities.setCapability("deviceName","IFZDSCVCKJUWRSOV"); capabilities.setCapability("platformName","Android"); capabilities.setCapability("--session-override",true); capabilities.setCapability("noReset",true); capabilities.setCapability("appPackage", "com.android.deskclock"); capabilities.setCapability("appActivity","com.android.deskclock.AlarmClock"); //driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"),capabilities); 
driver = new RemoteWebDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities); 
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS); 
} 

@Test public void testCal() throws InterruptedException { System.out.println("inside test"); 
WebElement createAlarm=driver.findElement(By.id("amigo:id/amigo_icon0")); //WebElement createAlarm=driver.findElement(By.xpath("//android.widget.Button[@text='Create']")); 
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS); createAlarm.click(); 
// WebElement plus=driver.findElement(By.id("amigo:id/amigo_numberpicker_input")); //plus.click(); 
// driver.swipe(6, -188, 0, 0, 2); 
try { 
WebElement frame1=driver.findElement(By.id("com.android.deskclock:id/add_alarm_activity_hourNumber")); 
driver.switchTo().frame(frame1);
} 
catch (NoSuchFrameException e) { 
System.out.println(e.getMessage());
} 
Thread.sleep(2000); 
WebElement gettime=driver.findElement(By.id("com.android.deskclock:id/add_alarm_activity_hourNumber")); 
Thread.sleep(2000); 
System.out.println(gettime.getText()); 
JavascriptExecutor js = (JavascriptExecutor) driver; 
HashMap<String, Double> swipeObject = new HashMap<String, Double>(); System.out.println(swipeObject); 
swipeObject.put("startX", 3.0); 
System.out.println(swipeObject); 
swipeObject.put("startY", -183.8); 
System.out.println(swipeObject); 
swipeObject.put("endX", 0.022); 
System.out.println(swipeObject); 
swipeObject.put("endY", 0.02); 
System.out.println(swipeObject); 
swipeObject.put("duration", 2.0); 
//HashMap[] params = { swipeObject }; 
js.executeScript("mobile: scroll", swipeObject); 
System.out.println(js); 
/*JavascriptExecutor js = (JavascriptExecutor) driver; 
HashMap<String, String> scrollObject = new HashMap<String, String>(); scrollObject.put("direction", "up"); 
js.executeScript("mobile: scroll", scrollObject);*/ 
Thread.sleep(2000); 
WebElement equalTo=driver.findElement(By.id("com.android.deskclock:id/add_alarm_save")); equalTo.click(); 
} 
@AfterClass public void teardown(){ 
//close the app driver.quit();
}
}

以下是appium服务器日志:

使用 args 调用 AppiumDriver.createSession(): [{"--session-override":true,"BROWSER_NAME":"Android","VERSION":"7.0","appActivity":"com.android.deskclock.AlarmClock","appPackage":"com.android .deskclock","deviceName":"IFZDSCVCKJUWRSOV","noReset":true,"platformName":"Android"},null,{"desiredCapabilities":{"--session-override":true,"BROWSER_NAME":" Android","VERSION":"7.0","appActivity":"com.android.deskclock.AlarmClock","appPackage":"com.android.deskclock","deviceName":"IFZDSCVCKJUWRSOV","noReset":true ,"platformName":"Android"},"firstMatch":[{"platformName":"android"}]}] [BaseDriver] 事件“newSessionRequested”记录在 1528276642225 (14:47:22 GMT+0530(印度标准时间))[Appium] 无法解析 W3C 能力:“设备名称”不能为空。回退到 JSONWP 协议。 [Appium] 中提供了以下功能 JSONWP 所需的 W3C 功能中缺少的功能: ["--session-override","BROWSER_NAME","VERSION","appActivity","appPackage","deviceName","noReset","platformName"]。 回退到 JSONWP 协议。 [Appium] 创建新的 AndroidDriver (v2.6.0) 会话 [Appium] 功能:[Appium] --session-override: true [Appium] 浏览器名称:Android [Appium] 版本:7.0 [Appium] appActivity: com.android.deskclock.AlarmClock [Appium] appPackage: com.android.deskclock [Appium] 设备名称:IFZDSCVCKJUWRSOV [Appium] noReset: true [Appium] platformName: Android [BaseDriver] 创建 与 MJSONWP 所需功能的会话: {"--session-override":true,... [BaseDriver] 以下功能 已提供,但 appium 无法识别:--session-override, BROWSER_NAME,版本。 [BaseDriver] 使用会话 ID 创建的会话: 7118f268-78fb-4b3e-91fa-f46f119d6dba [AndroidDriver] 获取 Java 版本 [AndroidDriver] Java 版本为:1.8.0_101 [ADB] 检查 adb 是否存在 [ADB] 使用 adb.exe 来自 C:\Users\PAKALI\AppData\Local\Android\Sdk\platform-tools\adb.exe [AndroidDriver] 检索设备列表 [ADB] 试图找到一个 已连接的 android 设备 [ADB] 正在连接设备... [ADB] 1 连接的设备 [AndroidDriver] 使用设备:IFZDSCVCKJUWRSOV [ADB] 检查 adb 是否存在 [ADB] 使用来自的 adb.exe C:\Users\PAKALI\AppData\Local\Android\Sdk\platform-tools\adb.exe [ADB] 未将设备 ID 设置为 IFZDSCVCKJUWRSOV [AndroidDriver] 应用文件 列出,而不是我们将直接运行 com.android.deskclock 设备 [AndroidDriver] 检查包是否存在于 设备 [ADB] 正在连接设备... [ADB] 1 个设备已连接 [亚行] 运行 'C:\Users\PAKALI\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s IFZDSCVCKJUWRSOV shell pm list packages com.android.deskclock' [AndroidDriver] 启动 Android 会话 [ADB] 运行 'C:\Users\PAKALI\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s IFZDSCVCKJUWRSOV 等待设备' [ADB] 正在连接 设备... [ADB] 1 个设备已连接 [ADB] 正在运行 'C:\Users\PAKALI\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s IFZDSCVCKJUWRSOV shell echo ping' [AndroidDriver] 推送 设置 apk 到设备... [ADB] 获取安装状态 io.appium.settings [ADB] 正在连接设备... [ADB] 1 设备已连接 [ADB] 正在运行 'C:\Users\PAKALI\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s IFZDSCVCKJUWRSOV shell pm list packages io.appium.settings' [ADB] 应用程序已安装 [ADB] 获取包信息 'io.appium.settings' [ADB] 获取连接的设备... [ADB] 1 设备已连接 [ADB] 正在运行 'C:\Users\PAKALI\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s IFZDSCVCKJUWRSOV shell dumpsys 包 io.appium.settings' [ADB] 检查 aapt 是否存在 [ADB] 使用来自的 aapt.exe C:\Users\PAKALI\AppData\Local\Android\Sdk\build-tools\28.0.0-rc2\aapt.exe [ADB] 安装的 'io.appium.settings' 包不需要 upgrade ('2.3.0' >= '2.3.0') [ADB] 正在连接设备... [ADB] 1 个设备已连接 [ADB] 正在运行 'C:\Users\PAKALI\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s IFZDSCVCKJUWRSOV shell ps' [AndroidDriver] io.appium.settings 已经运行。无需重置其权限。 [亚行] 正在连接设备... [ADB] 1 个设备已连接 [ADB] 正在运行 'C:\Users\PAKALI\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s IFZDSCVCKJUWRSOV shell getprop ro.build.version.sdk' [ADB] 当前设备属性“ro.build.version.sdk”:24 [ADB] 设备 API 级别:24 [ADB] 正在连接设备... [ADB] 1 个设备 已连接 [ADB] 正在运行 'C:\Users\PAKALI\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s IFZDSCVCKJUWRSOV shell appops 设置 io.appium.settings android:mock_location 允许' [AndroidDriver] setDeviceLanguageCountry 需要语言或国家。 [AndroidDriver] 获取语言: 'undefined' 和 country: 'undefined' [Logcat] 启动 logcat 捕获 [AndroidDriver] 将解锁助手应用推送到设备... [ADB] 获取 io.appium.unlock [ADB] 的安装状态正在连接设备... [ADB] 1 个设备已连接 [ADB] 正在运行 'C:\Users\PAKALI\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s IFZDSCVCKJUWRSOV shell pm list packages io.appium.unlock' [ADB] 应用程序已安装 [ADB] 获取包信息 'io.appium.unlock' [ADB] 正在连接设备... [ADB] 1 设备已连接 [ADB] 正在运行 'C:\Users\PAKALI\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s IFZDSCVCKJUWRSOV shell dumpsys 包 io.appium.unlock' [ADB] 检查 aapt 是否存在 [ADB] 使用来自的 aapt.exe C:\Users\PAKALI\AppData\Local\Android\Sdk\build-tools\28.0.0-rc2\aapt.exe [ADB] 安装的 'io.appium.unlock' 包不需要 upgrade ('2.0.0' >= '2.0.0') [ADB] 获取设备平台版本 [ADB] 正在连接设备... [ADB] 1 个设备已连接 [ADB] 跑步 'C:\Users\PAKALI\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s IFZDSCVCKJUWRSOV shell getprop ro.build.version.release' [ADB] 当前设备属性“ro.build.version.release”:7.0 [ADB] 获取 连接的设备... [ADB] 1 个设备已连接 [ADB] 正在运行 'C:\Users\PAKALI\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s IFZDSCVCKJUWRSOV shell wm size' [ADB] 建立连接 设备... [ADB] 1 个设备已连接 [ADB] 正在运行 'C:\Users\PAKALI\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s IFZDSCVCKJUWRSOV shell getprop ro.product.model' [ADB] 当前 设备属性“ro.product.model”:S6s [ADB] 连接 设备... [ADB] 1 个设备已连接 [ADB] 正在运行 'C:\Users\PAKALI\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s IFZDSCVCKJUWRSOV shell getprop ro.product.manufacturer' [ADB] 当前设备属性“ro.product.manufacturer”:金立 [AndroidDriver] 没有应用发送,不解析包/活动 [AndroidDriver] 没有应用功能。假设它已经在 设备 [AndroidBootstrap] 观察引导断开连接 [ADB] 转发系统:4724 到设备:4724 [ADB] 正在运行 'C:\Users\PAKALI\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s IFZDSCVCKJUWRSOV 转发 tcp:4724 tcp:4724' [UiAutomator] 启动 UiAutomator [UiAutomator] 移动到状态“正在启动” [UiAutomator] 解析 uiautomator jar [UiAutomator] 找到 jar 名称: 'AppiumBootstrap.jar' [ADB] 运行 'C:\Users\PAKALI\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s IFZDSCVCKJUWRSOV 推 'C:\Program 文件 (x86)\Appium\resources\app\node_modules\appium-android-bootstrap\bootstrap\bin\AppiumBootstrap.jar' /data/local/tmp/' [ADB] 试图杀死所有 uiautomator 进程 [ADB] 使用 uiautomator 获取所有进程 [ADB] 建立连接 设备... [ADB] 1 个设备已连接 [ADB] 正在运行 'C:\Users\PAKALI\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s IFZDSCVCKJUWRSOV shell ps' [ADB] 找不到 uiautomator 进程 杀死,继续... [UiAutomator] 启动 UIAutomator [ADB] 使用 args 创建 ADB 子进程: ["-P",5037,"-s","IFZDSCVCKJUWRSOV","shell","uiautomator","runtest","AppiumBootstrap.jar","-c","io.appium.android.bootstrap.Bootstrap ","-e","pkg","com.android.deskclock","-e","disableAndroidWatchers",false,"-e","acceptSslCerts",false] [UiAutomator] 进入“在线”状态 [AndroidBootstrap] Android 引导套接字现已连接 [ADB] 正在连接设备... [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 注册崩溃观察者。 [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 客户端已连接 [ADB] 1 设备已连接 [ADB] 正在运行 'C:\Users\PAKALI\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s IFZDSCVCKJUWRSOV shell dumpsys 窗口' [AndroidDriver] 屏幕 已经解锁,什么都不做 [ADB] 设备 API 级别:24 [ADB] 正在连接设备... [ADB] 1 个设备已连接 [ADB] 正在运行 'C:\Users\PAKALI\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s IFZDSCVCKJUWRSOV 外壳启动 -W -n com.android.deskclock/com.android.deskclock.AlarmClock -S' [Appium] 新的 AndroidDriver 会话创建成功,会话 7118f268-78fb-4b3e-91fa-f46f119d6dba 添加到主会话列表 [BaseDriver] 事件“newSessionStarted”记录在 1528276661138 (14:47:41 GMT+0530 (India Standard Time)) [W3C] 回应客户 使用 driver.createSession() 结果: {"platform":"LINUX","webStorageEnabled":false,"takesScreenshot":true,"javascriptEnabled":true,"databaseEnabled":false,"networkConnectionEnabled":true,"locationContextEnabled":false,"warnings":{ },"desired":{"--session-override":true,"BROWSER_NAME":"Android","VERSION":"7.0","appActivity":"com.android.deskclock.AlarmClock","appPackage" :"com.android.deskclock","deviceName":"IFZDSCVCKJUWRSOV","noReset":true,"platformName":"Android"},"--session-override":true,"BROWSER_NAME":"Android", "VERSION":"7.0","appActivity":"com.android.deskclock.AlarmClock","appPackage":"com.android.deskclock","deviceName":"IFZDSCVCKJUWRSOV","noReset":true,"platformName ":"Android","deviceUDID":"IFZDSCVCKJUWRSOV","platformVersion":"7.0","deviceScreenSize":"1080x1920","deviceModel":"S6s","deviceManufacturer":"GIONEE"} [HTTP] POST /wd/hub/session/7118f268-78fb-4b3e-91fa-f46f119d6dba/timeouts [HTTP] {"type":"implicit","ms":15000} [W3C] 错误参数: BadParametersError:参数不正确。我们想要“W3C 协议 期望设置任何脚本、pageLoad 或隐式”并且您发送 {"type":"implicit","ms":15000} [HTTP] POST /wd/hub/session/7118f268-78fb-4b3e-91fa-f46f119d6dba/element [HTTP] {"using":"id","value":"amigo:id/amigo_icon0"} [W3C] 调用 AppiumDriver.findElement() 带参数: ["id","amigo:id/amigo_icon0","7118f268-78fb-4b3e-91fa-f46f119d6dba"] [BaseDriver] 此请求的有效定位器策略:xpath、id、 类名、可访问性 id、-android uiautomator [BaseDriver] 等待条件最多 0 毫秒 [AndroidBootstrap] 发送命令到 安卓: {"cmd":"action","action":"find","params":{"strategy":"id","selector":"amigo:id/amigo_icon0","context":"","多个“:假}} [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 从客户端获取数据: {"cmd":"action","action":"find","params":{"strategy":"id","selector":"amigo:id/amigo_icon0","context":"","多个“:假}} [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 得到 ACTION 类型的命令 [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 得到命令动作:find [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 发现 'amigo:id/amigo_icon0' 使用 'ID' 和 contextId: '' 多个: false [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 使用: UiSelector[INSTANCE=0, RESOURCE_ID=amigo:id/amigo_icon0] [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 返回结果: {"status":0,"value":{"ELEMENT":"1"}} [AndroidBootstrap] 收到 引导程序的命令结果 [W3C] 响应客户端 driver.findElement() 结果:{"ELEMENT":"1"} [HTTP] POST /wd/hub/session/7118f268-78fb-4b3e-91fa-f46f119d6dba/timeouts [HTTP] {"type":"implicit","ms":3000} [W3C] 错误参数: BadParametersError:参数不正确。我们想要“W3C 协议 期望设置任何脚本、pageLoad 或隐式”并且您发送 {"type":"implicit","ms":3000} [HTTP] POST /wd/hub/session/7118f268-78fb-4b3e-91fa-f46f119d6dba/element/1/click [HTTP] {"id":"1"} [W3C] 使用 args 调用 AppiumDriver.click(): ["1","7118f268-78fb-4b3e-91fa-f46f119d6dba"] [AndroidBootstrap] 向安卓发送命令: {"cmd":"action","action":"element:click","params":{"elementId":"1"}} [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 从客户端获取数据: {"cmd":"action","action":"element:click","params":{"elementId":"1"}} [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 得到 ACTION 类型的命令 [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 得到命令动作:点击 [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 返回结果: {"status":0,"value":true} [AndroidBootstrap] 收到命令结果 来自引导程序 [W3C] 使用 driver.click() 结果响应客户端: 真 [HTTP] POST /wd/hub/session/7118f268-78fb-4b3e-91fa-f46f119d6dba/元素 [HTTP] {"using":"id","value":"com.android.deskclock:id/add_alarm_activity_hourNumber"} [W3C] 使用 args 调用 AppiumDriver.findElement(): ["id","com.android.deskclock:id/add_alarm_activity_hourNumber","7118f268-78fb-4b3e-91fa-f46f119d6dba"] [BaseDriver] 此请求的有效定位器策略:xpath、id、 类名、可访问性 id、-android uiautomator [BaseDriver] 等待条件最多 0 毫秒 [AndroidBootstrap] 发送命令到 安卓: {"cmd":"action","action":"find","params":{"strategy":"id","selector":"com.android.deskclock:id/add_alarm_activity_hourNumber","context": "","多个":false}} [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 从客户端获取数据: {"cmd":"action","action":"find","params":{"strategy":"id","selector":"com.android.deskclock:id/add_alarm_activity_hourNumber","context": "","多个":false}} [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 得到 ACTION 类型的命令 [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 得到命令动作:find [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 发现 'com.android.deskclock:id/add_alarm_activity_hourNumber' 使用'ID' 带有 contextId: '' 多个:false [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 使用:UiSelector[INSTANCE=0, RESOURCE_ID=com.android.deskclock:id/add_alarm_activity_hourNumber] [AndroidBootstrap] 从引导 [W3C] 接收命令结果 使用 driver.findElement() 结果响应客户端:{"ELEMENT":"2"} [HTTP] POST /wd/hub/session/7118f268-78fb-4b3e-91fa-f46f119d6dba/frame [HTTP] {"id":{"ELEMENT":"2","element-6066-11e4-a52e-4f735466cecf":"2"}} [W3C] 使用 args 调用 AppiumDriver.setFrame(): [{"ELEMENT":"2","element-6066-11e4-a52e-4f735466cecf":"2"},"7118f268-78fb-4b3e-91fa-f46f119d6dba"] [HTTP] POST /wd/hub/session/7118f268-78fb-4b3e-91fa-f46f119d6dba/元素 [HTTP] {"using":"id","value":"com.android.deskclock:id/add_alarm_activity_hourNumber"} [W3C] 使用 args 调用 AppiumDriver.findElement(): ["id","com.android.deskclock:id/add_alarm_activity_hourNumber","7118f268-78fb-4b3e-91fa-f46f119d6dba"] [BaseDriver] 此请求的有效定位器策略:xpath、id、 类名、可访问性 id、-android uiautomator [BaseDriver] 等待条件最多 0 毫秒 [AndroidBootstrap] 发送命令到 安卓: {"cmd":"action","action":"find","params":{"strategy":"id","selector":"com.android.deskclock:id/add_alarm_activity_hourNumber","context": "","多个":false}} [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 从客户端获取数据: {"cmd":"action","action":"find","params":{"strategy":"id","selector":"com.android.deskclock:id/add_alarm_activity_hourNumber","context": "","多个":false}} [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 得到 ACTION 类型的命令 [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 得到命令动作:find [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 发现 'com.android.deskclock:id/add_alarm_activity_hourNumber' 使用'ID' 带有 contextId: '' 多个:false [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 使用:UiSelector[INSTANCE=0, RESOURCE_ID=com.android.deskclock:id/add_alarm_activity_hourNumber] [AndroidBootstrap] 从引导 [W3C] 接收命令结果 使用 driver.findElement() 结果响应客户端:{"ELEMENT":"3"} [HTTP] GET /wd/hub/session/7118f268-78fb-4b3e-91fa-f46f119d6dba/element/3/text [HTTP] {} [W3C] 使用 args 调用 AppiumDriver.getText(): ["3","7118f268-78fb-4b3e-91fa-f46f119d6dba"] [AndroidBootstrap] 向安卓发送命令: {"cmd":"action","action":"element:getText","params":{"elementId":"3"}} [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 从客户端获取数据: {"cmd":"action","action":"element:getText","params":{"elementId":"3"}} [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 得到 ACTION 类型的命令 [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 得到命令动作:getText [AndroidBootstrap] 从引导 [W3C] 接收命令结果 使用 driver.getText() 结果响应客户端:"" [HTTP] POST /wd/hub/session/7118f268-78fb-4b3e-91fa-f46f119d6dba/execute [HTTP] {“脚本”:“手机: 滚动","args":[{"duration":2,"endY":0.02,"endX":0.022,"startY":-183.8,"startX":3}]} [W3C] 使用 args 调用 AppiumDriver.execute(): ["mobile: 滚动",[{"duration":2,"endY":0.02,"endX":0.022,"startY":-183.8,"startX":3}],"7118f268-78fb-4b3e-91fa-f46f119d6dba"] [HTTP] POST /wd/hub/session/7118f268-78fb-4b3e-91fa-f46f119d6dba/element [HTTP] {"using":"id","value":"com.android.deskclock:id/add_alarm_save"} [W3C] 使用 args 调用 AppiumDriver.findElement(): ["id","com.android.deskclock:id/add_alarm_save","7118f268-78fb-4b3e-91fa-f46f119d6dba"] [BaseDriver] 此请求的有效定位器策略:xpath、id、 类名、可访问性 id、-android uiautomator [BaseDriver] 等待条件最多 0 毫秒 [AndroidBootstrap] 发送命令到 安卓: {"cmd":"action","action":"find","params":{"strategy":"id","selector":"com.android.deskclock:id/add_alarm_save","context": "","多个":false}} [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 从客户端获取数据: {"cmd":"action","action":"find","params":{"strategy":"id","selector":"com.android.deskclock:id/add_alarm_save","context": "","多个":false}} [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 得到 ACTION 类型的命令 [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 得到命令动作:find [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 发现 'com.android.deskclock:id/add_alarm_save' 使用 'ID' contextId: '' 多个: false [AndroidBootstrap] [BOOTSTRAP LOG] [调试] 使用:UiSelector[INSTANCE=0, RESOURCE_ID=com.android.deskclock:id/add_alarm_save] [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 返回结果: {"status":0,"value":{"ELEMENT":"4"}} [AndroidBootstrap] 已收到 引导程序的命令结果 [W3C] 响应客户端 driver.findElement() 结果:{"ELEMENT":"4"} [HTTP] POST /wd/hub/session/7118f268-78fb-4b3e-91fa-f46f119d6dba/element/4/click [HTTP] {"id":"4"} [W3C] 使用 args 调用 AppiumDriver.click(): ["4","7118f268-78fb-4b3e-91fa-f46f119d6dba"] [AndroidBootstrap] 向安卓发送命令: {"cmd":"action","action":"element:click","params":{"elementId":"4"}} [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 从客户端获取数据: {"cmd":"action","action":"element:click","params":{"elementId":"4"}} [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 得到 ACTION 类型的命令 [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 得到命令动作:点击 [AndroidBootstrap] [BOOTSTRAP LOG] [debug] 返回结果: {"status":0,"value":true} [AndroidBootstrap] 收到命令结果 来自引导程序 [W3C] 使用 driver.click() 结果响应客户端: 真 [HTTP] 删除 /wd/hub/session/7118f268-78fb-4b3e-91fa-f46f119d6dba [HTTP] {} [W3C] 使用 args 调用 AppiumDriver.deleteSession(): [“7118f268-78fb-4b3e-91fa-f46f119d6dba”] [BaseDriver] 事件 'quitSessionRequested' 记录于 1528276671521 (14:47:51 GMT+0530 (印度标准时间)) [Appium] 删除会话 来自我们的主会话列表的 7118f268-78fb-4b3e-91fa-f46f119d6dba [AndroidDriver] 关闭 Android 驱动 [ADB] 建立连接 设备... [ADB] 1 个设备已连接 [ADB] 正在运行 'C:\Users\PAKALI\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s IFZDSCVCKJUWRSOV 外壳是强制停止 com.android.deskclock' [ADB] 按下 HOME 按钮 [ADB] 正在连接设备... [ADB] 1 个设备已连接 [ADB] 正在运行 'C:\Users\PAKALI\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s IFZDSCVCKJUWRSOV shell 输入键事件 3' [AndroidBootstrap] 向 android 发送命令:{"cmd":"shutdown"} [AndroidBootstrap] [引导日志] [调试] 从客户端获取数据:{"cmd":"shutdown"} [AndroidBootstrap] 从引导接收命令结果 [UiAutomator] 关闭 UiAutomator [UiAutomator] 进入状态 '停止' [UiAutomator] UiAutomator 正常关闭 [UiAutomator] 进入“停止”状态 [ADB] 试图杀死所有 uiautomator processes [ADB] 使用 uiautomator [ADB] 获取所有进程 连接的设备... [ADB] 1 个设备已连接 [ADB] 正在运行 'C:\Users\PAKALI\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s IFZDSCVCKJUWRSOV shell ps' [ADB] 找不到 uiautomator 进程 杀死,继续...... [UiAutomator] 进入“停止”状态 [Logcat] 停止 logcat 捕获 [ADB] 正在连接设备... [ADB] 1 个设备已连接 [ADB] 正在运行 'C:\Users{用户名![screenshot for app]1}\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s IFZDSCVCKJUWRSOV shell am force-stop io.appium.unlock' [AndroidDriver] 不清理生成的文件。加clearSystemFiles 如果需要的话。 [BaseDriver] 记录事件“quitSessionFinished” 在 1528276676716(14:47:56 GMT+0530(印度标准时间))[W3C] 收到的响应:null [W3C] 但是删除会话,所以不返回 [W3C] 使用 driver.deleteSession() 结果响应客户端:null [HTTP]

200 5196 毫秒 - 76

【问题讨论】:

  • 请原谅我的格式化技巧。

标签: android mobile automation appium


【解决方案1】:

您使用了错误的库来执行该操作,js.execute("mobile: scroll") 适用于 iOS。您需要查看 TouchAction 库。这是他们文档的链接http://appium.io/docs/en/writing-running-appium/touch-actions/

【讨论】:

  • 已经尝试过只接受整数参数的 swipe() (从技术上讲,它应该接受双精度)。 swipe() 仅在我们使用 AndroidDriver 而不是 WebDriver 时才支持。如果我们使用 AndroidDriver,那么其他 selenium 代码,如 .click() 或 .sendKeys() 将被跳过。甚至 swipe() 也没有正确执行。如果我们使用 WebDriver,那么代码不支持 swipe() 函数。所以,如果我们想让其他 selenium 代码正常工作,我们必须使用 WebDriver。
【解决方案2】:

我在通过 Appium 在 Android 设备上滚动时也遇到了一些问题。
就我而言,主要问题是滚动操作是在我想要滚动的片段准备好之前执行的。

场景:

单击按钮打开新片段 -> 从 y 500 滚动到 y 100

解决方案:

点击按钮打开新片段->等待打开的片段的元素A->找到元素A后从y 500滚动到y 100

滚动代码(Kotlin):

//wait for some element of the fragment before, then scroll:
PlatformTouchAction(driver as AppiumDriver)
            .press(PointOption.point(100,500))
            .waitAction(WaitOptions.waitOptions(Duration.ofMillis(200)))
            .moveTo(PointOption.point(100,100)).waitAction(WaitOptions.waitOptions(Duration.ofMillis(1000)))
            .release()
            .perform()

PlatfromTouchAction 只是使 TouchAction 在 Kotlin 中可用的包装器,如 in this discussion 所述

【讨论】:

    猜你喜欢
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 2020-05-22
    • 2018-12-12
    • 2015-03-20
    • 1970-01-01
    • 2019-11-03
    相关资源
    最近更新 更多