appium / java-client

Java language binding for writing Appium Tests, conforms to W3C WebDriver Protocol
Apache License 2.0
1.21k stars 755 forks source link

Wrong JSON for chromeOptions #1336

Closed parunruaivo closed 4 years ago

parunruaivo commented 4 years ago

Description

When trying to disable the w3c using the following lines

val chromeOptions = new ChromeOptions();
chromeOptions.setExperimentalOption("w3c", false);
desiredCapabilities.setCapability(ChromeOptions.CAPABILITY, chromeOptions);

When parsing the capabilities in the class AppiumServiceBuilder the chromeOptions is parsed with String.valueOf(value) in the method parseCapabilitiesIfWindows, resulting in \"goog:chromeOptions\": {args=[], extensions=[], w3c=false}, then when executing the command line in the method executeAsync() of the class OsProcess the org.apache.commons.exec.CommandLine cl; is as below

[C:\Program Files\nodejs\node.exe, C:\Program Files\nodejs\node_modules\appium\build\lib\main.js, --port, 39775, --address, 127.0.0.1, --chromedriver-executable, D:\TESTRIGOR\Vagrant\temp\81\chromedriver.exe, --default-capabilities, {\"acceptSslCerts\": true, \"autoGrantPermissions\": true, \"automationName\": \"UIAutomator2\", \"avd\": \"android-26-pixel-xl\", \"avdArgs\": \"-no-audio -writable-system -ports 0,5563\", \"avdLaunchTimeout\": 180000, \"avdReadyTimeout\": 180000, \"browserName\": \"chrome\", \"clearSystemFiles\": true, \"deviceName\": \"android-26-pixel-xl\", \"disableAndroidWatchers\": true, \"goog:chromeOptions\": {args=[], extensions=[], w3c=false}, \"nativeWebScreenshot\": true, \"newCommandTimeout\": 900, \"platformName\": \"Android\", \"platformVersion\": \"8.0.0\", \"uiautomator2ServerInstallTimeout\": 120000}]

Having a wrong JSON because of the args=[], extensions=[], w3c=false

Workaround

I created the class

@FieldDefaults(level = PRIVATE, makeFinal = true)
@RequiredArgsConstructor
public class W3cOption {
    boolean value;

    public Map<String, Object> asMap() {
        return ImmutableMap.of("w3c", value);
    }

    @Override
    public String toString() {
        if (Platform.getCurrent().is(Platform.WINDOWS)) {
            return "{\\\"w3c\\\": " + value + "}";
        }
        return "{\"w3c\": " + value + "}";
    }
}

And added to capabilities

desiredCapabilities.setCapability(MobileCapabilityType.FORCE_MJSONWP, true);
desiredCapabilities.setCapability(ChromeOptions.CAPABILITY, new W3cOption(false));

Environment

Java client build version: 7.3.0 Appium server version: 1.17.0 Desktop OS: Windows 8.1 Node.js version: 12.16.2 Mobile platform: Android 8.0 Emulator

Exception Stacktraces

usage: C:\Program Files\nodejs\node_modules\appium\build\lib\main.js
       [-h] [-v] [--shell] [--allow-cors] [--reboot] [--ipa IPA] [-a ADDRESS]
       [-p PORT] [-pa BASEPATH] [-ca CALLBACKADDRESS] [-cp CALLBACKPORT]
       [-bp BOOTSTRAPPORT] [-r BACKENDRETRIES] [--session-override] [-l]
       [-g LOGFILE]
       [--log-level {info,info:debug,info:info,info:warn,info:error,warn,warn:debug,warn:info,warn:warn,warn:error,error,error:debug,error:info,error:warn,error:error,debug,debug:debug,debug:info,debug:warn,debug:error}]
       [--log-timestamp] [--local-timezone] [--log-no-colors] [-G WEBHOOK]
       [--safari] [--default-device] [--force-iphone] [--force-ipad]
C: \ P r o g r a[m- -trFaicleetse\mnpoldaetjes \AnUoTdOeM_AmToIdOuNlTeRsA\CaEpTpEiMuPmL\ATbEuPiAlTdH\]l
i    b   \[m-a-iinn.sjtsr:uments INSTRUMENTSPA error: aTrgHu]m e[nt "---dnco/d-e-cdoenffaiugl tNO-DEcCaOpNaFbIiGl]i
    t   i[-ersa "R:OB OTIADnDRvESaSl]i [d- rppa rRsOeBDOTePfORTa]u
     l  [-t-cCharopmesdr ivvearl-euxeecu:t ab{l"e aCHROMcEcDeptSslCReIrVtEsR"E:X EtCrUuTeA,B L"Ea]u t[o-G-rsahnotwP-ecromnifsisgion]s"
 :   t r u e ,[ -"-anuot-opmearmtsi-ocnhNeacmke]" :[ -"-UsItAruitcotm-actaopr2s"],  ["-a-vids"o:l a"taen-dsriomi-dd-e2v6i-cpei]x
   e    l[--x-lt"m,p  "TaMvPdDAIrRg]s "[:- -"t-rnaoc-ea-uddiiro  T-RwACrEiDtIaRb]l e[--syste-mde bu-g-ploog-rsptacsi ng0]
  ,  5 5 6 3["-,- s"uapvpdrLeasusn-cahdTbi-mkeiolult-"s:e 1r8v0e0r0]0 ,[ -"-alvodRnega-dsytTaicmketoruatc"e:] 
 1  8 0 0 0 0[,- -"wberbokwiste-rdNeabmueg"-:p r"ocxhyr-opmoer"t,  W"EcBleKIaTrDSEyBsUtGePmRFOiXlYPeOsR"T:] 
 t  r u e ,  ["-d-ewveibcderNiavmeer"a:g e"natn-dprooritd -W2D6A-LpOiCxAeLlP-OxRlT"],  ["-ddics aDbElFeAAUnLdTrCoAiPdWAaBtIcLhIeTIrESs]"
 :    t r u e[,- -"rgeoloagx:ecdh-rsoemceuOrpittiyo]n s[-"-: a{lalrogws-=i[n]s,e ceuxrtee nAsLiLoOnWsI=NS[E]C,U REw]
  3  c = f a[l-s-ed}e,n y"-niantsievceuWreeb SDcErNeYeInNsShEoCtU"R:E ]t
 r  u e ,   "[n-e-wCcoommmmaannddT-itmiemoeuotu"t:  9D0E0F,A U"LpTlCaOtMfMoArNmDNTaImMeE"O:U T"]A n[d-rko]i
 d  " ,   " p[l-a-tpfloartmfVoerrms-inoanm"e PLA:T F"O8R.M0N.A0M"E,]  ["-u-ipaluattofmoartmo-rv2eSresrivoenr IPnLsAtTaFlOlRTMiVmEReSIoOuNt]"
 :    1 2 0 0[0-0}-
automation-name AUTOMATIONNAME] [--device-name DEVICENAME]
       [--browser-name BROWSERNAME] [--app APP] [-lt LAUNCHTIMEOUT]
       [--language LANGUAGE] [--locale LOCALE] [-U UDID]
       [--orientation ORIENTATION] [--no-reset] [--full-reset]
       [--app-pkg APPPACKAGE] [--app-activity APPACTIVITY]
       [--app-wait-package APPWAITPACKAGE]
       [--app-wait-activity APPWAITACTIVITY]
       [--device-ready-timeout DEVICEREADYTIMEOUT]
       [--android-coverage ANDROIDCOVERAGE] [--avd AVD] [--avd-args AVDARGS]
       [--use-keystore] [--keystore-path KEYSTOREPATH]
       [--keystore-password KEYSTOREPASSWORD] [--key-alias KEYALIAS]
       [--key-password KEYPASSWORD] [--intent-action INTENTACTION]
       [--intent-category INTENTCATEGORY] [--intent-flags INTENTFLAGS]
       [--intent-args OPTIONALINTENTARGUMENTS] [--dont-stop-app-on-reset]
       [--calendar-format CALENDARFORMAT] [--native-instruments-lib]
       [--keep-keychains] [--localizable-strings-dir LOCALIZABLESTRINGSDIR]
       [--show-ios-log] [--async-trace] [--chromedriver-port CHROMEDRIVERPORT]

Appium Logs

If I fix the JSON to \"goog:chromeOptions\": {\"args\":[], \"extensions\":[], \"w3c\":false} then it works as the following log.

[Appium] Welcome to Appium v1.17.0
[Appium] Non-default server args:
[Appium]   address: 127.0.0.1
[Appium]   port: 6789
[Appium]   chromedriverExecutable:  \temp\81\chromedriver.exe
[Appium]   defaultCapabilities: {
[Appium]     acceptSslCerts: true
[Appium]     autoGrantPermissions: true
[Appium]     automationName: UIAutomator2
[Appium]     avd: android-26-pixel-xl
[Appium]     avdArgs: -no-audio -writable-system -ports 0,5563
[Appium]     avdLaunchTimeout: 180000
[Appium]     avdReadyTimeout: 180000
[Appium]     browserName: chrome
[Appium]     clearSystemFiles: true
[Appium]     deviceName: android-26-pixel-xl
[Appium]     disableAndroidWatchers: true
[Appium]     goog:chromeOptions: {
[Appium]       args: {
[Appium]       }
[Appium]       extensions: {
[Appium]       }
[Appium]       w3c: false
[Appium]     }
[Appium]     nativeWebScreenshot: true
[Appium]     newCommandTimeout: 900
[Appium]     platformName: Android
[Appium]     platformVersion: 8.0.0
[Appium]     uiautomator2ServerInstallTimeout: 120000
[Appium]   }
[Appium] Default capabilities, which will be added to each request unless overridden by desired capabilities:
[Appium]   acceptSslCerts: true
[Appium]   autoGrantPermissions: true
[Appium]   automationName: UIAutomator2
[Appium]   avd: android-26-pixel-xl
[Appium]   avdArgs: -no-audio -writable-system -ports 0,5563
[Appium]   avdLaunchTimeout: 180000
[Appium]   avdReadyTimeout: 180000
[Appium]   browserName: chrome
[Appium]   clearSystemFiles: true
[Appium]   deviceName: android-26-pixel-xl
[Appium]   disableAndroidWatchers: true
[Appium]   goog:chromeOptions: {
[Appium]     args: {
[Appium]     }
[Appium]     extensions: {
[Appium]     }
[Appium]     w3c: false
[Appium]   }
[Appium]   nativeWebScreenshot: true
[Appium]   newCommandTimeout: 900
[Appium]   platformName: Android
[Appium]   platformVersion: 8.0.0
[Appium]   uiautomator2ServerInstallTimeout: 120000
[Appium] Appium REST http interface listener started on 127.0.0.1:6789
[HTTP] --> GET /wd/hub/status
[HTTP] {}
[debug] [GENERIC] Calling AppiumDriver.getStatus() with args: []
[debug] [GENERIC] Responding to client with driver.getStatus() result: {"build":{"version":"1.17.0"}}
[HTTP] <-- GET /wd/hub/status 200 16 ms - 68
[HTTP] 
mykola-mokhnach commented 4 years ago

@parunruaivo thanks for the issue report.

Please check if https://github.com/appium/java-client/pull/1337 works for you

parunruaivo commented 4 years ago

@parunruaivo thanks for the issue report.

Please check if #1337 works for you

Thanks, I validated it and is working great.