简体   繁体   中英

Appium Server not detect connected device even when able to grab the udid from “adb devices” from cmd

I'm working AppiumDriver setup where based on the number of mobile devices/emulators, which during the setup for each driver will setup a appium server for each driver created. However, when a server is created and initialize the AppiumDriver as either Android or IOS, the server generates an error that it can't connect to the device even though it was able to retrieve the device no problem from cmd: "adb devices", and prints the correct udid. Is there something I'm missing or forgot to include?

Here are the details:

The code (3 different programs I've set up):

public class BaseTest {

protected AppiumDriver<MobileElement> driver;
protected WebDriverWait wait;

//Change to default mobile Layout classes for anything on the screen
public PageObject pageObject = null;

public AppiumDriverSetup createDrivers = new AppiumDriverSetup();



@BeforeClass(alwaysRun=true)
public void setupDrivers() throws IOException {
    createDrivers.makeList();
    for(AppiumDriver<MobileElement> driver : createDrivers.getActiveList()){
        this.driver = driver;
        TLDriverFactory.setTLDriver(driver);
        wait = new WebDriverWait(TLDriverFactory.getTLDriver(), 10);
    }
}

@Test
public void testActivation() {
    assertTrue(driver != null);
    pageObject = new PageObject(TLDriverFactory.getTLDriver());
    driver.get("www.google.com");
}



public class AppiumDriverSetup {

enum Devices {
    ANDROID, IOS;
}

public static int deviceNum = 0;

public AppiumDriver<MobileElement> driver;

private List<Object> newDevice = new ArrayList<Object>();

private static List<AppiumDriver<MobileElement>> activeList = Collections.synchronizedList(new ArrayList<AppiumDriver<MobileElement>>());

AppOrBrowser determinePlatType = new AppOrBrowser();

ActiveAppiumPorts activePorts = new ActiveAppiumPorts();

public void makeList () throws IOException {
    Runtime rt = Runtime.getRuntime();
    Process p = rt.exec("adb devices");

    BufferedReader output = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line ="";

    while ((line = output.readLine()) != null) {
        if(StringUtils.isEmpty(line) || line.startsWith("List of devices attached")) {
            continue;
        }
        System.out.println(line);
        String [] serialNum = line.replace(" ", "").split("device");
        newDevice.add(Devices.ANDROID);
        newDevice.add(serialNum[0]);
        driver = setCaps((Devices)newDevice.get(0), (String)newDevice.get(1));
        activeList.add(driver);
    }

    //Implement the IOS Process
}

private AppiumDriver<MobileElement> setCaps(Devices d, String udid) throws MalformedURLException{
    AppiumDriver<MobileElement> driver = null;
    DesiredCapabilities cap = new DesiredCapabilities();

    String deviceName = "device"+ ++deviceNum;
    cap.setCapability(MobileCapabilityType.DEVICE_NAME, deviceName);
    if(d == Devices.ANDROID) {
        cap.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
    }
    if(d == Devices.IOS) {
        cap.setCapability(MobileCapabilityType.PLATFORM_NAME, "IOS");
    }
    cap.setCapability(MobileCapabilityType.UDID, udid);
    cap.setCapability(MobileCapabilityType.NEW_COMMAND_TIMEOUT, "4000");
    cap.setCapability("noReset", false);

    //Help setup which browser or to run on an app.
    cap = determinePlatType.determinePlat(cap);

    //Generate AppiumPorts Class and retrieve generated port number.
    activePorts.generateServer();
    System.out.println("Argument to driver object : " + activePorts.getAppiumURL());
    switch (d) {
        case ANDROID: 
            driver = new AndroidDriver<MobileElement>(new URL(activePorts.getAppiumURL()), cap);
            break;
        case IOS:
            driver = new IOSDriver<MobileElement>(new URL(activePorts.getAppiumURL()), cap);
            break;
    }


    return driver;
}

public List<AppiumDriver<MobileElement>> getActiveList(){
    return activeList;
}

public void tearDown() {
    driver.quit();
}

}



public class ActiveAppiumPorts {

private int portNum = 0;

private String appiumPort = "500" + portNum;
private String serverIp = "127.0.0.1";

public String getAppiumURL() {
    String serverURL = "http://" + serverIp + ":" + appiumPort + "/wd/hub";
    portNum++;
    return serverURL;
}

public void generateServer() {
    Runtime runtime = Runtime.getRuntime();
    try {
        runtime.exec("cmd.exe /c start cmd.exe /k \"appium -a " + serverIp + " -p " + appiumPort + 
                "--session-override -dc \" {\"\"noReset\"\": \"\"false\"\"}\"\"");
        Thread.sleep(10000);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InterruptedException r) {
        r.printStackTrace();
    }

}

public void stopServer() {
    Runtime runtime = Runtime.getRuntime();
    try {
        runtime.exec("taskkill /F /IM node.exe");
        runtime.exec("taskkill /F /IM cmd.exe");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

The Appium Server logs:

[Appium] Welcome to Appium v1.8.1
[Appium] Non-default server args:
[Appium]   address: 127.0.0.1
[Appium]   port: 5000
[Appium]   defaultCapabilities: {
[Appium]     noReset: false
[Appium]   }
[Appium] Default capabilities, which will be added to each request unless overridden by desired capabilities:
[Appium]   noReset: false
[Appium] Appium REST http interface listener started on 127.0.0.1:5000
[HTTP] --> POST /wd/hub/session
[HTTP] {"desiredCapabilities":{"browserName":"Chrome","deviceName":"device1","newCommandTimeout":"4000","noReset":false,"platformName":"Android","udid":"192.168.174.102:5555\t"},"capabilities":{"desiredCapabilities":{"browserName":"Chrome","deviceName":"device1","newCommandTimeout":"4000","noReset":false,"platformName":"Android","udid":"192.168.174.102:5555\t"},"firstMatch":[{"browserName":"Chrome","platformName":"android"}]}}
[debug] [MJSONWP] Calling AppiumDriver.createSession() with args: [{"browserName":"Chrome","deviceName":"device1","newCommandTimeout":"4000","noReset":false,"platformName":"Android","udid":"192.168.174.102:5555\t"},null,{"desiredCapabilities":{"browserName":"Chrome","deviceName":"device1","newCommandTimeout":"4000","noReset":false,"platformName":"Android","udid":"192.168.174.102:5555\t"},"firstMatch":[{"browserName":"Chrome","platformName":"android"}]}]
[debug] [BaseDriver] Event 'newSessionRequested' logged at 1534263446888 (09:17:26 GMT-0700 (Pacific Daylight Time))
[BaseDriver] The capabilities ["noReset"] are not standard capabilities and should have an extension prefix
[BaseDriver] Boolean capability passed in as string. Functionality may be compromised.
[Appium] Could not parse W3C capabilities: 'deviceName' can't be blank. Falling back to JSONWP protocol.
[Appium] The following capabilities were provided in the JSONWP desired capabilities that are missing in W3C capabilities: ["noReset","browserName","deviceName","newCommandTimeout","platformName","udid"]. Falling back to JSONWP protocol.
[Appium] Creating new AndroidDriver (v2.7.0) session
[Appium] Capabilities:
[Appium]   noReset: false
[Appium]   browserName: Chrome
[Appium]   deviceName: device1
[Appium]   newCommandTimeout: 4000
[Appium]   platformName: Android
[Appium]   udid: 192.168.174.102:5555
[debug] [BaseDriver] Creating session with MJSONWP desired capabilities: {"noReset":false,"browserNa...
[BaseDriver] Capability 'newCommandTimeout' changed from string ('4000') to integer (4000). This may cause unexpected behavior
[BaseDriver] Session created with session id: 9beb9dd1-e6c3-4fa2-9cd6-7fb55d4a820b
[debug] [AndroidDriver] Getting Java version
[AndroidDriver] Java version is: 1.8.0_171
[AndroidDriver] We're going to run a Chrome-based session
[AndroidDriver] Chrome-type package and activity are com.android.chrome and com.google.android.apps.chrome.Main
[ADB] Checking whether adb is present
[ADB] Found 3 'build-tools' folders under 'C:\Users\<username>\AppData\Local\Android\Sdk' (newest first):
[ADB]     C:/Users/<username>/AppData/Local/Android/Sdk/build-tools/28.0.0-rc1
[ADB]     C:/Users/<username>/AppData/Local/Android/Sdk/build-tools/27.0.3
[ADB]     C:/Users/<username>/AppData/Local/Android/Sdk/build-tools/26.0.2
[ADB] Using adb.exe from C:\Users\<username>\AppData\Local\Android\Sdk\platform-tools\adb.exe
[AndroidDriver] Retrieving device list
[debug] [ADB] Trying to find a connected android device
[debug] [ADB] Getting connected devices...
[debug] [ADB] 2 device(s) connected
[AndroidDriver] Error: Device 192.168.174.102:5555       was not in the list of connected devices
[AndroidDriver]     at Object.wrappedLogger.errorAndThrow (C:\Users\<username>\AppData\Roaming\npm\node_modules\appium\node_modules\appium-support\lib\logging.js:78:13)
[AndroidDriver]     at Object.callee$0$0$ (C:\Users\<username>\AppData\Roaming\npm\node_modules\appium\node_modules\appium-android-driver\lib\android-helpers.js:161:16)
[AndroidDriver]     at tryCatch (C:\Users\<username>\AppData\Roaming\npm\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:67:40)
[AndroidDriver]     at GeneratorFunctionPrototype.invoke [as _invoke] (C:\Users\<username>\AppData\Roaming\npm\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:315:22)
[AndroidDriver]     at GeneratorFunctionPrototype.prototype.(anonymous function) [as next] (C:\Users\<username>\AppData\Roaming\npm\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:100:21)
[AndroidDriver]     at GeneratorFunctionPrototype.invoke (C:\Users\<username>\AppData\Roaming\npm\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:136:37)
[AndroidDriver]     at <anonymous>
[debug] [AndroidDriver] Shutting down Android driver
[debug] [AndroidDriver] Called deleteSession but bootstrap wasn't active
[debug] [BaseDriver] Event 'newSessionStarted' logged at 1534263447383 (09:17:27 GMT-0700 (Pacific Daylight Time))
[MJSONWP] Encountered internal error running command: Error: Device 192.168.174.102:5555         was not in the list of connected devices
[MJSONWP]     at Object.wrappedLogger.errorAndThrow (C:\Users\<username>\AppData\Roaming\npm\node_modules\appium\node_modules\appium-support\lib\logging.js:78:13)
[MJSONWP]     at Object.callee$0$0$ (C:\Users\<username>\AppData\Roaming\npm\node_modules\appium\node_modules\appium-android-driver\lib\android-helpers.js:161:16)
[MJSONWP]     at tryCatch (C:\Users\<username>\AppData\Roaming\npm\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:67:40)
[MJSONWP]     at GeneratorFunctionPrototype.invoke [as _invoke] (C:\Users\<username>\AppData\Roaming\npm\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:315:22)
[MJSONWP]     at GeneratorFunctionPrototype.prototype.(anonymous function) [as next] (C:\Users\<username>\AppData\Roaming\npm\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:100:21)
[MJSONWP]     at GeneratorFunctionPrototype.invoke (C:\Users\<username>\AppData\Roaming\npm\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:136:37)
[MJSONWP]     at <anonymous>
[HTTP] <-- POST /wd/hub/session 500 619 ms - 207

The Mvn logs:

 [INFO] Running TestSuite
  192.168.174.102:5555    device
  chrome
  Argument to driver object : http://127.0.0.1:5000/wd/hub
  [ERROR] Tests run: 2, Failures: 1, Errors: 0, Skipped: 1, Time elapsed: 
  12.489 s <<< FAILURE! - in TestSuite
  [ERROR] setupDrivers(BaseTest.BaseTest)  Time elapsed: 12.373 s  <<< 
  FAILURE!
  org.openqa.selenium.WebDriverException:
  An unknown server-side error occurred while processing the command. 
  Original error: Device 192.168.174.102:5555      was not in the list of 
  connected devices (WARNING: The server did not provide any stacktrace 
  information)
  Command duration or timeout: 718 milliseconds 
  Build info: version: '3.11.0', revision: 'e59cfb3', time: '2018-03- 
  11T20:26:55.152Z'
  System info: host: 'LAPTOP-L1BFDSGL', ip: '192.168.174.2', os.name: 
  'Windows 10', os.arch: 'x86', os.version: '10.0', java.version: 
  '1.8.0_181'
  Driver info: driver.version: AndroidDriver
            at BaseTest.BaseTest.setupDrivers(BaseTest.java:34)

TestNG Report:

org.openqa.selenium.WebDriverException: An unknown server-side error occurred while processing the command. Original error: Device 192.168.174.102:5555  was not in the list of connected devices (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 718 milliseconds
Build info: version: '3.11.0', revision: 'e59cfb3', time: '2018-03-11T20:26:55.152Z'
System info: host: 'LAPTOP-L1BFDSGL', ip: '192.168.174.2', os.name: 'Windows 10', os.arch: 'x86', os.version: '10.0', java.version: '1.8.0_181'
Driver info: driver.version: AndroidDriver
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:214)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:166)
    at org.openqa.selenium.remote.JsonWireProtocolResponse.lambda$new$0(JsonWireProtocolResponse.java:53)
    at org.openqa.selenium.remote.JsonWireProtocolResponse.lambda$getResponseFunction$2(JsonWireProtocolResponse.java:91)
    at org.openqa.selenium.remote.ProtocolHandshake.lambda$createSession$0(ProtocolHandshake.java:123)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.Spliterators$ArraySpliterator.tryAdvance(Spliterators.java:958)
    at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
    at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:464)
    at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:126)
    at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:73)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:136)
    at io.appium.java_client.remote.AppiumCommandExecutor.execute(AppiumCommandExecutor.java:129)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:545)
    at io.appium.java_client.DefaultGenericMobileDriver.execute(DefaultGenericMobileDriver.java:42)
    at io.appium.java_client.AppiumDriver.execute(AppiumDriver.java:1)
    at io.appium.java_client.android.AndroidDriver.execute(AndroidDriver.java:1)
    at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:209)
    at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:132)
    at io.appium.java_client.DefaultGenericMobileDriver.<init>(DefaultGenericMobileDriver.java:38)
    at io.appium.java_client.AppiumDriver.<init>(AppiumDriver.java:84)
    at io.appium.java_client.AppiumDriver.<init>(AppiumDriver.java:94)
    at io.appium.java_client.android.AndroidDriver.<init>(AndroidDriver.java:80)
    at AppiumDriverSetUp_Lib.AppiumDriverSetup.setCaps(AppiumDriverSetup.java:87)
    at AppiumDriverSetUp_Lib.AppiumDriverSetup.makeList(AppiumDriverSetup.java:57)
    at BaseTest.BaseTest.setupDrivers(BaseTest.java:34)
... Removed 34 stack frames

What was causing the issue was the issue was the empty space that was added when storing the udid in SerialNum[0]. So when the Appium servers were trying to connect to the devices, the extra space was getting in the way. I edited the udid String value using trim() to remove any extra space:

private AppiumDriver<MobileElement> setCaps(Devices d, String udid) throws MalformedURLException{
    AppiumDriver<MobileElement> driver = null;
    DesiredCapabilities cap = new DesiredCapabilities();

    String deviceName = "device"+ ++deviceNum;
    cap.setCapability(MobileCapabilityType.DEVICE_NAME, deviceName);
    if(d == Devices.ANDROID) {
        cap.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
    }
    if(d == Devices.IOS) {
        cap.setCapability(MobileCapabilityType.PLATFORM_NAME, "IOS");
    }
    cap.setCapability(MobileCapabilityType.UDID, udid.trim());
    cap.setCapability(MobileCapabilityType.NEW_COMMAND_TIMEOUT, "4000");
    cap.setCapability("noReset", false);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM