如何使用 Eclipse 在 Appium 上运行脚本测试?

Posted

技术标签:

【中文标题】如何使用 Eclipse 在 Appium 上运行脚本测试?【英文标题】:How to run a script test on Appium with Eclipse? 【发布时间】:2018-07-26 07:55:36 【问题描述】:

您好,我编写了这段代码,我正在尝试使用 Appium 在 APP 中进行登录过程的测试。当我运行测试它返回我这个错误:

org.openqa.selenium.WebDriverException:处理命令时发生未知的服务器端错误。原始错误:错误 启动应用程序时发生。原始错误:执行 adbExec 时出错。 原始错误:'命令 'C:\Users\lucas\AppData\Local\android\sdk\platform-tools\adb.exe -P 5037 -s 5210ce98fa7eb4b3 shell am start -W -n com.consul.android.smartbeer.qa/com.whirlpool.ted.View.DashBoardActivity -S' 以代码 1' 退出;标准错误:'java.lang.SecurityException:权限拒绝:开始意图 flg = 0x10000000 cmp=com.consul.android.smartbeer.qa/com.whirlpool.ted.View.DashBoardActivity 启动参数=MultiScreenLaunchParams mDisplayId=0 mBaseDisplayId=0 mFlags=0 from null (pid=867, uid=2000) 未从 uid 10226 导出 在 android.os.Parcel.readException(Parcel.java:1703) 在 android.os.Parcel.readException(Parcel.java:1653) 在 android.app.ActivityManagerProxy.startActivityAndWait(ActivityManagerNative.java:3680) 在 com.android.commands.am.Am.runStart(Am.java:658) 在 com.android.commands.am.Am.onRun(Am.java:392) 在 com.android.internal.os.BaseCommand.run(BaseCommand.java:51) 在 com.android.commands.am.Am.main(Am.java:125) 在 com.android.internal.os.RuntimeInit.nativeFinishInit(本机方法) 在 com.android.internal.os.RuntimeInit.main(RuntimeInit.java:316)'; 代码:'1'(警告:服务器未提供任何堆栈跟踪 信息)命令持续时间或超时:28.33 秒构建信息: 版本:'3.9.1',修订:'63f7b50',时间: '2018-02-07T22:42:22.379Z' 系统信息:主机:'LAPTOP-PFJQUV00',ip: '192.168.116.1',os.name:'Windows 10',os.arch:'amd64',os.version: '10.0', java.version: '1.8.0_152' 驱动程序信息: driver.version: AndroidDriver 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(未知 来源)在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知 来源)在 java.lang.reflect.Constructor.newInstance(未知来源) 在 org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:214) 在 org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:166) 在 org.openqa.selenium.remote.JsonWireProtocolResponse.lambda$new$0(JsonWireProtocolResponse.java:53) 在 org.openqa.selenium.remote.JsonWireProtocolResponse.lambda$getResponseFunction$2(JsonWireProtocolResponse.java:91) 在 org.openqa.selenium.remote.ProtocolHandshake.lambda$createSession$0(ProtocolHandshake.java:123) 在 java.util.stream.ReferencePipeline$3$1.accept(Unknown Source) at java.util.Spliterators$ArraySpliterator.tryAdvance(未知来源)在 java.util.stream.ReferencePipeline.forEachWithCancel(未知来源) 在 java.util.stream.AbstractPipeline.copyIntoWithCancel(未知 来源)在 java.util.stream.AbstractPipeline.copyInto(未知来源) 在 java.util.stream.AbstractPipeline.wrapAndCopyInto(未知来源) 在 java.util.stream.FindOps$FindOp.evaluateSequential(未知来源) 在 java.util.stream.AbstractPipeline.evaluate(Unknown Source) 在 java.util.stream.ReferencePipeline.findFirst(未知来源)在 org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:126) 在 org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:73) 在 org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:138) 在 io.appium.java_client.remote.AppiumCommandExecutor.execute(AppiumCommandExecutor.java:89) 在 org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:601) 在 io.appium.java_client.DefaultGenericMobileDriver.execute(DefaultGenericMobileDriver.java:42) 在 io.appium.java_client.AppiumDriver.execute(AppiumDriver.java:1) 在 io.appium.java_client.android.AndroidDriver.execute(AndroidDriver.java:1) 在 org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:219) 在 org.openqa.selenium.remote.RemoteWebDriver.(RemoteWebDriver.java:142) 在 io.appium.java_client.DefaultGenericMobileDriver.(DefaultGenericMobileDriver.java:38) 在 io.appium.java_client.AppiumDriver.(AppiumDriver.java:83) 在 io.appium.java_client.AppiumDriver.(AppiumDriver.java:93) 在 io.appium.java_client.android.AndroidDriver.(AndroidDriver.java:72) 在 test.FacebookLoginTest.testLoginFB(FacebookLoginTest.java:30) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)在 java.lang.reflect.Method.invoke(未知来源)在 org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 在 org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 在 org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 在 org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 在 org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 在 org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 在 org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 在 org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 在 org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 在 org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 在 org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 在 org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 在 org.junit.runners.ParentRunner.run(ParentRunner.java:363) 在 org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 在 org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)

我正在尝试运行一个简单的登录测试,但我陷入了困境。 Appium 没有打开应用程序 :(

这是Java中的类代码:

    package test;

    import io.appium.java_client.android.AndroidDriver;

    import java.net.MalformedURLException; import java.net.URL; 
    import java.util.concurrent.TimeUnit; 
    import org.openqa.selenium.remote.DesiredCapabilities; 
    import io.appium.java_client.AppiumDriver; 
    import io.appium.java_client.MobileElement; 
    import io.appium.java_client.android.AndroidDriver;

    import org.junit.Test;

    public class TedLoginTest 

    @Test

    public void testLoginFB() throws MalformedURLException, InterruptedException       

    DesiredCapabilities capabilities = new DesiredCapabilities() ;  

    capabilities.setCapability("automationName","Appium");  
    capabilities.setCapability("platformnName","Android");  
    capabilities.setCapability("platformVersion","7.0");    
    capabilities.setCapability("deviceName","Lucas" );  
    capabilities.setCapability("udid", "5210ce98fa7eb4b3");     
    capabilities.setCapability("app","C:\\Users\\lucas\\Downloads\\TED.apk");
    capabilities.setCapability("appActivity", "com.whirlpool.ted.View.DashboardActivity");
    AndroidDriver driver = new AndroidDriver (new URL ("http://0.0.0.0:4723/wd/hub"), capabilities) ;
    driver.manage().timeouts().implicitlyWait(100,TimeUnit.SECONDS);

    driver.findElementByAndroidUIAutomator("new UiSelector().resourceId(\"com.consul.android.smartbeer.qa:id/edEmail\")").sendKeys("tedusp01@yahoo.com");
    driver.findElementByAndroidUIAutomator("new UiSelector().resourceId(\"com.consul.android.smartbeer.qa:id/edPassword\")").sendKeys("Smart2000");
    driver.findElementByAndroidUIAutomator("new UiSelector().resourceId(\"com.consul.android.smartbeer.qa:id/login\").text(\"Entrar\")").click();
    Thread.sleep(8000);

     
    

有谁知道我做错了什么?我错过了任何导入还是语法错误?

【问题讨论】:

【参考方案1】:

在搜索 SO 时,我发现了许多与此类似的问题,它们的答案或多或少都相同。


您需要在您声明此 Activity 的 AndroidManifest.xml 文件中设置 android:exported="true"

<activity
    android:name="com.example.lib.MainActivity"
    android:label="LibMain" 
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" >
        </action>
    </intent-filter>
</activity>

参考:https://***.com/a/19829733/2533443

【讨论】:

以上是关于如何使用 Eclipse 在 Appium 上运行脚本测试?的主要内容,如果未能解决你的问题,请参考以下文章

通过 Appium 在 Android 操作系统上运行 Selenium 测试

Appium:如何在开始测试运行 appium-testng 之前使用 java 在 aws 设备场设备上以编程方式创建 google 帐户

如何在 Mac OS 上设置 Appium 以在 Android 和 iOS 设备上运行来自 JAVA 类的自动化测试

如何实现Appium每次运行可不用卸载手机上的Appium Settings 和Unlock

当我尝试运行 appium 自动化项目时,方法 getBinaryPath() 未定义为 Eclipse 中显示的类型 WebDriverManager 错误

如何在 iOS 模拟器上使用某种语言键盘启动 Appium 测试