Trouble getting the "getting started" example to work

Hello,

I am trying to get the “getting started” test to work as described here: https://appium.io/docs/en/about-appium/getting-started/index.html

I have appium setup and here is my appium-doctor --android output:

info AppiumDoctor Appium Doctor v.1.10.0
info AppiumDoctor ### Diagnostic for necessary dependencies starting ###
info AppiumDoctor  ✔ The Node.js binary was found at: /usr/bin/node
info AppiumDoctor  ✔ Node version is 8.10.0
info AppiumDoctor  ✔ ANDROID_HOME is set to: /home/calvin/Android/Sdk
info AppiumDoctor  ✔ JAVA_HOME is set to: /usr/lib/jvm/java-8-openjdk-amd64
info AppiumDoctor  ✔ adb exists at: /home/calvin/Android/Sdk/platform-tools/adb
info AppiumDoctor  ✔ android exists at: /home/calvin/Android/Sdk/tools/android
info AppiumDoctor  ✔ emulator exists at: /home/calvin/Android/Sdk/tools/emulator
info AppiumDoctor  ✔ Bin directory of $JAVA_HOME is set
info AppiumDoctor ### Diagnostic for necessary dependencies completed, no fix needed. ###
info AppiumDoctor 
info AppiumDoctor ### Diagnostic for optional dependencies starting ###
info AppiumDoctor  ✔ Python required by node-gyp (used by heapdump) is installed at: /usr/bin/python. Installed version is: 2.7.15
WARN AppiumDoctor  ✖ opencv4nodejs cannot be found.
info AppiumDoctor  ✔ ffmpeg is installed at: /usr/bin/ffmpeg. ffmpeg version 3.4.6-0ubuntu0.18.04.1 Copyright (c) 2000-2019 the FFmpeg developers
WARN AppiumDoctor  ✖ mjpeg-consumer cannot be found.
WARN AppiumDoctor  ✖ bundletool.jar cannot be found
info AppiumDoctor ### Diagnostic for optional dependencies completed, 3 fixes possible. ###
info AppiumDoctor 
info AppiumDoctor ### Optional Manual Fixes ###
info AppiumDoctor The configuration can install optionally. Please do the following manually:
WARN AppiumDoctor  ➜ Why opencv4nodejs is needed and how to install it: https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/image-comparison.md
WARN AppiumDoctor  ➜ mjpeg-consumer module is required to use MJPEG-over-HTTP features. Please install it with `npm i -g mjpeg-consumer`.
WARN AppiumDoctor  ➜ bundletool.jar is used to handle Android App Bundle. Please read http://appium.io/docs/en/writing-running-appium/android/android-appbundle/ to install it
info AppiumDoctor 
info AppiumDoctor ###
info AppiumDoctor 
info AppiumDoctor Bye! Run appium-doctor again when all manual fixes have been applied!
info AppiumDoctor 

That seems to suggest I am okay to go.

I started appium on a terminal:

[Appium] Welcome to Appium v1.13.0
[Appium] Appium REST http interface listener started on 0.0.0.0:4723

I have the test APK (https://github.com/appium/appium/raw/master/sample-code/apps/ApiDemos-debug.apk) downloaded.
Here is my test.js file:

const wdio = require("webdriverio");

const opts = {
  port: 4723,
  capabilities: {
    platformName: "Android",
    platformVersion: "8.0",
    deviceName: "Android Emulator",
    app: "/home/calvin/Downloads/ApiDemos-debug.apk",
    automationName: "UiAutomator2"
  }
};

const client = wdio.remote(opts);

describe('Doing a hello world', function () {
  it('should do a hello world spin', async function () {
    const field = await client.$("~TextField1");
    await field.setValue("Hello World!");
    const value = await field.getValue();
    assert.equal(value,"Hello World!");
  });
});

It says "Simply save it and execute it using node".

I ran it using $(npm bin)/mocha test.js

2019-06-27T07:11:47.498Z INFO webdriver: [POST] http://localhost:4723/wd/hub/session
2019-06-27T07:11:47.500Z INFO webdriver: DATA { capabilities: 
   { alwaysMatch: 
      { platformName: 'Android',
        platformVersion: '8.0',
        deviceName: 'Android Emulator',
        app: '/home/calvin/Downloads/ApiDemos-debug.apk',
        automationName: 'UiAutomator2' },
     firstMatch: [ {} ] },
  desiredCapabilities: 
   { platformName: 'Android',
     platformVersion: '8.0',
     deviceName: 'Android Emulator',
     app: '/home/calvin/Downloads/ApiDemos-debug.apk',
     automationName: 'UiAutomator2' } }


  Doing a hello world
    1) should do a hello world spin


  0 passing (26ms)
  1 failing

  1) Doing a hello world
       should do a hello world spin:
     TypeError: client.$ is not a function
      at Context.<anonymous> (test.js:24:32)

Any help on how to get this first test passing? Running that opens up the app on the Android emulator.