Skip to content

Latest commit

 

History

History
258 lines (229 loc) · 10.3 KB

appium-packages.md

File metadata and controls

258 lines (229 loc) · 10.3 KB

Appium in a Nutshell

Appium packages

appium

  • runs basic checks
    • node version (>= 5)
    • CLI arguments checks
      • contains all available and supported CLI arguments
      • check for deprecation and mutual exclusion
  • put logging together
    • mixture out of npmlog, winston and a custom logger
  • initiates AppiumDriver (extends Basedriver)
    • assigns iOS/Android/Selendroid/Fake driver to session
    • creates/deletes Appium session
  • starts baseServer (appium-express)
    • passes routes given by driver

appium-express (part of appium-base-driver)

  • starts express server (allows x-domain-origin)
  • initialises routes from AppiumDriver
  • timeout handling
  • serves a static page for test purposes
  • connects req/res events to logger

mobile-json-wire-protocol (part of appium-base-driver)

  • provides list of Appium commands
  • subclassed by drivers that will use the protocol
    • kind of middleware between client and driver
    • handles jwp proxy for driver
  • contains error classes for all types of errors
    • sanitises error responses
  • (un)wraps params to commands
  • checks required params, validates params

appium-base-driver

  • designed to have a single testing session per instantiation
  • contains constraints on caps (platformName has to be present, etc)
  • validates capabilities
  • runs chain of promised commands with single concurrency
  • handles session restart
  • handles swipe options
  • exports class (DeviceSettings) to manage device settings (get/update)
  • contains basic commands
    • to find elements
    • create/delete sessions
    • handle timeouts
    • set/update device settings
  • provides helper methods for commands

appium-ios-driver

  • can also run as standalone server (has a small server part that extends from appium-express)
  • supported strategies: "name", "xpath", "id", "-ios uiautomation", "class name", "accessibility id”
  • can start a simulator or a real device (if udid is given)
    • runs for each type a huge set of instructions
      • removeInstrumentsSocket
      • setBundleIdFromApp
      • createInstruments
      • runSimReset, isolateSimDevice, setLocale || runRealDeviceReset
      • setPreferences || runRealDeviceReset
      • startLogCapture
      • prelaunchSimulator || (noop)
      • startInstruments
      • onInstrumentsLaunch
      • configureBootstrap
      • setBundleId
      • setInitialOrientation
      • initAutoWebview
      • waitForAppLaunched
    • all instructions are helper methods within driver.js
  • contains a more specific set of capability constraints
  • has logic to build and run Safari (safari-launcher) using appium-xcode
  • implements commands for iOS driver
    • Selenium commands are compiled to ui-automator commands
    • commands will be send out to uiAutoClient (appium-uiauto)
  • connects to appium remote debugger

appium-xcode

  • runs shell commands to return useful data from Xcode like
    • getPath
    • getVersion
    • getAutomationTraceTemplatePath
    • getMaxIOSSDK
  • has an auto-retry built in

appium-uiauto

  • wrapper for the iOS UI Automation framework
  • talks to it via socket connection
  • runs a command queue that get filled up by the sendCommand function
  • handles responses (as a buffer) from the ui-automation framework
  • uses osascript to rotate screenshots
  • provides method to bootstrap simulator/realdevice (dynamic-bootstrap)
    • javascript files which are run in the iOS UI Automation context (not node)
    • responsible to execute actual iOS UI Automation commands
    • see UIAutomation docs
    • command flow is like
      • Webdriver command -> iOS driver command -> uiauto-command

appium-instruments

  • wrapper to run instruments commands
  • a lot of exec calls to talk to instruments binary
  • all of them take callbacks to propagate the result
  • uses "iwd" (instruments without delay) packages which have to be compiled first
    • special Instruments package that gets rid of a delay between commands
    • contains also older versions of iwd instrument (v4 - v7)

appium-ios-log

  • captures console, performance and crash logs from the iOS simulator or real device
  • by either calling tail to grab logs from a system path (simulator devices)
  • or by calling deviceconsole (real devices)
  • performance logs are getting grabbed using the remote-debugger
  • crash logs remain in “.crash” files on the system

appium-ios-simulator

  • wrapper around iOS simulator app
    • start and shutdown (kill all) simulators
    • updating settings and locals
    • update/clean safari
    • grabs meta data about the simulator device
  • uses simctl to talk to the simulator
  • works for Xcode 6 and 7

authorize-ios

  • utility that pre-authorizes Instruments to run UIAutomation scripts against iOS devices
  • enables developer tools by calling “DevToolsSecurity —enable”
  • authorises user as developer calling “authorizationdb"
  • changes ownerships of simulator directories

node-simctl

  • wrapper around simctl binary (cli utility to control an iOS simulator)
  • executed as a subcommand of xcrun (locate or invoke developer tools from the command-line)
  • contains functions to
    • install/remove apps
    • launch and shutdown simulators
    • create/erase/delete devices
    • get list of devices

appium-cookies

  • simple package to create and receive cookies
  • used in the appium-ios-driver to implement jswonwire cookie commands within the web context

appium-chromedriver

  • wrapper around the chrome driver
  • downloads and installs chromedriver binaries
  • launches, restarts and stops (or kills all) chrome instances
  • uses appium-jsonwp-proxy to send json wire protocol commands to the driver

jsonwp-proxy (part of appium-base-driver)

  • allows to send json wire protocol commands to a server that understands it (browser drivers)
  • parses response into json
  • allows to proxy requests to a proxied server
  • used for communication in appium-chromedriver and appium-selendroid-driver

appium-android-driver

  • similar to appium-ios-driver it can run as standalone server
  • automates native, hybrid and mobile web apps on emulators/simulators and real devices
  • takes care of installing android packages to the device
  • runs chromedriver sessions if desired
  • contains a more specific set of capability constraints
  • uses appium-adb to talk to the emulator/simulator/realdevice
  • and appium-android-bootstrap to execute the actual commands
  • contains helpers to figure out which web view belongs to which app package vice versa

appium-adb

  • wrapper around the Android Debug Bridge (adb)
  • contains a bunch of commands that are basically just rpc to the adb binary
  • houses jar files to run for special use cases like signing, verifying apps or moving manifests
  • allows special (mobile specific) emulator commands that are not related to the webdriver protocol like
    • locking the screen
    • press back button
    • press home button
    • set/get airplane mode
    • set/get wifi state
  • captures logcat
  • handles emulator/simulator actions (e.g. reboot)

appium-android-bootstrap

  • JavaScript interface, and Java code, for interacting with Android UI Automator
  • builds AppiumBootstrap.jar that contains logic to execute the commands
  • counterpart to appium-uiauto
  • once started it creates a web socket connection to the device
    • application provides start/shutdown/sendCommand interface
  • command flow is like:
    • Selenium command -> appium-adb -> appium-android-bootstrap -> Java code using the Android UI Automator framework

appium-uiautomator

  • starts and shutdowns uiautomator server given by appium-android-bootstrap jar build
  • command flow is like
    • appium-android-bootstrap:start -> appium-uiautomator:start -> appium-adb:install bootstrap

appium-selendroid-driver

  • similar to appium-android-driver it can run as standalone server
  • downloads and installs Selendroid using appium-selendroid-installer
  • contains several Selendroid specific logic to ensure a seamless integration
  • contains a more specific set of capability constraints
  • uses jsonwp-proxy to talk to the server
  • used appium-adb to enable commands not implemented in Selendroid

appium-selendroid-installer

  • contains and exports a setup logic to
    • download Selendroid
    • determine AndroidManifest location
    • determine Server APK location
    • extracting both files
    • copying and cleaning files

appium-android-ime

  • allows to send and receive unicode characters from/to the Android device
  • encodes text into UTF-7 sends it to the device and recodes it as Unicode
  • used by appium-android-driver and appium-selendroid-driver

appium-doctor

  • diagnoses, reports and fixes common Node, iOS and Android configuration issues before starting Appium
  • exposes cli command “appium-doctor"
  • it checks for
    • Android:
      • android sdk exists and configured properly
      • env variables and path check
    • iOS:
      • xcode is installed (with command line tools)
      • dev tools security check
      • auth check
      • node binary check

appium-gulp-plugins

  • dev package with custom plugins used accross appium modules (for Appium development only)
  • contains task for
    • e2e and unit tests (with coverage reporting)
    • transpiling ES2016 into ES5
    • static code analysis (eslint)
    • watch task for dev

appium-remote-debugger

  • RPC client to connect Appium to iOS webviews
  • can connect to WebKit devtools
  • for iOS only
  • has two rpc client classes
    • remote-debugger-rpc-client: uses tcp6 that connects to localhost:27753
    • webkit-rpc-client: uses WebSockets to connect to ws://localhost:27753/devtools/page/${pageId}

node-teen_process

  • helper module that exposes:
    • exec: ES7 (async/await) implementation of exec that uses spawn under the hood
    • SubProcess: cuts down boilerplate when using spawn (especially when using in an async/await context)

appium-logger

  • basic logger defaulting to npmlog with special consideration for running tests
  • exposes getLogger function that gets used by almost all Appium packages
    • defers to already-running logger if there is one, so everything bubbles up

appium-support

  • utility functions used to support libs used across appium packages.
  • provides promise wrappers for some common operations like
    • system methods (isWindows, isLinux …)
    • utility methods like hasValue, escapeSpace
    • a bunch of fs methods
    • plist helpers for parsing and updating plist files