diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
new file mode 100644
index 000000000..49cf4f31e
--- /dev/null
+++ b/.github/CODEOWNERS
@@ -0,0 +1 @@
+* @mykola-mokhnach @SrinivasanTarget @saikrishna321 @valfirst
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 000000000..c082a4d00
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,14 @@
+version: 2
+updates:
+- package-ecosystem: gradle
+ directory: "/"
+ schedule:
+ interval: weekly
+ time: "11:00"
+ open-pull-requests-limit: 10
+- package-ecosystem: github-actions
+ directory: "/"
+ schedule:
+ interval: weekly
+ time: "11:00"
+ open-pull-requests-limit: 10
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 000000000..ec814bf63
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,175 @@
+name: Appium Java Client CI
+
+on:
+ push:
+ branches:
+ - master
+ paths-ignore:
+ - 'docs/**'
+ - '*.md'
+ pull_request:
+ branches:
+ - master
+ paths-ignore:
+ - 'docs/**'
+ - '*.md'
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
+ cancel-in-progress: true
+
+env:
+ CI: true
+ ANDROID_SDK_VERSION: "28"
+ ANDROID_EMU_NAME: test
+ ANDROID_EMU_TARGET: default
+ # https://github.com/actions/runner-images/blob/main/images/macos/macos-14-arm64-Readme.md
+ XCODE_VERSION: "15.4"
+ IOS_DEVICE_NAME: iPhone 15
+ IOS_PLATFORM_VERSION: "17.5"
+ FLUTTER_ANDROID_APP: "https://github.com/AppiumTestDistribution/appium-flutter-server/releases/latest/download/app-debug.apk"
+ FLUTTER_IOS_APP: "https://github.com/AppiumTestDistribution/appium-flutter-server/releases/latest/download/ios.zip"
+ PREBUILT_WDA_PATH: ${{ github.workspace }}/wda/WebDriverAgentRunner-Runner.app
+
+jobs:
+ build:
+
+ strategy:
+ matrix:
+ include:
+ - java: 17
+ # Need to use specific (not `-latest`) version of macOS to be sure the required version of Xcode/simulator is available
+ platform: macos-14
+ e2e-tests: ios
+ - java: 17
+ # Need to use specific (not `-latest`) version of macOS to be sure the required version of Xcode/simulator is available
+ platform: macos-14
+ e2e-tests: flutter-ios
+ - java: 17
+ platform: ubuntu-latest
+ e2e-tests: android
+ - java: 17
+ platform: ubuntu-latest
+ e2e-tests: flutter-android
+ - java: 21
+ platform: ubuntu-latest
+ - java: 25
+ platform: ubuntu-latest
+ fail-fast: false
+
+ runs-on: ${{ matrix.platform }}
+
+ name: JDK ${{ matrix.java }} - ${{ matrix.platform }} ${{ matrix.e2e-tests }}
+ steps:
+ - uses: actions/checkout@v6
+
+ - name: Enable KVM group perms
+ if: matrix.e2e-tests == 'android' || matrix.e2e-tests == 'flutter-android'
+ run: |
+ echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
+ sudo udevadm control --reload-rules
+ sudo udevadm trigger --name-match=kvm
+
+ - name: Set up JDK ${{ matrix.java }}
+ uses: actions/setup-java@v5
+ with:
+ distribution: 'zulu'
+ java-version: ${{ matrix.java }}
+
+ - name: Setup Gradle
+ uses: gradle/actions/setup-gradle@v5
+
+ - name: Build with Gradle
+ # FIXME: Sonatype returns 401 for the snapshots repository
+ # latest_snapshot=$(curl -sf https://oss.sonatype.org/content/repositories/snapshots/org/seleniumhq/selenium/selenium-api/ | \
+ # python -c "import sys,re; print(re.findall(r'\d+\.\d+\.\d+-SNAPSHOT', sys.stdin.read())[-1])")
+ # echo ">>> $latest_snapshot"
+ # echo "latest_snapshot=$latest_snapshot" >> "$GITHUB_ENV"
+ # ./gradlew clean build -PisCI -Pselenium.version=$latest_snapshot
+ run: |
+ GROUP_ID="org.seleniumhq.selenium"
+ ARTIFACT_ID="selenium-api"
+ REPO_URL="https://repo1.maven.org/maven2"
+ GROUP_PATH="${GROUP_ID//.//}"
+ METADATA_URL="${REPO_URL}/${GROUP_PATH}/${ARTIFACT_ID}/maven-metadata.xml"
+
+ metadata=$(curl -s "$METADATA_URL")
+ latest_snapshot=$(python3 -c "
+ import sys, xml.etree.ElementTree as ET
+ root = ET.fromstring(sys.stdin.read())
+ print(root.findtext('./versioning/latest'))
+ " <<< "$metadata")
+ if [ -z "$latest_snapshot" ]; then
+ echo "❌ Failed to extract latest released version of ${ARTIFACT_ID} from $metadata"
+ exit 1
+ fi
+ echo "✅ Latest released version of ${ARTIFACT_ID} is: $latest_snapshot"
+ echo "latest_snapshot=$latest_snapshot" >> "$GITHUB_ENV"
+ ./gradlew clean build -PisCI -Pselenium.version=$latest_snapshot
+
+ - name: Install Node.js
+ if: ${{ matrix.e2e-tests }}
+ uses: actions/setup-node@v6
+ with:
+ node-version: 'lts/*'
+
+ - name: Install Appium
+ if: ${{ matrix.e2e-tests }}
+ run: npm install --location=global appium
+
+ - name: Install UIA2 driver
+ if: matrix.e2e-tests == 'android' || matrix.e2e-tests == 'flutter-android'
+ run: appium driver install uiautomator2
+
+ - name: Install Flutter Integration driver
+ if: matrix.e2e-tests == 'flutter-android' || matrix.e2e-tests == 'flutter-ios'
+ run: appium driver install appium-flutter-integration-driver --source npm
+
+ - name: Run Android E2E tests
+ if: matrix.e2e-tests == 'android'
+ uses: reactivecircus/android-emulator-runner@v2
+ with:
+ script: ./gradlew e2eAndroidTest -PisCI -Pselenium.version=$latest_snapshot
+ api-level: ${{ env.ANDROID_SDK_VERSION }}
+ avd-name: ${{ env.ANDROID_EMU_NAME }}
+ disable-spellchecker: true
+ disable-animations: true
+ target: ${{ env.ANDROID_EMU_TARGET }}
+
+ - name: Run Flutter Android E2E tests
+ if: matrix.e2e-tests == 'flutter-android'
+ uses: reactivecircus/android-emulator-runner@v2
+ with:
+ script: ./gradlew e2eFlutterTest -Pplatform="android" -Pselenium.version=$latest_snapshot -PisCI -PflutterApp=${{ env.FLUTTER_ANDROID_APP }}
+ api-level: ${{ env.ANDROID_SDK_VERSION }}
+ avd-name: ${{ env.ANDROID_EMU_NAME }}
+ disable-spellchecker: true
+ disable-animations: true
+ target: ${{ env.ANDROID_EMU_TARGET }}
+
+ - name: Select Xcode
+ if: matrix.e2e-tests == 'ios' || matrix.e2e-tests == 'flutter-ios'
+ uses: maxim-lobanov/setup-xcode@v1
+ with:
+ xcode-version: "${{ env.XCODE_VERSION }}"
+ - name: Prepare iOS simulator
+ if: matrix.e2e-tests == 'ios' || matrix.e2e-tests == 'flutter-ios'
+ uses: futureware-tech/simulator-action@v4
+ with:
+ model: "${{ env.IOS_DEVICE_NAME }}"
+ os_version: "${{ env.IOS_PLATFORM_VERSION }}"
+ wait_for_boot: true
+ shutdown_after_job: false
+ - name: Install XCUITest driver
+ if: matrix.e2e-tests == 'ios' || matrix.e2e-tests == 'flutter-ios'
+ run: appium driver install xcuitest
+ - name: Download prebuilt WDA
+ if: matrix.e2e-tests == 'ios' || matrix.e2e-tests == 'flutter-ios'
+ run: appium driver run xcuitest download-wda-sim --platform=ios --outdir=$(dirname "$PREBUILT_WDA_PATH")
+ - name: Run iOS E2E tests
+ if: matrix.e2e-tests == 'ios'
+ run: ./gradlew e2eIosTest -PisCI -Pselenium.version=$latest_snapshot
+
+ - name: Run Flutter iOS E2E tests
+ if: matrix.e2e-tests == 'flutter-ios'
+ run: ./gradlew e2eFlutterTest -Pplatform="ios" -Pselenium.version=$latest_snapshot -PisCI -PflutterApp=${{ env.FLUTTER_IOS_APP }}
diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml
new file mode 100644
index 000000000..1658a2957
--- /dev/null
+++ b/.github/workflows/pr-title.yml
@@ -0,0 +1,16 @@
+name: Conventional Commits
+on:
+ pull_request:
+ types: [opened, edited, synchronize, reopened]
+
+
+jobs:
+ lint:
+ name: https://www.conventionalcommits.org
+ runs-on: ubuntu-latest
+ steps:
+ - uses: beemojs/conventional-pr-action@v3
+ with:
+ config-preset: angular
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
new file mode 100644
index 000000000..72edaf3bd
--- /dev/null
+++ b/.github/workflows/publish.yml
@@ -0,0 +1,28 @@
+name: Publish package to the Maven Central Repository
+on:
+ release:
+ types: [created]
+jobs:
+ publish:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v6
+ - name: Set up Java
+ uses: actions/setup-java@v5
+ with:
+ java-version: '11'
+ distribution: 'zulu'
+
+ - name: Setup Gradle
+ uses: gradle/actions/setup-gradle@v5
+
+ - name: Publish package
+ env:
+ JRELEASER_GPG_PUBLIC_KEY: ${{ secrets.SIGNING_PUBLIC_KEY }}
+ JRELEASER_GPG_SECRET_KEY: ${{ secrets.JRELEASER_SIGNING_KEY }}
+ JRELEASER_GPG_PASSPHRASE: ${{ secrets.JRELEASER_SIGNING_PASSWORD }}
+ JRELEASER_MAVENCENTRAL_SONATYPE_USERNAME: ${{ secrets.OSSRH_USERNAME }}
+ JRELEASER_MAVENCENTRAL_SONATYPE_PASSWORD: ${{ secrets.OSSRH_TOKEN }}
+ run: |
+ ./gradlew publish
+ ./gradlew jreleaserDeploy
diff --git a/.gitignore b/.gitignore
index a43128f4a..da44d7acb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,10 +10,11 @@ settings.xml
build/
.gradle
.gradle/*
-
+classes/
# Eclipse
/bin
/target
/.settings
.classpath
.project
+.vscode
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index d902f762e..000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-language: java
-
-jdk:
- - oraclejdk8
-
-sudo: required
-
-install: true
-
-script: ./gradlew clean build -x test -x signArchives
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 000000000..1f189e2cb
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,1144 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+_10.0.0_
+- **[DOCUMENTATION]**
+ - Document the migration guide from v9 to v10 [#2331](https://github.com/appium/java-client/pull/2331)
+ - updated maven central release badge [#2316](https://github.com/appium/java-client/pull/2316)
+ - updated CI badge to use ci.yml workflow [#2317](https://github.com/appium/java-client/pull/2317)
+- **[BREAKING CHANGE]** [#2327](https://github.com/appium/java-client/pull/2327)
+ - Removed all deprecated methods with Selenium's Location and LocationContext (these classes have been removed in Selenium 4.35.0)
+- **[ENHANCEMENTS]**
+ - Proxy commands issues via RemoteWebElement [#2311](https://github.com/appium/java-client/pull/2311)
+ - Automated Release to Maven Central Repository using JReleaser [#2313](https://github.com/appium/java-client/pull/2313)
+- **[BUG FIX]**
+ - Possible NPE in initBiDi() [#2325](https://github.com/appium/java-client/pull/2325)
+- **[DEPENDENCY CHANGE]**
+ - Bump minimum Selenium version to 4.35.0 [#2327](https://github.com/appium/java-client/pull/2327)
+ - Bump org.junit.jupiter:junit-jupiter from 5.13.2 to 5.13.3 [#2314](https://github.com/appium/java-client/pull/2314)
+ - Bump io.github.bonigarcia:webdrivermanager [#2322](https://github.com/appium/java-client/pull/2322)
+ - Bump com.gradleup.shadow from 8.3.7 to 8.3.8 [#2315](https://github.com/appium/java-client/pull/2315)
+ - Bump org.apache.commons:commons-lang3 from 3.17.0 to 3.18.0 [#2320](https://github.com/appium/java-client/pull/2320)
+
+_9.5.0_
+- **[ENHANCEMENTS]**
+ - Allow extension capability keys to contain dot characters [#2271](https://github.com/appium/java-client/pull/2271)
+ - Add a client for Appium server storage plugin [#2275](https://github.com/appium/java-client/pull/2275)
+ - Swap check for `Widget` and `WebElement` [#2277](https://github.com/appium/java-client/pull/2277)
+ - Add compatibility with Selenium `4.34.0` [#2298](https://github.com/appium/java-client/pull/2298)
+ - Add new option classes for `prebuiltWDAPath` and `usePreinstalledWDA` XCUITest capabilities [#2304](https://github.com/appium/java-client/pull/2304)
+- **[REFACTOR]**
+ - Migrate from JSR 305 to [JSpecify](https://jspecify.dev/)'s nullability annotations [#2281](https://github.com/appium/java-client/pull/2281)
+- **[DEPENDENCY UPDATES]**
+ - Bump minimum supported Selenium version from `4.26.0` to `4.34.0` [#2305](https://github.com/appium/java-client/pull/2305)
+ - Bump Gson from `2.11.0` to `2.13.1` [#2267](https://github.com/appium/java-client/pull/2267), [#2286](https://github.com/appium/java-client/pull/2286), [#2290](https://github.com/appium/java-client/pull/2290)
+ - Bump SLF4J from `2.0.16` to `2.0.17` [#2274](https://github.com/appium/java-client/pull/2274)
+
+_9.4.0_
+- **[ENHANCEMENTS]**
+ - Implement `HasBiDi` interface support in `AppiumDriver` [#2250](https://github.com/appium/java-client/pull/2250), [#2254](https://github.com/appium/java-client/pull/2254), [#2256](https://github.com/appium/java-client/pull/2256)
+ - Add compatibility with Selenium `4.28.0` [#2249](https://github.com/appium/java-client/pull/2249)
+- **[BUG FIX]**
+ - Fix scroll issue in flutter integration driver [#2227](https://github.com/appium/java-client/pull/2227)
+ - Fix the definition of `logcatFilterSpecs` option [#2258](https://github.com/appium/java-client/pull/2258)
+ - Use `WeakHashMap` for caching proxy classes [#2260](https://github.com/appium/java-client/pull/2260)
+- **[DEPENDENCY UPDATES]**
+ - Bump minimum supported Selenium version from `4.19.0` to `4.26.0` [#2246](https://github.com/appium/java-client/pull/2246)
+ - Bump Apache Commons Lang from `3.15.0` to `3.16.1` [#2220](https://github.com/appium/java-client/pull/2220), [#2228](https://github.com/appium/java-client/pull/2228)
+ - Bump SLF4J from `2.0.13` to `2.0.16` [#2221](https://github.com/appium/java-client/pull/2221)
+
+_9.3.0_
+- **[ENHANCEMENTS]**
+ - Add support for FlutterIOSDriver. [#2206](https://github.com/appium/java-client/pull/2206)
+ - add support for FlutterAndroidDriver. [#2203](https://github.com/appium/java-client/pull/2203)
+ - Add locator types supported by flutter integration driver. [#2201](https://github.com/appium/java-client/pull/2201)
+ - add flutter driver commands to support camera mocking. [#2207](https://github.com/appium/java-client/pull/2207)
+ - Add ability to use secure WebSocket to listen Logcat messages. [#2182](https://github.com/appium/java-client/pull/2182)
+ - Add mobile: replacements to clipboard API wrappers. [#2188](https://github.com/appium/java-client/pull/2188)
+- **[DEPRECATION]**
+ - Deprecate obsolete TouchAction helpers. [#2199](https://github.com/appium/java-client/pull/2199)
+- **[REFACTOR]**
+ - Bump iOS version in CI. [#2167](https://github.com/appium/java-client/pull/2167)
+- **[DOCUMENTATION]**
+ - README updates. [#2193](https://github.com/appium/java-client/pull/2193)
+- **[DEPENDENCY UPDATES]**
+ - `org.junit.jupiter:junit-jupiter` was updated to 5.10.3.
+ - `org.projectlombok:lombok` was updated to 1.18.34.
+ - `io.github.bonigarcia:webdrivermanager` was updated to 5.9.1.
+ - `org.owasp.dependencycheck` was updated to 10.0.3.
+ - `org.apache.commons:commons-lang3` was updated to 3.15.0.
+
+_9.2.3_
+- **[BUG FIX]**
+ - Properly represent `FeaturesMatchingResult` model if `multiple` option is enabled [#2170](https://github.com/appium/java-client/pull/2170)
+ - Use current class loader for the ByteBuddy wrapper [#2172](https://github.com/appium/java-client/pull/2172) \
+ This fixes errors like `NoClassDefFoundError: org/openqa/selenium/remote/RemoteWebElement`, `NoClassDefFoundError: io/appium/java_client/proxy/HasMethodCallListeners` when `PageFactory` is used.
+ - Correct extension name for `mobile: replaceElementValue` [#2171](https://github.com/appium/java-client/pull/2171)
+- **[DEPRECATION]**
+ - Deprecate `AppiumProtocolHandshake` class [#2173](https://github.com/appium/java-client/pull/2173) \
+ The original `ProtocolHandshake` class only supports W3C protocol now. There is no need to hack it anymore.
+- **[REFACTOR]**
+ - Replace Guava `HttpHeaders` with Selenium `HttpHeader` [#2151](https://github.com/appium/java-client/pull/2151)
+- **[DEPENDENCY CHANGE]**
+ - Bump SLF4J from `2.0.12` to `2.0.13` [#2158](https://github.com/appium/java-client/pull/2158)
+ - Bump Gson from `2.10.1` to `2.11.0` [#2175](https://github.com/appium/java-client/pull/2175)
+
+_9.2.2_
+- **[BUG FIX]**
+ - fix: Fix building of Android key event parameters [#2145](https://github.com/appium/java-client/pull/2145)
+ - fix: Fix building of Android geo location parameters [#2146](https://github.com/appium/java-client/pull/2146)
+
+_9.2.1_
+- **[REFACTOR]**
+ - Replace private usages of Guava Collections API with Java Collections API [#2136](https://github.com/appium/java-client/pull/2136)
+ - Remove usages of Guava's `@VisibleForTesting` annotation [#2138](https://github.com/appium/java-client/pull/2138). Previously opened internal API marked with `@VisibleForTesting` annotation is private now:
+ - `io.appium.java_client.internal.filters.AppiumUserAgentFilter#containsAppiumName`
+ - `io.appium.java_client.service.local.AppiumDriverLocalService#parseSlf4jContextFromLogMessage`
+- **[DEPENDENCY CHANGE]**
+ - Bump minimum supported Selenium version from `4.17.0` to `4.19.0` [#2142](https://github.com/appium/java-client/pull/2142)
+
+_9.2.0_
+- **[ENHANCEMENTS]**
+ - Incorporate poll delay mechanism into `AppiumFluentWait` [#2116](https://github.com/appium/java-client/pull/2116) (Closes [#2111](https://github.com/appium/java-client/pull/2111))
+ - Make server startup error messages more useful [#2130](https://github.com/appium/java-client/pull/2130)
+- **[BUG FIX]**
+ - Set correct geolocation coordinates of the current device [#2109](https://github.com/appium/java-client/pull/2109) (Fixes [#2108](https://github.com/appium/java-client/pull/2108))
+ - Always release annotated element reference from the builder instance [#2128](https://github.com/appium/java-client/pull/2128)
+ - Cache dynamic proxy classes created by ByteBuddy [#2129](https://github.com/appium/java-client/pull/2129) (Fixes [#2119](https://github.com/appium/java-client/pull/2119))
+- **[DEPENDENCY CHANGE]**
+ - Bump SLF4J from `2.0.11` to `2.0.12` [#2115](https://github.com/appium/java-client/pull/2115)
+- **[DOCUMENTATION]**
+ - Improve release steps [#2107](https://github.com/appium/java-client/pull/2107)
+
+_9.1.0_
+- **[ENHANCEMENTS]**
+ - Introduce better constructor argument validation for the `AppiumFieldDecorator` class. [#2070](https://github.com/appium/java-client/pull/2070)
+ - Add `toString` to `AppiumClientConfig`. [#2076](https://github.com/appium/java-client/pull/2076)
+ - Perform listeners cleanup periodically. [#2077](https://github.com/appium/java-client/pull/2077)
+ - Add non-W3C context, orientation and rotation management endpoints removed from Selenium client. [#2093](https://github.com/appium/java-client/pull/2093)
+ - Add non-W3C Location-management endpoints deprecated in Selenium client. [#2098](https://github.com/appium/java-client/pull/2098)
+- **[BUG FIX]**
+ - Properly unwrap driver instance if the `ContextAware` object is deeply nested. [#2052](https://github.com/appium/java-client/pull/2052)
+ - Update hashing and iteration logic of page object items. [#2067](https://github.com/appium/java-client/pull/2067)
+ - Assign method call listeners directly to the proxy instance. [#2102](https://github.com/appium/java-client/pull/2102)
+ - Use JDK 11 to build Jitpack snapshots. [#2083](https://github.com/appium/java-client/pull/2083)
+- **[DEPRECATION]**
+ - Deprecate custom functional interfaces. [#2055](https://github.com/appium/java-client/pull/2055)
+- **[REFACTOR]**
+ - Use Java 9+ APIs instead of outdated/3rd-party APIs. [#2048](https://github.com/appium/java-client/pull/2048)
+ - Migrate to new Selenium API for process management. [#2054](https://github.com/appium/java-client/pull/2054)
+- **[DEPENDENCY CHANGE]**
+ - Bump minimum supported Selenium version from `4.14.1` to `4.17.0`.
+ - Bump SLF4J from `2.0.9` to `2.0.11`. [#2091](https://github.com/appium/java-client/pull/2091), [#2099](https://github.com/appium/java-client/pull/2099)
+- **[DOCUMENTATION]**
+ - Describe the release procedure. [#2104](https://github.com/appium/java-client/pull/2104)
+
+_9.0.0_
+- **[DOCUMENTATION]**
+ - Add 8 to 9 migration guide. [#2039](https://github.com/appium/java-client/pull/2039)
+- **[BREAKING CHANGE]** [#2036](https://github.com/appium/java-client/pull/2036)
+ - Set minimum Java version to 11.
+ - The previously deprecated MobileBy class has been removed. Use AppiumBy instead.
+ - The previously deprecated launchApp, resetApp and closeApp methods have been removed. Use extension methods instead.
+ - The previously deprecated WindowsBy class and related location strategies have been removed.
+ - The previously deprecated ByAll class has been removed in favour of the Selenium one.
+ - The previously deprecated AndroidMobileCapabilityType interface has been removed. Use driver options instead
+ - The previously deprecated IOSMobileCapabilityType interface has been removed. Use driver options instead
+ - The previously deprecated MobileCapabilityType interface has been removed. Use driver options instead
+ - The previously deprecated MobileOptions class has been removed. Use driver options instead
+ - The previously deprecated YouiEngineCapabilityType interface has been removed. Use driver options instead
+ - Removed several misspelled methods. Use properly spelled alternatives instead
+ - Removed startActivity method from AndroidDriver. Use 'mobile: startActivity' extension method instead
+ - Removed the previously deprecated APPIUM constant from the AutomationName interface
+ - Removed the previously deprecated PRE_LAUNCH value from the GeneralServerFlag enum
+ - Moved AppiumUserAgentFilter class to io.appium.java_client.internal.filters package
+- **[REFACTOR]**
+ - Align Selenium version in test dependencies. [#2042](https://github.com/appium/java-client/pull/2042)
+- **[DEPENDENCY CHANGE]**
+ - Removed dependencies to Apache Commons libraries.
+
+_8.6.0_
+
+- **[BUG FIX]**
+ - Exclude abstract methods from proxy matching. [#1937](https://github.com/appium/java-client/pull/1937)
+ - AppiumClientConfig#readTimeout to call super.readTimeout. [#1959](https://github.com/appium/java-client/pull/1959)
+ - Use weak references to elements inside of interceptor objects. [#1981](https://github.com/appium/java-client/pull/1981)
+ - Correct spelling and semantic mistakes in method naming. [#1970](https://github.com/appium/java-client/pull/1970)
+ - Change scope of selenium-support dependency to compile. [#2019](https://github.com/appium/java-client/pull/2019)
+ - Fix Code style issues to match Java standards. [#2017](https://github.com/appium/java-client/pull/2017)
+ - class of proxy method in AppiumClientConfig. [#2026](https://github.com/appium/java-client/pull/2026)
+- **[ENHANCEMENTS]**
+ - Mark Windows page object annotations as deprecated. [#1938](https://github.com/appium/java-client/pull/1938)
+ - Deprecate obsolete capabilities constants. [#1961](https://github.com/appium/java-client/pull/1961)
+ - patch AutomationName with Chromium. [#1993](https://github.com/appium/java-client/pull/1993)
+ - Implementation of Chromium driver plus capabilities. [#2003](https://github.com/appium/java-client/pull/2003)
+- **[REFACTOR]**
+ - Increase server start timeout for iOS tests. [#1983](https://github.com/appium/java-client/pull/1983)
+ - Fix Android test: --base-path arg must start with /. [#1952](https://github.com/appium/java-client/pull/1952)
+ - Added fixes for No service provider found for `io.appium.java_client.events.api.Listener`. [#1975](https://github.com/appium/java-client/pull/1975)
+ - Run tests against latest Selenium release. [#1978](https://github.com/appium/java-client/pull/1978)
+ - Use server releases from the main branch for testing. [#1994](https://github.com/appium/java-client/pull/1994)
+ - Remove obsolete API calls from tests. [#2006](https://github.com/appium/java-client/pull/2006)
+ - Automate more static code checks. [#2028](https://github.com/appium/java-client/pull/2028)
+ - Limit the maximum selenium version to 4.14. [#2031](https://github.com/appium/java-client/pull/2031)
+ - Remove the obsolete commons-validator dependency. [#2032](https://github.com/appium/java-client/pull/2032)
+- **[DOCUMENTATION]**
+ - Add the latest versions of clients to the compatibility matrix. [#1935](https://github.com/appium/java-client/pull/1935)
+ - Added correct url path for the latest appium documentation. [#1974](https://github.com/appium/java-client/pull/1974)
+ - Add Selenium 4.11.0, 4.12.0, 4.12.1 & 4.13.0 to compatibility matrix. [#1986](https://github.com/appium/java-client/pull/1986) & [#1999](https://github.com/appium/java-client/pull/1999) & [#2002](https://github.com/appium/java-client/pull/2025) & [#1986](https://github.com/appium/java-client/pull/2025)
+ - Add known compatibility issue for Selenium 4.12.1. [#2008](https://github.com/appium/java-client/pull/2008)
+- **[DEPENDENCY UPDATES]**
+ - `org.owasp.dependencycheck` was updated to 8.4.0.
+ - `org.junit.jupiter:junit-jupiter` was updated to 5.10.0.
+ - `commons-io:commons-io` was updated to 2.14.0.
+ - `checkstyle` was updated to 10.12.1.
+ - `org.apache.commons:commons-lang3` was updated to 3.13.0.
+ - `gradle` was updated to 8.4.0.
+ - `io.github.bonigarcia:webdrivermanager` was updated to 5.5.3.
+ - `org.seleniumhq.selenium:selenium-bom` was updated to 4.13.0.
+ - `org.projectlombok:lombok` was updated to 1.18.30.
+
+*8.5.1*
+- **[BUG FIX]**
+ - Use correct exception type for fallback at file/folder pulling. [#1912](https://github.com/appium/java-client/pull/1912)
+ - Update autoWebview capability name. [#1917](https://github.com/appium/java-client/pull/1917)
+- **[REFACTOR]**
+ - Move execution of E2E tests to GitHub Actions. [#1913](https://github.com/appium/java-client/pull/1913)
+ - Replace cglib with bytebuddy. [#1923](https://github.com/appium/java-client/pull/1923)
+ - Improve the error message on service startup. [#1928](https://github.com/appium/java-client/pull/1928)
+- **[DOCUMENTATION]**
+ - Initiate Selenium client compatibility matrix. [#1918](https://github.com/appium/java-client/pull/1918)
+- **[DEPENDENCY UPDATES]**
+ - `io.github.bonigarcia:webdrivermanager` was updated to 5.3.3.
+ - `org.projectlombok:lombok` was updated to 1.18.28.
+ - `commons-io:commons-io` was updated to 2.12.0.
+
+*8.5.0*
+- **[BUG FIX]**
+ - Restore Jitpack builds. [#1911](https://github.com/appium/java-client/pull/1911)
+ - Add fallback commands for file management APIs. [#1910](https://github.com/appium/java-client/pull/1910)
+- **[REFACTOR]**
+ - Replace performance data APIs with mobile extensions. [#1905](https://github.com/appium/java-client/pull/1905)
+- **[DEPENDENCY UPDATES]**
+ - `org.seleniumhq.selenium:selenium-java` was updated to 4.9.1.
+ - `org.junit.jupiter:junit-jupiter` was updated to 5.9.3.
+
+*8.4.0*
+- **[ENHANCEMENTS]**
+ - Added possibility to connect to a running session. [#1813](https://github.com/appium/java-client/pull/1813)
+ - deprecate tapWithShortPressDuration capability.[#1825](https://github.com/appium/java-client/pull/1825)
+ - Add SupportsEnforceAppInstallOption to XCUITestOptions.[#1895](https://github.com/appium/java-client/pull/1895)
+- **[BUG FIX]**
+ - Use ipv4 address instead of localhost. [#1815](https://github.com/appium/java-client/pull/1815)
+ - Fix test broken by updates in `appium-xcuitest-driver`. [#1839](https://github.com/appium/java-client/pull/1839)
+ - Merge misc tests suite into unit tests suite. [#1850](https://github.com/appium/java-client/pull/1850)
+ - Avoid NPE in destroyProcess call. [#1878](https://github.com/appium/java-client/pull/1878)
+ - Send arguments for mobile methods depending on the target platform. [#1897](https://github.com/appium/java-client/pull/1897)
+- **[REFACTOR]**
+ - Run Gradle wrapper validation only on Gradle files changes. [#1828](https://github.com/appium/java-client/pull/1828)
+ - Skip GH Actions build on changes in docs. [#1829](https://github.com/appium/java-client/pull/1829)
+ - Remove Checkstyle exclusion of removed Selenium package. [#1831](https://github.com/appium/java-client/pull/1831)
+ - Enable Checkstyle checks for test code. [#1843](https://github.com/appium/java-client/pull/1843)
+ - Configure `CODEOWNERS` to automate review requests. [#1846](https://github.com/appium/java-client/pull/1846)
+ - Enable execution of unit tests in CI. [#1845](https://github.com/appium/java-client/pull/1845)
+ - Add Simple SLF4J binding to unit tests runtime. [#1848](https://github.com/appium/java-client/pull/1848)
+ - Improve performance of proxy `Interceptor` logging. [#1849](https://github.com/appium/java-client/pull/1849)
+ - Make unit tests execution a part of Gradle build lifecycle. [#1853](https://github.com/appium/java-client/pull/1853)
+ - Replace non-W3C API calls with corresponding extension calls in app management. [#1883](https://github.com/appium/java-client/pull/1883)
+ - Switch the time getter to use mobile extensions. [#1884](https://github.com/appium/java-client/pull/1884)
+ - Switch file management APIs to use mobile: extensions. [#1886](https://github.com/appium/java-client/pull/1886)
+ - Use mobile extensions for app strings getters and keyboard commands. [#1890](https://github.com/appium/java-client/pull/1890)
+ - Finish replacing iOS extensions with their mobile alternatives. [#1892](https://github.com/appium/java-client/pull/1892)
+ - Change some Android APIs to use mobile extensions. [#1893](https://github.com/appium/java-client/pull/1893)
+ - Change backgroundApp command to use the corresponding mobile extension. [#1896](https://github.com/appium/java-client/pull/1896)
+ - Switch more Android helpers to use extensions. [#1898](https://github.com/appium/java-client/pull/1898)
+ - Perform xcuitest driver prebuild. [#1900](https://github.com/appium/java-client/pull/1900)
+ - Finish migrating Android helpers to mobile extensions. [#1901](https://github.com/appium/java-client/pull/1901)
+ - Avoid sending unnecessary requests if corresponding extensions are absent. [#1903](https://github.com/appium/java-client/pull/1903)
+- **[DOCUMENTATION]**
+ - Describe transitive Selenium dependencies management. [#1827](https://github.com/appium/java-client/pull/1827)
+ - Fix build badge to point GH Actions CI. [#1844](https://github.com/appium/java-client/pull/1844)
+- **[DEPENDENCY UPDATES]**
+ - `org.seleniumhq.selenium:selenium-java` was updated to 4.8.2.
+ - `org.slf4j:slf4j-api` was updated to 2.0.7.
+ - `org.owasp.dependencycheck` was updated to 8.2.1.
+ - `gradle` was updated to 8.1.0.
+ - `com.google.code.gson:gson` was updated to 2.10.1.
+ - `io.github.bonigarcia:webdrivermanager` was updated to 5.3.2.
+ - `org.junit.jupiter:junit-jupiter` was updated to 5.9.2.
+ - `checkstyle` was updated to 10.0.
+ - `jacoco` was updated to 0.8.8.
+ - `org.projectlombok:lombok` was updated to 1.18.26.
+ - `com.github.johnrengelman.shadow` was updated to 8.1.1.
+
+*8.3.0*
+- **[DOCUMENTATION]**
+ - Added troubleshooting section. [#1808](https://github.com/appium/java-client/pull/1808)
+ - Added CHANGELOG.md. [#1810](https://github.com/appium/java-client/pull/1810)
+- **[DEPENDENCY UPDATES]**
+ - `org.seleniumhq.selenium:selenium-java` was updated to 4.7.0.
+ - `org.slf4j:slf4j-api` was updated to 2.0.5.
+
+*8.2.1*
+- **[ENHANCEMENTS]**
+ - BYACCESSABILITY is deprecated in favor of BYACCESSIBILITY. [#1752](https://github.com/appium/java-client/pull/1752)
+ - Connect directly to Appium Hosts in Distributed Environments. [#1747](https://github.com/appium/java-client/pull/1747)
+ - use own User Agent. [#1779](https://github.com/appium/java-client/pull/1779)
+ - Add alternative proxy implementation. [#1790](https://github.com/appium/java-client/pull/1790)
+ - Automated artefact publish to maven central. [#1803](https://github.com/appium/java-client/pull/1803) & [#1807](https://github.com/appium/java-client/pull/1807)
+- **[BUG FIX]**
+ - Enforce usage of Base64 compliant with RFC 4648 for all operations. [#1785](https://github.com/appium/java-client/pull/1785)
+ - Override getScreenshotAs to support the legacy base64 encoding. [#1787](https://github.com/appium/java-client/pull/1787)
+- **[REFACTOR]**
+ - BYACCESSABILITY is deprecated in favor of BYACCESSIBILITY. [#1752](https://github.com/appium/java-client/pull/1752)
+ - JUnit5 test classes and methods are updated to have default package visibility. [#1755](https://github.com/appium/java-client/pull/1755)
+ - Verify if the PR title complies with conventional commits spec. [#1757](https://github.com/appium/java-client/pull/1757)
+ - Use Lombok in direct connect class. [#1789](https://github.com/appium/java-client/pull/1789)
+ - Update readme and remove obsolete documents. [#1792](https://github.com/appium/java-client/pull/1792)
+ - Remove unnecessary annotation. [#1791](https://github.com/appium/java-client/pull/1791)
+ - Force unified imports order. [#1793](https://github.com/appium/java-client/pull/1793)
+- **[DEPENDENCY UPDATES]**
+ - `org.seleniumhq.selenium:selenium-java` was updated to 4.5.0.
+ - `org.owasp.dependencycheck` was updated to 7.3.2.
+ - `io.github.bonigarcia:webdrivermanager` was updated to 5.3.1.
+ - `org.junit.jupiter:junit-jupiter` was updated to 5.9.1.
+ - `org.slf4j:slf4j-api` was updated to 2.0.4.
+ - `com.google.code.gson:gson` was updated to 2.10.0.
+
+*8.2.0*
+- **[ENHANCEMENTS]**
+ - AppiumDriverLocalService can handle outputStreams. [#1709](https://github.com/appium/java-client/pull/1709)
+ - Add creating a driver with ClientConfig. [#1735](https://github.com/appium/java-client/pull/1735)
+- **[BUG FIX]**
+ - Update the environment argument type for mac SupportsEnvironmentOption. [#1712](https://github.com/appium/java-client/pull/1712)
+- **[REFACTOR]**
+ - Deprecate Appium ByAll in favour of Selenium ByAll. [#1740](https://github.com/appium/java-client/pull/1740)
+ - Bump Node.js version in pipeline. [#1713](https://github.com/appium/java-client/pull/1713)
+ - Switch unit tests to run on Junit 5 Jupiter Platform. [#1721](https://github.com/appium/java-client/pull/1721)
+ - Clean up unit tests asserting thrown exceptions. [#1741](https://github.com/appium/java-client/pull/1741)
+ - Fix open notification test. [#1749](https://github.com/appium/java-client/pull/1749)
+ - update Azure pipeline to use macos-11 VM image. [#1728](https://github.com/appium/java-client/pull/1728)
+- **[DEPENDENCY UPDATES]**
+ - `org.seleniumhq.selenium:selenium-java` was updated to 4.4.0.
+ - `org.owasp.dependencycheck` was updated to 7.1.2.
+ - `io.github.bonigarcia:webdrivermanager` was updated to 5.3.0.
+ - `gradle` was updated to 7.5.1.
+ - `com.google.code.gson:gson` was updated to 2.9.1.
+
+*8.1.1*
+- **[BUG FIX]**
+ - Perform safe typecast while getting the platform name. [#1702](https://github.com/appium/java-client/pull/1702)
+ - Add prefix to platformVersion capability name. [#1704](https://github.com/appium/java-client/pull/1704)
+- **[REFACTOR]**
+ - Update e2e tests to make it green. [#1706](https://github.com/appium/java-client/pull/1706)
+ - Ignore the test which has a connected server issue. [#1699](https://github.com/appium/java-client/pull/1699)
+
+*8.1.0*
+- **[ENHANCEMENTS]**
+ - Add new EspressoBuildConfig options. [#1687](https://github.com/appium/java-client/pull/1687)
+- **[DOCUMENTATION]**
+ - delete all references to removed MobileElement class. [#1677](https://github.com/appium/java-client/pull/1677)
+- **[BUG FIX]**
+ - Pass orientation name capability in uppercase. [#1686](https://github.com/appium/java-client/pull/1686)
+ - correction for ping method to get proper status URL. [#1661](https://github.com/appium/java-client/pull/1661)
+ - Remove deprecated option classes. [#1679](https://github.com/appium/java-client/pull/1679)
+ - Remove obsolete event firing decorators. [#1676](https://github.com/appium/java-client/pull/1676)
+- **[DEPENDENCY UPDATES]**
+ - `org.seleniumhq.selenium:selenium-java` was updated to 4.2.0.
+ - `org.owasp.dependencycheck` was updated to 7.1.0.1.
+ - `org.springframework:spring-context` was removed. [#1676](https://github.com/appium/java-client/pull/1676)
+ - `org.aspectj:aspectjweaver` was updated to 1.9.9.
+ - `io.github.bonigarcia:webdrivermanager` was updated to 5.2.0.
+ - `org.projectlombok:lombok` was updated to 1.18.24.
+
+*8.0.0*
+- **[DOCUMENTATION]**
+ - Set minimum Java version to 1.8.0. [#1631](https://github.com/appium/java-client/pull/1631)
+- **[BUG FIX]**
+ - Make interfaces public to fix decorator creation. [#1644](https://github.com/appium/java-client/pull/1644)
+ - Do not convert argument names to lowercase. [#1627](https://github.com/appium/java-client/pull/1627)
+ - Avoid fallback to css for id and name locator annotations. [#1622](https://github.com/appium/java-client/pull/1622)
+ - Fix handling of chinese characters in `AppiumDriverLocalService`. [#1618](https://github.com/appium/java-client/pull/1618)
+- **[DEPENDENCY UPDATES]**
+ - `org.owasp.dependencycheck` was updated to 7.0.0.
+ - `org.springframework:spring-context` was updated to 5.3.16.
+ - `actions/setup-java` was updated to 3.
+ - `actions/checkout` was updated to 3.
+ - `io.github.bonigarcia:webdrivermanager` was updated to 5.1.0.
+ - `org.aspectj:aspectjweaver` was updated to 1.9.8.
+ - `org.slf4j:slf4j-api` was updated to 1.7.36.
+ - `com.github.johnrengelman.shadow` was updated to 7.1.2.
+
+*8.0.0-beta2*
+- **[DOCUMENTATION]**
+ - Add a link to options builder examples to the migration guide. [#1595](https://github.com/appium/java-client/pull/1595)
+- **[BUG FIX]**
+ - Filter out proxyClassLookup method from Proxy class (for Java 16+) in AppiumByBuilder. [#1575](https://github.com/appium/java-client/pull/1575)
+- **[REFACTOR]**
+ - Add more nice functional stuff into page factory helpers. [#1584](https://github.com/appium/java-client/pull/1584)
+ - Switch e2e tests to use Appium2. [#1603](https://github.com/appium/java-client/pull/1603)
+ - relax constraints of Selenium dependencies versions. [#1606](https://github.com/appium/java-client/pull/1606)
+- **[DEPENDENCY UPDATES]**
+ - Upgrade to Selenium 4.1.1. [#1613](https://github.com/appium/java-client/pull/1613)
+ - `org.owasp.dependencycheck` was updated to 6.5.1.
+ - `org.springframework:spring-context` was updated to 5.3.14.
+ - `actions/setup-java` was updated to 2.4.0.
+ - `gradle` was updated to 7.3.
+
+*8.0.0-beta*
+- **[ENHANCEMENTS]**
+ - Start adding UiAutomator2 options. [#1543](https://github.com/appium/java-client/pull/1543)
+ - Add more UiAutomator2 options. [#1545](https://github.com/appium/java-client/pull/1545)
+ - Finish creating options for UiAutomator2 driver. [#1548](https://github.com/appium/java-client/pull/1548)
+ - Add WDA-related XCUITestOptions. [#1552](https://github.com/appium/java-client/pull/1552)
+ - Add web view options for XCUITest driver. [#1557](https://github.com/appium/java-client/pull/1557)
+ - Add the rest of XCUITest driver options. [#1561](https://github.com/appium/java-client/pull/1561)
+ - Add Espresso options. [#1563](https://github.com/appium/java-client/pull/1563)
+ - Add Windows driver options. [#1564](https://github.com/appium/java-client/pull/1564)
+ - Add Mac2 driver options. [#1565](https://github.com/appium/java-client/pull/1565)
+ - Add Gecko driver options. [#1573](https://github.com/appium/java-client/pull/1573)
+ - Add Safari driver options. [#1576](https://github.com/appium/java-client/pull/1576)
+ - Start adding XCUITest driver options. [#1551](https://github.com/appium/java-client/pull/1551)
+ - Implement driver-specific W3C option classes. [#1540](https://github.com/appium/java-client/pull/1540)
+ - Update Service to properly work with options. [#1550](https://github.com/appium/java-client/pull/1550)
+- **[BREAKING CHANGE]**
+ - Migrate to Selenium 4. [#1531](https://github.com/appium/java-client/pull/1531)
+ - Make sure we only write W3C payload into create session command. [#1537](https://github.com/appium/java-client/pull/1537)
+ - Use the new session payload creator inherited from Selenium. [#1535](https://github.com/appium/java-client/pull/1535)
+ - unify locator factories naming and toString implementations. [#1538](https://github.com/appium/java-client/pull/1538)
+ - drop support of deprecated Selendroid driver. [#1553](https://github.com/appium/java-client/pull/1553)
+ - switch to javac compiler. [#1556](https://github.com/appium/java-client/pull/1556)
+ - revise used Selenium dependencies. [#1560](https://github.com/appium/java-client/pull/1560)
+ - change prefix to AppiumBy in locator toString implementation. [#1559](https://github.com/appium/java-client/pull/1559)
+ - enable dependencies caching. [#1567](https://github.com/appium/java-client/pull/1567)
+ - Include more tests into the pipeline. [#1566](https://github.com/appium/java-client/pull/1566)
+ - Tune setting of default platform names. [#1570](https://github.com/appium/java-client/pull/1570)
+ - Deprecate custom event listener implementation and default to the one provided by Selenium4. [#1541](https://github.com/appium/java-client/pull/1541)
+ - Deprecate touch actions. [#1569](https://github.com/appium/java-client/pull/1569)
+ - Deprecate legacy app management helpers. [#1571](https://github.com/appium/java-client/pull/1571)
+ - deprecate Windows UIAutomation selector. [#1562](https://github.com/appium/java-client/pull/1562)
+ - Remove unused entities. [#1572](https://github.com/appium/java-client/pull/1572)
+ - Remove setElementValue helper. [#1577](https://github.com/appium/java-client/pull/1577)
+ - Remove selenium package override. [#1555](https://github.com/appium/java-client/pull/1555)
+ - remove redundant exclusion of Gradle task signMavenJavaPublication. [#1568](https://github.com/appium/java-client/pull/1568)
+- **[DEPENDENCY UPDATES]**
+ - `org.owasp.dependencycheck` was updated to 6.4.1.
+ - `com.google.code.gson:gson` was updated to 2.8.9.
+
+*7.6.0*
+- **[ENHANCEMENTS]**
+ - Add custom commands dynamically [Appium 2.0]. [#1506](https://github.com/appium/java-client/pull/1506)
+ - New General Server flags are added [Appium 2.0]. [#1511](https://github.com/appium/java-client/pull/1511)
+ - Add support of extended Android geolocation. [#1492](https://github.com/appium/java-client/pull/1492)
+- **[BUG FIX]**
+ - AndroidGeoLocation: update the constructor signature to mimic order of parameters in `org.openqa.selenium.html5.Location`. [#1526](https://github.com/appium/java-client/pull/1526)
+ - Prevent duplicate builds for PRs from base repo branches. [#1496](https://github.com/appium/java-client/pull/1496)
+ - Enable Dependabot for GitHub actions. [#1500](https://github.com/appium/java-client/pull/1500)
+ - bind mac2element in element map for mac platform. [#1474](https://github.com/appium/java-client/pull/1474)
+- **[DEPENDENCY UPDATES]**
+ - `org.owasp.dependencycheck` was updated to 6.3.2.
+ - `org.projectlombok:lombok` was updated to 1.18.22.
+ - `com.github.johnrengelman.shadow` was updated to 7.1.0.
+ - `actions/setup-java` was updated to 2.3.1.
+ - `io.github.bonigarcia:webdrivermanager` was updated to 5.0.3.
+ - `org.springframework:spring-context` was updated to 5.3.10.
+ - `org.slf4j:slf4j-api` was updated to 1.7.32.
+ - `com.google.code.gson:gson` was updated to 2.8.8.
+ - `gradle` was updated to 7.1.1.
+ - `commons-io:commons-io` was updated to 2.11.0.
+ - `org.aspectj:aspectjweaver` was updated to 1.9.7.
+ - `org.eclipse.jdt:ecj` was updated to 3.26.0.
+ - `'junit:junit` was updated to 4.13.2.
+
+*7.5.1*
+- **[ENHANCEMENTS]**
+ - Add iOS related annotations to tvOS. [#1456](https://github.com/appium/java-client/pull/1456)
+- **[BUG FIX]**
+ - Bring back automatic quote escaping for desired capabilities command line arguments on windows. [#1454](https://github.com/appium/java-client/pull/1454)
+- **[DEPENDENCY UPDATES]**
+ - `org.owasp.dependencycheck` was updated to 6.1.2.
+ - `org.eclipse.jdt:ecj` was updated to 3.25.0.
+
+*7.5.0*
+- **[ENHANCEMENTS]**
+ - Add support for Appium Mac2Driver. [#1439](https://github.com/appium/java-client/pull/1439)
+ - Add support for multiple image occurrences. [#1445](https://github.com/appium/java-client/pull/1445)
+ - `BOUND_ELEMENTS_BY_INDEX` Setting was added. [#1418](https://github.com/appium/java-client/pull/1418)
+- **[BUG FIX]**
+ - Use lower case for Windows platform key in ElementMap. [#1421](https://github.com/appium/java-client/pull/1421)
+- **[DEPENDENCY UPDATES]**
+ - `org.apache.commons:commons-lang3` was updated to 3.12.0.
+ - `org.springframework:spring-context` was updated to 5.3.4.
+ - `org.owasp.dependencycheck` was updated to 6.1.0.
+ - `io.github.bonigarcia:webdrivermanager` was updated to 4.3.1.
+ - `org.eclipse.jdt:ecj` was updated to 3.24.0.
+ - `org.projectlombok:lombok` was updated to 1.18.16.
+ - `jcenter` repository was removed.
+
+*7.4.1*
+- **[BUG FIX]**
+ - Fix the configuration of `selenium-java` dependency. [#1417](https://github.com/appium/java-client/pull/1417)
+- **[DEPENDENCY UPDATES]**
+ - `gradle` was updated to 6.7.1.
+
+
+*7.4.0*
+- **[ENHANCEMENTS]**
+ - Add ability to set multiple settings. [#1409](https://github.com/appium/java-client/pull/1409)
+ - Support to execute Chrome DevTools Protocol commands against Android Chrome browser session. [#1375](https://github.com/appium/java-client/pull/1375)
+ - Add new upload options i.e withHeaders, withFormFields and withFileFieldName. [#1342](https://github.com/appium/java-client/pull/1342)
+ - Add AndroidOptions and iOSOptions. [#1331](https://github.com/appium/java-client/pull/1331)
+ - Add idempotency key to session creation requests. [#1327](https://github.com/appium/java-client/pull/1327)
+ - Add support for Android capability types: `buildToolsVersion`, `enforceAppInstall`, `ensureWebviewsHavePages`, `webviewDevtoolsPort`, and `remoteAppsCacheLimit`. [#1326](https://github.com/appium/java-client/pull/1326)
+ - Added OTHER_APPS and PRINT_PAGE_SOURCE_ON_FIND_FAILURE Mobile Capability Types. [#1323](https://github.com/appium/java-client/pull/1323)
+ - Make settings available for all AppiumDriver instances. [#1318](https://github.com/appium/java-client/pull/1318)
+ - Add wrappers for the Windows screen recorder. [#1313](https://github.com/appium/java-client/pull/1313)
+ - Add GitHub Action validating Gradle wrapper. [#1296](https://github.com/appium/java-client/pull/1296)
+ - Add support for Android viewmatcher. [#1293](https://github.com/appium/java-client/pull/1293)
+ - Update web view detection algorithm for iOS tests. [#1294](https://github.com/appium/java-client/pull/1294)
+ - Add allow-insecure and deny-insecure server flags. [#1282](https://github.com/appium/java-client/pull/1282)
+- **[BUG FIX]**
+ - Fix jitpack build failures. [#1389](https://github.com/appium/java-client/pull/1389)
+ - Fix parse platformName if it is passed as enum item. [#1369](https://github.com/appium/java-client/pull/1369)
+ - Increase the timeout for graceful AppiumDriverLocalService termination. [#1354](https://github.com/appium/java-client/pull/1354)
+ - Avoid casting to RemoteWebElement in ElementOptions. [#1345](https://github.com/appium/java-client/pull/1345)
+ - Properly translate desiredCapabilities into a command line argument. [#1337](https://github.com/appium/java-client/pull/1337)
+ - Change getDeviceTime to call the `mobile` implementation. [#1332](https://github.com/appium/java-client/pull/1332)
+ - Remove appiumVersion from MobileCapabilityType. [#1325](https://github.com/appium/java-client/pull/1325)
+ - Set appropriate fluent wait timeouts. [#1316](https://github.com/appium/java-client/pull/1316)
+- **[DOCUMENTATION UPDATES]**
+ - Update Appium Environment Troubleshooting. [#1358](https://github.com/appium/java-client/pull/1358)
+ - Address warnings printed by docs linter. [#1355](https://github.com/appium/java-client/pull/1355)
+ - Add java docs for various Mobile Options. [#1331](https://github.com/appium/java-client/pull/1331)
+ - Add AndroidFindBy, iOSXCUITFindBy and WindowsFindBy docs. [#1311](https://github.com/appium/java-client/pull/1311)
+ - Renamed maim.js to main.js. [#1277](https://github.com/appium/java-client/pull/1277)
+ - Improve Readability of Issue Template. [#1260](https://github.com/appium/java-client/pull/1260)
+
+*7.3.0*
+- **[ENHANCEMENTS]**
+ - Add support for logging custom events on the Appium Server. [#1262](https://github.com/appium/java-client/pull/1262)
+ - Update Appium executable detection implementation. [#1256](https://github.com/appium/java-client/pull/1256)
+ - Avoid through NPE if any setting value is null. [#1241](https://github.com/appium/java-client/pull/1241)
+ - Settings API was improved to accept string names. [#1240](https://github.com/appium/java-client/pull/1240)
+ - Switch `runAppInBackground` iOS implementation in sync with other platforms. [#1229](https://github.com/appium/java-client/pull/1229)
+ - JavaDocs for AndroidMobileCapabilityType was updated. [#1238](https://github.com/appium/java-client/pull/1238)
+ - Github Actions were introduced instead of TravisCI. [#1219](https://github.com/appium/java-client/pull/1219)
+- **[BUG FIX]**
+ - Fix return type of `getSystemBars` API. [#1216](https://github.com/appium/java-client/pull/1216)
+ - Avoid using `getSession` call for capabilities values retrieval [W3C Support]. [#1204](https://github.com/appium/java-client/pull/1204)
+ - Fix pagefactory list element initialisation when parameterised by generic type. [#1237](https://github.com/appium/java-client/pull/1237)
+ - Fix AndroidKey commands. [#1250](https://github.com/appium/java-client/pull/1250)
+
+*7.2.0*
+- **[DEPENDENCY UPDATES]**
+ - `org.seleniumhq.selenium:selenium-java` was reverted to stable version 3.141.59. [#1209](https://github.com/appium/java-client/pull/1209)
+ - `org.projectlombok:lombok:1.18.8` was introduced. [#1193](https://github.com/appium/java-client/pull/1193)
+- **[ENHANCEMENTS]**
+ - `videoFilters` property was added to IOSStartScreenRecordingOptions. [#1180](https://github.com/appium/java-client/pull/1180)
+- **[IMPROVEMENTS]**
+ - `Selendroid` automationName was deprecated. [#1198](https://github.com/appium/java-client/pull/1198)
+ - JavaDocs for AndroidMobileCapabilityType and IOSMobileCapabilityType were updated. [#1204](https://github.com/appium/java-client/pull/1204)
+ - JitPack builds were fixed. [#1203](https://github.com/appium/java-client/pull/1203)
+
+*7.1.0*
+- **[ENHANCEMENTS]**
+ - Added an ability to get all the session details. [#1167 ](https://github.com/appium/java-client/pull/1167)
+ - `TRACK_SCROLL_EVENTS`, `ALLOW_INVISIBLE_ELEMENTS`, `ENABLE_NOTIFICATION_LISTENER`,
+ `NORMALIZE_TAG_NAMES` and `SHUTDOWN_ON_POWER_DISCONNECT` Android Settings were added.
+ - `KEYBOARD_AUTOCORRECTION`, `MJPEG_SCALING_FACTOR`,
+ `MJPEG_SERVER_SCREENSHOT_QUALITY`, `MJPEG_SERVER_FRAMERATE`, `SCREENSHOT_QUALITY`
+ and `KEYBOARD_PREDICTION` iOS Settings were added.
+ - `GET_MATCHED_IMAGE_RESULT`, `FIX_IMAGE_TEMPLATE_SCALE`,
+ `SHOULD_USE_COMPACT_RESPONSES`, `ELEMENT_RESPONSE_ATTRIBUTES` and
+ `DEFAULT_IMAGE_TEMPLATE_SCALE` settings were added for both Android and iOS [#1166](https://github.com/appium/java-client/pull/1166), [#1156 ](https://github.com/appium/java-client/pull/1156) and [#1120](https://github.com/appium/java-client/pull/1120)
+ - The new interface `io.appium.java_client.ExecutesDriverScript ` was added. [#1165](https://github.com/appium/java-client/pull/1165)
+ - Added an ability to get status of appium server. [#1153 ](https://github.com/appium/java-client/pull/1153)
+ - `tvOS` platform support was added. [#1142 ](https://github.com/appium/java-client/pull/1142)
+ - The new interface `io.appium.java_client. FindsByAndroidDataMatcher` was added. [#1106](https://github.com/appium/java-client/pull/1106)
+ - The selector strategy `io.appium.java_client.MobileBy.ByAndroidDataMatcher` was added. [#1106](https://github.com/appium/java-client/pull/1106)
+ - Selendroid for android and UIAutomation for iOS are removed. [#1077 ](https://github.com/appium/java-client/pull/1077)
+ - **[BUG FIX]** Platform Name enforced on driver creation is avoided now. [#1164 ](https://github.com/appium/java-client/pull/1164)
+ - **[BUG FIX]** Send both signalStrengh and signalStrength for `GSM_SIGNAL`. [#1115 ](https://github.com/appium/java-client/pull/1115)
+ - **[BUG FIX]** Null pointer exceptions when calling getCapabilities is handled better. [#1094 ](https://github.com/appium/java-client/pull/1094)
+
+- **[DEPENDENCY UPDATES]**
+ - `org.seleniumhq.selenium:selenium-java` was updated to 4.0.0-alpha-1.
+ - `org.aspectj:aspectjweaver` was updated to 1.9.4.
+ - `org.apache.httpcomponents:httpclient` was updated to 4.5.9.
+ - `cglib:cglib` was updated to 3.2.12.
+ - `org.springframework:spring-context` was updated to 5.1.8.RELEASE.
+ - `io.github.bonigarcia:webdrivermanager` was updated to 3.6.1.
+ - `org.eclipse.jdt:ecj` was updated to 3.18.0.
+ - `com.github.jengelman.gradle.plugins:shadow` was updated to 5.1.0.
+ - `checkstyle` was updated to 8.22.
+ - `gradle` was updated to 5.4.
+ - `dependency-check-gradle` was updated to 5.1.0.
+ - `org.slf4j:slf4j-api` was updated to 1.7.26.
+ - `org.apache.commons:commons-lang3` was updated to 3.9.
+
+*7.0.0*
+- **[ENHANCEMENTS]**
+ - The new interface `io.appium.java_client.FindsByAndroidViewTag` was added. [#996](https://github.com/appium/java-client/pull/996)
+ - The selector strategy `io.appium.java_client.MobileBy.ByAndroidViewTag` was added. [#996](https://github.com/appium/java-client/pull/996)
+ - The new interface `io.appium.java_client.FindsByImage` was added. [#990](https://github.com/appium/java-client/pull/990)
+ - The selector strategy `io.appium.java_client.MobileBy.ByImage` was added. [#990](https://github.com/appium/java-client/pull/990)
+ - The new interface `io.appium.java_client.FindsByCustom` was added. [#1041](https://github.com/appium/java-client/pull/1041)
+ - The selector strategy `io.appium.java_client.MobileBy.ByCustom` was added. [#1041](https://github.com/appium/java-client/pull/1041)
+ - DatatypeConverter is replaced with Base64 for JDK 9 compatibility. [#999](https://github.com/appium/java-client/pull/999)
+ - Expand touch options API to accept coordinates as Point. [#997](https://github.com/appium/java-client/pull/997)
+ - W3C capabilities written into firstMatch entity instead of alwaysMatch. [#1010](https://github.com/appium/java-client/pull/1010)
+ - `Selendroid` for android and `UIAutomation` for iOS is deprecated. [#1034](https://github.com/appium/java-client/pull/1034) and [#1074](https://github.com/appium/java-client/pull/1074)
+ - `videoScale` and `fps` screen recording options are introduced for iOS. [#1067](https://github.com/appium/java-client/pull/1067)
+ - `NORMALIZE_TAG_NAMES` setting was introduced for android. [#1073](https://github.com/appium/java-client/pull/1073)
+ - `threshold` argument was added to OccurrenceMatchingOptions. [#1060](https://github.com/appium/java-client/pull/1060)
+ - `org.openqa.selenium.internal.WrapsElement` replaced by `org.openqa.selenium.WrapsElement`. [#1053](https://github.com/appium/java-client/pull/1053)
+ - SLF4J logging support added into Appium Driver local service. [#1014](https://github.com/appium/java-client/pull/1014)
+ - `IMAGE_MATCH_THRESHOLD`, `FIX_IMAGE_FIND_SCREENSHOT_DIMENSIONS`, `FIX_IMAGE_TEMPLATE_SIZE`, `CHECK_IMAGE_ELEMENT_STALENESS`, `UPDATE_IMAGE_ELEMENT_POSITION` and `IMAGE_ELEMENT_TAP_STRATEGY` setting was introduced for image elements. [#1011](https://github.com/appium/java-client/pull/1011)
+- **[BUG FIX]** Better handling of InvocationTargetException [#968](https://github.com/appium/java-client/pull/968)
+- **[BUG FIX]** Map sending keys to active element for W3C compatibility. [#966](https://github.com/appium/java-client/pull/966)
+- **[BUG FIX]** Error message on session creation is improved. [#994](https://github.com/appium/java-client/pull/994)
+- **[DEPENDENCY UPDATES]**
+ - `org.seleniumhq.selenium:selenium-java` was updated to 3.141.59.
+ - `com.google.code.gson:gson` was updated to 2.8.5.
+ - `org.apache.httpcomponents:httpclient` was updated to 4.5.6.
+ - `cglib:cglib` was updated to 3.2.8.
+ - `org.apache.commons:commons-lang3` was updated to 3.8.
+ - `org.springframework:spring-context` was updated to 5.1.0.RELEASE.
+ - `io.github.bonigarcia:webdrivermanager` was updated to 3.0.0.
+ - `org.eclipse.jdt:ecj` was updated to 3.14.0.
+ - `org.slf4j:slf4j-api` was updated to 1.7.25.
+ - `jacoco` was updated to 0.8.2.
+ - `checkstyle` was updated to 8.12.
+ - `gradle` was updated to 4.10.1.
+ - `org.openpnp:opencv` was removed.
+
+*6.1.0*
+- **[BUG FIX]** Initing web socket clients lazily. Report [#911](https://github.com/appium/java-client/issues/911). FIX: [#912](https://github.com/appium/java-client/pull/912).
+- **[BUG FIX]** Fix session payload for W3C. [#913](https://github.com/appium/java-client/pull/913)
+- **[ENHANCEMENT]** Added TouchAction constructor argument verification [#923](https://github.com/appium/java-client/pull/923)
+- **[BUG FIX]** Set retry flag to true by default for OkHttpFactory. [#928](https://github.com/appium/java-client/pull/928)
+- **[BUG FIX]** Fix class cast exception on getting battery info. [#935](https://github.com/appium/java-client/pull/935)
+- **[ENHANCEMENT]** Added an optional format argument to getDeviceTime and update the documentation. [#939](https://github.com/appium/java-client/pull/939)
+- **[ENHANCEMENT]** The switching web socket client implementation to okhttp library. [#941](https://github.com/appium/java-client/pull/941)
+- **[BUG FIX]** Fix of the bug [#924](https://github.com/appium/java-client/issues/924). [#951](https://github.com/appium/java-client/pull/951)
+
+*6.0.0*
+- **[ENHANCEMENT]** Added an ability to set pressure value for iOS. [#879](https://github.com/appium/java-client/pull/879)
+- **[ENHANCEMENT]** Added new server arguments `RELAXED_SECURITY` and `ENABLE_HEAP_DUMP`. [#880](https://github.com/appium/java-client/pull/880)
+- **[BUG FIX]** Use default Selenium HTTP client factory [#877](https://github.com/appium/java-client/pull/877)
+- **[ENHANCEMENT]** Supporting syslog broadcast with iOS [#871](https://github.com/appium/java-client/pull/871)
+- **[ENHANCEMENT]** Added isKeyboardShown command for iOS [#887](https://github.com/appium/java-client/pull/887)
+- **[ENHANCEMENT]** Added battery information accessors [#882](https://github.com/appium/java-client/pull/882)
+- **[BREAKING CHANGE]** Removal of deprecated code. [#881](https://github.com/appium/java-client/pull/881)
+- **[BUG FIX]** Added `NewAppiumSessionPayload`. Bug report: [#875](https://github.com/appium/java-client/issues/875). FIX: [#894](https://github.com/appium/java-client/pull/894)
+- **[ENHANCEMENT]** Added ESPRESSO automation name [#908](https://github.com/appium/java-client/pull/908)
+- **[ENHANCEMENT]** Added a method for output streams cleanup [#909](https://github.com/appium/java-client/pull/909)
+- **[DEPENDENCY UPDATES]**
+ - `com.google.code.gson:gson` was updated to 2.8.4
+ - `org.springframework:spring-context` was updated to 5.0.5.RELEASE
+ - `org.aspectj:aspectjweaver` was updated to 1.9.1
+ - `org.glassfish.tyrus:tyrus-clien` was updated to 1.13.1
+ - `org.glassfish.tyrus:tyrus-container-grizzly` was updated to 1.2.1
+ - `org.seleniumhq.selenium:selenium-java` was updated to 3.12.0
+
+
+*6.0.0-BETA5*
+- **[ENHANCEMENT]** Added clipboard handlers. [#855](https://github.com/appium/java-client/pull/855) [#869](https://github.com/appium/java-client/pull/869)
+- **[ENHANCEMENT]** Added wrappers for Android logcat broadcaster. [#858](https://github.com/appium/java-client/pull/858)
+- **[ENHANCEMENT]** Add bugreport option to Android screen recorder. [#852](https://github.com/appium/java-client/pull/852)
+- **[BUG FIX]** Avoid amending parameters for SET_ALERT_VALUE endpoint. [#867](https://github.com/appium/java-client/pull/867)
+- **[BREAKING CHANGE]** Refactor network connection setting on Android. [#865](https://github.com/appium/java-client/pull/865)
+- **[BUG FIX]** **[BREAKING CHANGE]** Refactor of the `io.appium.java_client.AppiumFluentWait`. It uses `java.time.Duration` for time settings instead of `org.openqa.selenium.support.ui.Duration` and `java.util.concurrent.TimeUnit` [#863](https://github.com/appium/java-client/pull/863)
+- **[BREAKING CHANGE]** `io.appium.java_client.pagefactory.TimeOutDuration` became deprecated. It is going to be removed. Use `java.time.Duration` instead. FIX [#742](https://github.com/appium/java-client/issues/742) [#863](https://github.com/appium/java-client/pull/863).
+- **[BREAKING CHANGE]** `io.appium.java_client.pagefactory.WithTimeOut#unit` became deprecated. It is going to be removed. Use `io.appium.java_client.pagefactory.WithTimeOut#chronoUnit` instead. FIX [#742](https://github.com/appium/java-client/issues/742) [#863](https://github.com/appium/java-client/pull/863).
+- **[BREAKING CHANGE]** constructors of `io.appium.java_client.pagefactory.AppiumElementLocatorFactory`, `io.appium.java_client.pagefactory.AppiumFieldDecorator` and `io.appium.java_client.pagefactory.AppiumElementLocator` which use `io.appium.java_client.pagefactory.TimeOutDuration` as a parameter became deprecated. Use new constructors which use `java.time.Duration`.
+- **[DEPENDENCY UPDATES]**
+ - `org.seleniumhq.selenium:selenium-java` was updated to 3.11.0
+
+*6.0.0-BETA4*
+- **[ENHANCEMENT]** Added handler for isDispalyed in W3C mode. [#833](https://github.com/appium/java-client/pull/833)
+- **[ENHANCEMENT]** Added handlers for sending SMS, making GSM Call, setting GSM signal, voice, power capacity and power AC. [#834](https://github.com/appium/java-client/pull/834)
+- **[ENHANCEMENT]** Added handlers for toggling wifi, airplane mode and data in android. [#835](https://github.com/appium/java-client/pull/835)
+- **[DEPENDENCY UPDATES]**
+ - `org.apache.httpcomponents:httpclient` was updated to 4.5.5
+ - `cglib:cglib` was updated to 3.2.6
+ - `org.springframework:spring-context` was updated to 5.0.3.RELEASE
+
+*6.0.0-BETA3*
+- **[DEPENDENCY UPDATES]**
+ - `org.seleniumhq.selenium:selenium-java` was updated to 3.9.1
+- **[BREAKING CHANGE]** Removal of deprecated listener-methods from the AlertEventListener. [#797](https://github.com/appium/java-client/pull/797)
+- **[BUG FIX]**. Fix the `pushFile` command. [#812](https://github.com/appium/java-client/pull/812) [#816](https://github.com/appium/java-client/pull/816)
+- **[ENHANCEMENT]**. Implemented custom command codec. [#817](https://github.com/appium/java-client/pull/817), [#825](https://github.com/appium/java-client/pull/825)
+- **[ENHANCEMENT]** Added handlers for lock/unlock in iOS. [#799](https://github.com/appium/java-client/pull/799)
+- **[ENHANCEMENT]** AddEd endpoints for screen recording API for iOS and Android. [#814](https://github.com/appium/java-client/pull/814)
+- **[MAJOR ENHANCEMENT]** W3C compliance was provided. [#829](https://github.com/appium/java-client/pull/829)
+- **[ENHANCEMENT]** New capability `MobileCapabilityType.FORCE_MJSONWP` [#829](https://github.com/appium/java-client/pull/829)
+- **[ENHANCEMENT]** Updated applications management endpoints. [#824](https://github.com/appium/java-client/pull/824)
+
+*6.0.0-BETA2*
+- **[ENHANCEMENT]** The `fingerPrint` ability was added. It is supported by Android for now. [#473](https://github.com/appium/java-client/pull/473) [#786](https://github.com/appium/java-client/pull/786)
+- **[BUG FIX]**. Less strict verification of the `PointOption`. [#795](https://github.com/appium/java-client/pull/795)
+
+*6.0.0-BETA1*
+- **[ENHANCEMENT]** **[REFACTOR]** **[BREAKING CHANGE]** **[MAJOR CHANGE]** Improvements of the TouchActions API [#756](https://github.com/appium/java-client/pull/756), [#760](https://github.com/appium/java-client/pull/760):
+ - `io.appium.java_client.touch.ActionOptions` and subclasses were added
+ - old methods of the `TouchActions` were marked `@Deprecated`
+ - new methods which take new options.
+- **[ENHANCEMENT]**. Appium driver local service uses default process environment by default. [#753](https://github.com/appium/java-client/pull/753)
+- **[BUG FIX]**. Removed 'set' prefix from waitForIdleTimeout setting. [#754](https://github.com/appium/java-client/pull/754)
+- **[BUG FIX]**. The asking for session details was optimized. Issue report [764](https://github.com/appium/java-client/issues/764).
+ FIX [#769](https://github.com/appium/java-client/pull/769)
+- **[BUG FIX]** **[REFACTOR]**. Inconsistent MissingParameterException was removed. Improvements of MultiTouchAction. Report: [#102](https://github.com/appium/java-client/issues/102). FIX [#772](https://github.com/appium/java-client/pull/772)
+- **[DEPENDENCY UPDATES]**
+ - `org.apache.commons:commons-lang3` was updated to 3.7
+ - `commons-io:commons-io` was updated to 2.6
+ - `org.springframework:spring-context` was updated to 5.0.2.RELEASE
+ - `org.aspectj:aspectjweaver` was updated to 1.8.13
+ - `org.seleniumhq.selenium:selenium-java` was updated to 3.7.1
+
+*5.0.4*
+- **[BUG FIX]**. Client was crashing when user was testing iOS with server 1.7.0. Report: [#732](https://github.com/appium/java-client/issues/732). Fix: [#733](https://github.com/appium/java-client/pull/733).
+- **[REFACTOR]** **[BREAKING CHANGE]** Excessive invocation of the implicit waiting timeout was removed. This is the breaking change because API of `AppiumElementLocator` and `AppiumElementLocatorFactory` was changed. Request: [#735](https://github.com/appium/java-client/issues/735), FIXES: [#738](https://github.com/appium/java-client/pull/738), [#741](https://github.com/appium/java-client/pull/741)
+- **[DEPENDENCY UPDATES]**
+ - org.seleniumhq.selenium:selenium-java to 3.6.0
+ - com.google.code.gson:gson to 2.8.2
+ - org.springframework:spring-context to 5.0.0.RELEASE
+ - org.aspectj:aspectjweaver to 1.8.11
+
+*5.0.3*
+- **[BUG FIX]** Selenuim version was reverted from boundaries to the single number. Issue report: [#718](https://github.com/appium/java-client/issues/718). FIX: [#722](https://github.com/appium/java-client/pull/722)
+- **[ENHANCEMENT]** The `pushFile` was added to IOSDriver. Feature request: [#720](https://github.com/appium/java-client/issues/720). Implementation: [#721](https://github.com/appium/java-client/pull/721). This feature requires appium node server v>=1.7.0
+
+*5.0.2* **[BUG FIX RELEASE]**
+- **[BUG FIX]** Dependency conflict resolving. The report: [#714](https://github.com/appium/java-client/issues/714). The fix: [#717](https://github.com/appium/java-client/pull/717). This change may affect users who use htmlunit-driver and/or phantomjsdriver. At this case it is necessary to add it to dependency list and to exclude old selenium versions.
+
+*5.0.1* **[BUG FIX RELEASE]**
+- **[BUG FIX]** The fix of the element genering on iOS was fixed. Issue report: [#704](https://github.com/appium/java-client/issues/704). Fix: [#705](https://github.com/appium/java-client/pull/705)
+
+*5.0.0*
+- **[REFACTOR]** **[BREAKING CHANGE]** 5.0.0 finalization. Removal of obsolete code. [#660](https://github.com/appium/java-client/pull/660)
+- **[ENHANCEMENT]** Enable nativeWebTap setting for iOS. [#658](https://github.com/appium/java-client/pull/658)
+- **[ENHANCEMENT]** The `getCurrentPackage` was added. [#657](https://github.com/appium/java-client/pull/657)
+- **[ENHANCEMENT]** The `toggleTouchIDEnrollment` was added. [#659](https://github.com/appium/java-client/pull/659)
+- **[BUG FIX]** The clearing of existing actions/parameters after perform is invoked. [#663](https://github.com/appium/java-client/pull/663)
+- **[BUG FIX]** [#669](https://github.com/appium/java-client/pull/669) missed parameters of the `OverrideWidget` were added:
+ - `iOSXCUITAutomation`
+ - `windowsAutomation`
+- **[BUG FIX]** ByAll was re-implemented. [#680](https://github.com/appium/java-client/pull/680)
+- **[BUG FIX]** **[BREAKING CHANGE]** The issue of compliance with Selenium grid 3.x was fixed. This change is breaking because now java_client is compatible with appiun server v>=1.6.5. Issue report [#655](https://github.com/appium/java-client/issues/655). FIX [#682](https://github.com/appium/java-client/pull/682)
+- **[BUG FIX]** issues related to latest Selenium changes were fixed. Issue report [#696](https://github.com/appium/java-client/issues/696). Fix: [#699](https://github.com/appium/java-client/pull/699).
+- **[UPDATE]** Dependency update
+ - `selenium-java` was updated to 3.5.x
+ - `org.apache.commons-lang3` was updated to 3.6
+ - `org.springframework.spring-context` was updated to 4.3.10.RELEASE
+- **[ENHANCEMENT]** Update of the touch ID enroll method. The older `PerformsTouchID#toggleTouchIDEnrollment` was marked `Deprecated`.
+ It is recoomended to use `PerformsTouchID#toggleTouchIDEnrollment(boolean)` instead. [#695](https://github.com/appium/java-client/pull/695)
+
+
+*5.0.0-BETA9*
+- **[ENHANCEMENT]** Page factory: Mixed locator strategies were implemented. Feature request:[#565](https://github.com/appium/java-client/issues/565) Implementation: [#646](https://github.com/appium/java-client/pull/646)
+- **[DEPRECATED]** All the content of the `io.appium.java_client.youiengine` package was marked `Deprecated`. It is going to be removed. [#652](https://github.com/appium/java-client/pull/652)
+- **[UPDATE]** Update of the `com.google.code.gson:gson` to v2.8.1.
+
+*5.0.0-BETA8*
+- **[ENHANCEMENT]** Page factory classes became which had package visibility are `public` now. [#630](https://github.com/appium/java-client/pull/630)
+ - `io.appium.java_client.pagefactory.AppiumElementLocatorFactory`
+ - `io.appium.java_client.pagefactory.DefaultElementByBuilder`
+ - `io.appium.java_client.pagefactory.WidgetByBuilder`
+
+- **[ENHANCEMENT]** New capabilities were added [#626](https://github.com/appium/java-client/pull/626):
+ - `AndroidMobileCapabilityType#AUTO_GRANT_PERMISSIONS`
+ - `AndroidMobileCapabilityType#ANDROID_NATURAL_ORIENTATION`
+ - `IOSMobileCapabilityType#XCODE_ORG_ID`
+ - `IOSMobileCapabilityType#XCODE_SIGNING_ID`
+ - `IOSMobileCapabilityType#UPDATE_WDA_BUNDLEID`
+ - `IOSMobileCapabilityType#RESET_ON_SESSION_START_ONLY`
+ - `IOSMobileCapabilityType#COMMAND_TIMEOUTS`
+ - `IOSMobileCapabilityType#WDA_STARTUP_RETRIES`
+ - `IOSMobileCapabilityType#WDA_STARTUP_RETRY_INTERVAL`
+ - `IOSMobileCapabilityType#CONNECT_HARDWARE_KEYBOARD`
+ - `IOSMobileCapabilityType#MAX_TYPING_FREQUENCY`
+ - `IOSMobileCapabilityType#SIMPLE_ISVISIBLE_CHECK`
+ - `IOSMobileCapabilityType#USE_CARTHAGE_SSL`
+ - `IOSMobileCapabilityType#SHOULD_USE_SINGLETON_TESTMANAGER`
+ - `IOSMobileCapabilityType#START_IWDP`
+ - `IOSMobileCapabilityType#ALLOW_TOUCHID_ENROLL`
+ - `MobileCapabilityType#EVENT_TIMINGS`
+
+- **[UPDATE]** Dependencies were updated:
+ - `org.seleniumhq.selenium:selenium-java` was updated to 3.4.0
+ - `cglib:cglib` was updated to 3.2.5
+ - `org.apache.httpcomponents:httpclient` was updated to 4.5.3
+ - `commons-validator:commons-validator` was updated to 1.6
+ - `org.springframework:spring-context` was updated to 4.3.8.RELEASE
+
+
+*5.0.0-BETA7*
+- **[ENHANCEMENT]** The ability to customize the polling strategy of the waiting was provided. [#612](https://github.com/appium/java-client/pull/612)
+- **[ENHANCEMENT]** **[REFACTOR]** Methods which were representing time deltas instead of elementary types became `Deprecated`. Methods which use `java.time.Duration` are suugested to be used. [#611](https://github.com/appium/java-client/pull/611)
+- **[ENHANCEMENT]** The ability to calculate screenshots overlap was included. [#595](https://github.com/appium/java-client/pull/595).
+
+
+*5.0.0-BETA6*
+- **[UPDATE]** Update to Selenium 3.3.1
+- **[ENHANCEMENT]** iOS XCUIT mode automation: API to run application in background was added. [#593](https://github.com/appium/java-client/pull/593)
+- **[BUG FIX]** Issue report: [#594](https://github.com/appium/java-client/issues/594). FIX: [#597](https://github.com/appium/java-client/pull/597)
+- **[ENHANCEMENT]** The class chain locator was added. [#599](https://github.com/appium/java-client/pull/599)
+
+
+*5.0.0-BETA5*
+- **[UPDATE]** Update to Selenium 3.2.0
+- **[BUG FIX]** Excessive dependency on `guava` was removed. It causes errors. Issue report: [#588](https://github.com/appium/java-client/issues/588). FIX: [#589](https://github.com/appium/java-client/pull/589).
+- **[ENHANCEMENT]**. The capability `io.appium.java_client.remote.AndroidMobileCapabilityType#SYSTEM_PORT` was added. [#591](https://github.com/appium/java-client/pull/591)
+
+*5.0.0-BETA4*
+- **[ENHANCEMENT]** Android. API to read the performance data was added. [#562](https://github.com/appium/java-client/pull/562)
+- **[REFACTOR]** Android. Simplified the activity starting by reducing the number of parameters through POJO clas. Old methods which start activities were marked `@Deprecated`. [#579](https://github.com/appium/java-client/pull/579) [#585](https://github.com/appium/java-client/pull/585)
+- **[BUG FIX]** Issue report:[#574](https://github.com/appium/java-client/issues/574). Fix:[#582](https://github.com/appium/java-client/pull/582)
+
+*5.0.0-BETA3*
+[BUG FIX]
+- **[BUG FIX]**:Issue report: [#567](https://github.com/appium/java-client/issues/567). Fix: [#568](https://github.com/appium/java-client/pull/568)
+
+*5.0.0-BETA2*
+- **[BUG FIX]**:Issue report: [#549](https://github.com/appium/java-client/issues/549). Fix: [#551](https://github.com/appium/java-client/pull/551)
+- New capabilities were added [#533](https://github.com/appium/java-client/pull/553):
+ - `IOSMobileCapabilityType#USE_NEW_WDA`
+ - `IOSMobileCapabilityType#WDA_LAUNCH_TIMEOUT`
+ - `IOSMobileCapabilityType#WDA_CONNECTION_TIMEOUT`
+
+The capability `IOSMobileCapabilityType#REAL_DEVICE_LOGGER` was removed. [#533](https://github.com/appium/java-client/pull/553)
+
+- **[BUG FIX]/[ENHANCEMENT]**. Issue report: [#552](https://github.com/appium/java-client/issues/552). FIX [#556](https://github.com/appium/java-client/pull/556)
+ - Additional methods were added to the `io.appium.java_client.HasSessionDetails`
+ - `String getPlatformName()`
+ - `String getAutomationName()`
+ - `boolean isBrowser()`
+ - `io.appium.java_client.HasSessionDetails` is used by the ` io.appium.java_client.internal.JsonToMobileElementConverter ` to define which instance of the `org.openqa.selenium.WebElement` subclass should be created.
+
+- **[ENHANCEMENT]**: The additional event firing feature. PR: [#559](https://github.com/appium/java-client/pull/559). The [WIKI chapter about the event firing](https://github.com/appium/java-client/blob/master/docs/The-event_firing.md) was updated.
+
+*5.0.0-BETA1*
+- **[MAJOR ENHANCEMENT]**: Migration to Java 8. Epic: [#399](https://github.com/appium/java-client/issues/399)
+ - API with default implementation. PR [#470](https://github.com/appium/java-client/pull/470)
+ - Tools that provide _Page Object_ engines were redesigned. The migration to [repeatable annotations](http://docs.oracle.com/javase/tutorial/java/annotations/repeating.html). Details you can read there: [#497](https://github.com/appium/java-client/pull/497). [Documentation was synced as well](https://github.com/appium/java-client/blob/master/docs/Page-objects.md#also-it-is-possible-to-define-chained-or-any-possible-locators).
+ - The new functional interface `io.appium.java_client.functions.AppiumFunctio`n was designed. It extends `java.util.function.Function` and `com.google.common.base.Function`. It was designed in order to provide compatibility with the `org.openqa.selenium.support.ui.Wait` [#543](https://github.com/appium/java-client/pull/543)
+ - The new functional interface `io.appium.java_client.functions.ExpectedCondition` was designed. It extends `io.appium.java_client.functions.AppiumFunction` and ```org.openqa.selenium.support.ui.ExpectedCondition```. [#543](https://github.com/appium/java-client/pull/543)
+ - The new functional interface `io.appium.java_client.functions.ActionSupplier` was designed. It extends ```java.util.function.Supplier```. [#543](https://github.com/appium/java-client/pull/543)
+
+- **[MAJOR ENHANCEMENT]**: Migration from Maven to Gradle. Feature request is [#214](https://github.com/appium/java-client/issues/214). Fixes: [#442](https://github.com/appium/java-client/pull/442), [#465](https://github.com/appium/java-client/pull/465).
+
+- **[MAJOR ENHANCEMENT]** **[MAJOR REFACTORING]**. Non-abstract **AppiumDriver**:
+ - Now the `io.appium.java_client.AppiumDriver` can use an instance of any `io.appium.java_client.MobileBy` subclass for the searching. It should work as expected when current session supports the given selector. It will throw `org.openqa.selenium.WebDriverException` otherwise. [#462](https://github.com/appium/java-client/pull/462)
+ - The new interface `io.appium.java_client.FindsByFluentSelector` was added. [#462](https://github.com/appium/java-client/pull/462)
+ - API was redesigned:
+
+ these interfaces were marked deprecated and they are going to be removed [#513](https://github.com/appium/java-client/pull/513)[#514](https://github.com/appium/java-client/pull/514):
+ - `io.appium.java_client.DeviceActionShortcuts`
+ - `io.appium.java_client.android.AndroidDeviceActionShortcuts`
+ - `io.appium.java_client.ios.IOSDeviceActionShortcuts`
+
+ instead following inerfaces were designed:
+ - `io.appium.java_client.HasDeviceTime`
+ - `io.appium.java_client.HidesKeyboard`
+ - `io.appium.java_client.HidesKeyboardWithKeyName`
+ - `io.appium.java_client.PressesKeyCode`
+ - `io.appium.java_client.ios.ShakesDevice`
+ - `io.appium.java_client.HasSessionDetails`
+ _That was done because Windows automation tools have some features that were considered as Android-specific and iOS-specific._
+
+ The list of classes and methods which were marked _deprecated_ and they are going to be removed
+ - `AppiumDriver#swipe(int, int, int, int, int)`
+ - `AppiumDriver#pinch(WebElement)`
+ - `AppiumDriver#pinch(int, int)`
+ - `AppiumDriver#zoom(WebElement)`
+ - `AppiumDriver#zoom(int, int)`
+ - `AppiumDriver#tap(int, WebElement, int)`
+ - `AppiumDriver#tap(int, int, int, int)`
+ - `AppiumDriver#swipe(int, int, int, int, int)`
+ - `MobileElement#swipe(SwipeElementDirection, int)`
+ - `MobileElement#swipe(SwipeElementDirection, int, int, int)`
+ - `MobileElement#zoom()`
+ - `MobileElement#pinch()`
+ - `MobileElement#tap(int, int)`
+ - `io.appium.java_client.SwipeElementDirection` and `io.appium.java_client.TouchebleElement` also were marked deprecated.
+
+ redesign of `TouchAction` and `MultiTouchAction`
+ - constructors were redesigned. There is no strict binding of `AppiumDriver` and `TouchAction` /`MultiTouchAction`. They can consume any instance of a class that implements `PerformsTouchActions`.
+ - `io.appium.java_client.ios.IOSTouchAction` was added. It extends `io.appium.java_client.TouchAction`.
+ - the new interface `io.appium.java_client.PerformsActions` was added. It unifies `TouchAction` and `MultiTouchAction` now. [#543](https://github.com/appium/java-client/pull/543)
+
+ `JsonToMobileElementConverter` re-design [#532](https://github.com/appium/java-client/pull/532):
+ - unused `MobileElementToJsonConverter` was removed
+ - `JsonToMobileElementConverter` is not rhe abstract class now. It generates instances of MobileElement subclasses according to current session parameters
+ - `JsonToAndroidElementConverter` is deprecated now
+ - `JsonToIOSElementConverter` is depreacated now
+ - `JsonToYouiEngineElementConverter` is deprecated now.
+ - constructors of 'AppiumDriver' were re-designed.
+ - constructors of 'AndroidDriver' were re-designed.
+ - constructors of 'IOSDriver' were re-designed.
+
+- **[MAJOR ENHANCEMENT]** Windows automation. Epic [#471](https://github.com/appium/java-client/issues/471)
+ - The new interface `io.appium.java_client.FindsByWindowsAutomation` was added. [#462](https://github.com/appium/java-client/pull/462). With [@jonstoneman](https://github.com/jonstoneman) 's authorship.
+ - The new selector strategy `io.appium.java_client.MobileBy.ByWindowsAutomation` was added. [#462](https://github.com/appium/java-client/pull/462). With [@jonstoneman](https://github.com/jonstoneman) 's authorship.
+ - `io.appium.java_client.windows.WindowsDriver` was designed. [#538](https://github.com/appium/java-client/pull/538)
+ - `io.appium.java_client.windows.WindowsElement` was designed. [#538](https://github.com/appium/java-client/pull/538)
+ - `io.appium.java_client.windows.WindowsKeyCode ` was added. [#538](https://github.com/appium/java-client/pull/538)
+ - Page object tools were updated [#538](https://github.com/appium/java-client/pull/538)
+ - the `io.appium.java_client.pagefactory.WindowsFindBy` annotation was added.
+ - `io.appium.java_client.pagefactory.AppiumFieldDecorator` and supporting tools were actualized.
+
+- **[MAJOR ENHANCEMENT]** iOS XCUIT mode automation:
+ - `io.appium.java_client.remote.AutomationName#IOS_XCUI_TEST` was added
+ - The new interface `io.appium.java_client.FindsByIosNSPredicate` was added. [#462](https://github.com/appium/java-client/pull/462). With [@rafael-chavez](https://github.com/rafael-chavez) 's authorship. It is implemented by `io.appium.java_client.ios.IOSDriver` and `io.appium.java_client.ios.IOSElement`.
+ - The new selector strategy `io.appium.java_client.MobileBy.ByIosNsPredicate` was added. [#462](https://github.com/appium/java-client/pull/462). With [@rafael-chavez](https://github.com/rafael-chavez) 's authorship.
+ - Page object tools were updated [#545](https://github.com/appium/java-client/pull/545), [#546](https://github.com/appium/java-client/pull/546)
+ - the `io.appium.java_client.pagefactory.iOSXCUITFindBy` annotation was added.
+ - `io.appium.java_client.pagefactory.AppiumFieldDecorator` and supporting tools were actualized.
+
+- [ENHANCEMENT] Added the ability to set UiAutomator Congfigurator values. [#410](https://github.com/appium/java-client/pull/410).
+ [#477](https://github.com/appium/java-client/pull/477).
+- [ENHANCEMENT]. Additional methods which perform device rotation were implemented. [#489](https://github.com/appium/java-client/pull/489). [#439](https://github.com/appium/java-client/pull/439). But it works for iOS in XCUIT mode and for Android in UIAutomator2 mode only. The feature request: [#7131](https://github.com/appium/appium/issues/7131)
+- [ENHANCEMENT]. TouchID Implementation (iOS Sim Only). Details: [#509](https://github.com/appium/java-client/pull/509)
+- [ENHANCEMENT]. The ability to use port, ip and log file as server arguments was provided. Feature request: [#521](https://github.com/appium/java-client/issues/521). Fixes: [#522](https://github.com/appium/java-client/issues/522), [#524](https://github.com/appium/java-client/issues/524).
+- [ENHANCEMENT]. The new interface ```io.appium.java_client.android.HasDeviceDetails``` was added. It is implemented by ```io.appium.java_client.android.AndroidDriver``` by default. [#518](https://github.com/appium/java-client/pull/518)
+- [ENHANCEMENT]. New touch actions were added. ```io.appium.java_client.ios.IOSTouchAction#doubleTap(WebElement, int, int)``` and ```io.appium.java_client.ios.IOSTouchAction#doubleTap(WebElement)```. [#523](https://github.com/appium/java-client/pull/523), [#444](https://github.com/appium/java-client/pull/444)
+- [ENHANCEMENT]. All constructors declared by `io.appium.java_client.AppiumDriver` are public now.
+- [BUG FIX]: There was the issue when "@WithTimeout" was changing general timeout of the waiting for elements. Bug report: [#467](https://github.com/appium/java-client/issues/467). Fixes: [#468](https://github.com/appium/java-client/issues/468), [#469](https://github.com/appium/java-client/issues/469), [#480](https://github.com/appium/java-client/issues/480). Read: [supported-settings](https://github.com/appium/appium/blob/master/docs/en/advanced-concepts/settings.md#supported-settings)
+- Added the server flag `io.appium.java_client.service.local.flags.AndroidServerFlag#REBOOT`. [#476](https://github.com/appium/java-client/pull/476)
+- Added `io.appium.java_client.remote.AndroidMobileCapabilityType.APP_WAIT_DURATION ` capability. [#461](https://github.com/appium/java-client/pull/461)
+- the new automation type `io.appium.java_client.remote.MobilePlatform#ANDROID_UIAUTOMATOR2` was add.
+- the new automation type `io.appium.java_client.remote.MobilePlatform#YOUI_ENGINE` was add.
+- Additional capabilities were addede:
+ - `IOSMobileCapabilityType#CUSTOM_SSL_CERT`
+ - `IOSMobileCapabilityType#TAP_WITH_SHORT_PRESS_DURATION`
+ - `IOSMobileCapabilityType#SCALE_FACTOR`
+ - `IOSMobileCapabilityType#WDA_LOCAL_PORT`
+ - `IOSMobileCapabilityType#SHOW_XCODE_LOG`
+ - `IOSMobileCapabilityType#REAL_DEVICE_LOGGER`
+ - `IOSMobileCapabilityType#IOS_INSTALL_PAUSE`
+ - `IOSMobileCapabilityType#XCODE_CONFIG_FILE`
+ - `IOSMobileCapabilityType#KEYCHAIN_PASSWORD`
+ - `IOSMobileCapabilityType#USE_PREBUILT_WDA`
+ - `IOSMobileCapabilityType#PREVENT_WDAATTACHMENTS`
+ - `IOSMobileCapabilityType#WEB_DRIVER_AGENT_URL`
+ - `IOSMobileCapabilityType#KEYCHAIN_PATH`
+ - `MobileCapabilityType#CLEAR_SYSTEM_FILES`
+- **[UPDATE]** to Selenium 3.0.1.
+- **[UPDATE]** to Spring Framework 4.3.5.RELEASE.
+- **[UPDATE]** to AspectJ weaver 1.8.10.
+
+
+
+*4.1.2*
+
+- Following capabilities were added:
+ - `io.appium.java_client.remote.AndroidMobileCapabilityType.ANDROID_INSTALL_TIMEOUT`
+ - `io.appium.java_client.remote.AndroidMobileCapabilityType.NATIVE_WEB_SCREENSHOT`
+ - `io.appium.java_client.remote.AndroidMobileCapabilityType.ANDROID_SCREENSHOT_PATH`. The pull request: [#452](https://github.com/appium/java-client/pull/452)
+- `org.openqa.selenium.Alert` was reimplemented for iOS. Details: [#459](https://github.com/appium/java-client/pull/459)
+- The deprecated `io.appium.java_client.generic.searchcontext` was removed.
+- The dependency on `com.google.code.gson` was updated to 2.7. Also it was adde to exclusions
+ for `org.seleniumhq.selenium` `selenium-java`.
+- The new AutomationName was added. IOS_XCUI_TEST. It is needed for the further development.
+- The new MobilePlatform was added. WINDOWS. It is needed for the further development.
+
+*4.1.1*
+
+BUG FIX: Issue [#450](https://github.com/appium/java-client/issues/450). Fix: [#451](https://github.com/appium/java-client/issues/451). Thanks to [@tutunang](https://github.com/appium/java-client/pull/451) for the report.
+
+*4.1.0*
+- all code marked `@Deprecated` was removed.
+- `getSessionDetails()` was added. Thanks to [@saikrishna321](https://github.com/saikrishna321) for the contribution.
+- FIX [#362](https://github.com/appium/java-client/issues/362), [#220](https://github.com/appium/java-client/issues/220), [#323](https://github.com/appium/java-client/issues/323). Details read there: [#413](https://github.com/appium/java-client/pull/413)
+- FIX [#392](https://github.com/appium/java-client/issues/392). Thanks to [@truebit](https://github.com/truebit) for the bug report.
+- The dependency on `cglib` was replaced by the dependency on `cglib-nodep`. FIX [#418](https://github.com/appium/java-client/issues/418)
+- The casting to the weaker interface `HasIdentity` instead of class `RemoteWebElement` was added. It is the internal refactoring of the `TouchAction`. [#432](https://github.com/appium/java-client/pull/432). Thanks to [@asolntsev](https://github.com/asolntsev) for the contribution.
+- The `setValue` method was moved to `MobileElement`. It works against text input elements on Android.
+- The dependency on `org.springframework` `spring-context` v`4.3.2.RELEASE` was added
+- The dependency on `org.aspectj` `aspectjweaver` v`1.8.9` was added
+- ENHANCEMENT: The alternative event firing engine. The feature request: [#242](https://github.com/appium/java-client/issues/242).
+ Implementation: [#437](https://github.com/appium/java-client/pull/437). Also [new WIKI chapter](https://github.com/appium/java-client/blob/master/docs/The-event_firing.md) was added.
+- ENHANCEMENT: Convenient access to specific commands for each supported mobile OS. Details: [#445](https://github.com/appium/java-client/pull/445)
+- dependencies and plugins were updated
+- ENHANCEMENT: `YouiEngineDriver` was added. Details: [appium server #6215](https://github.com/appium/appium/pull/6215), [#429](https://github.com/appium/java-client/pull/429), [#448](https://github.com/appium/java-client/pull/448). It is just the draft of the new solution that is going to be extended further. Please stay tuned. There are many interesting things are coming up. Thanks to `You I Engine` team for the contribution.
+
+*4.0.0*
+- all code marked `@Deprecated` was removed. Java client won't support old servers (v<1.5.0)
+ anymore.
+- the ability to start an activity using Android intent actions, intent categories, flags and arguments
+ was added to `AndroidDriver`. Thanks to [@saikrishna321](https://github.com/saikrishna321) for the contribution.
+- `scrollTo()` and `scrollToExact()` became deprecated. They are going to be removed in the next release.
+- The interface `io.appium.java_client.ios.GetsNamedTextField` and the declared method `T getNamedTextField(String name)` are
+ deprecated as well. They are going to be removed in the next release.
+- Methods `findElements(String by, String using)` and `findElement(String by, String using)` of `org.openga.selenium.remote.RemoteWebdriver` are public now. Thanks to [@SrinivasanTarget](https://github.com/SrinivasanTarget).
+- the `io.appium.java_client.NetworkConnectionSetting` class was marked deprecated
+- the enum `io.appium.java_client.android.Connection` was added. All supported network bitmasks are defined there.
+- Android. Old methods which get/set connection were marked `@Deprecated`
+- Android. New methods which consume/return `io.appium.java_client.android.Connection` were added.
+- the `commandRepository` field is public now. The modification of the `MobileCommand`
+- Constructors like `AppiumDriver(HttpCommandExecutor executor, Capabilities capabilities)` were added to
+ `io.appium.java_client.android.AndroidDriver` and `io.appium.java_client.ios.IOSDriver`
+- The refactoring of `io.appium.java_client.internal.JsonToMobileElementConverter`. Now it accepts
+ `org.openqa.selenium.remote.RemoteWebDriver` as the constructor parameter. It is possible to re-use
+ `io.appium.java_client.android.internal.JsonToAndroidElementConverter` or
+ `io.appium.java_client.ios.internal.JsonToIOSElementConverter` by RemoteWebDriver when it is needed.
+- Constructors of the abstract `io.appium.java_client.AppiumDriver` were redesigned. Now they require
+ a subclass of `io.appium.java_client.internal.JsonToMobileElementConverter`. Constructors of
+ `io.appium.java_client.android.AndroidDriver` and `io.appium.java_client.ios.IOSDriver` are same still.
+- The `pushFile(String remotePath, File file)` was added to AndroidDriver
+- FIX of TouchAction. Instances of the TouchAction class are reusable now
+- FIX of the swiping issue (iOS, server version >= 1.5.0). Now the swiping is implemented differently by
+ AndroidDriver and IOSDriver. Thanks to [@truebit](https://github.com/truebit) and [@nuggit32](https://github.com/nuggit32) for the catching.
+- the project was integrated with [maven-checkstyle-plugin](https://maven.apache.org/plugins/maven-checkstyle-plugin/). Thanks to [@SrinivasanTarget](https://github.com/SrinivasanTarget) for the work
+- source code was improved according to code style checking rules.
+- the integration with `org.owasp dependency-check-maven` was added. Thanks to [@saikrishna321](https://github.com/saikrishna321)
+ for the work.
+- the integration with `org.jacoco jacoco-maven-plugin` was added. Thanks to [@SrinivasanTarget](https://github.com/SrinivasanTarget) for the contribution.
+
+*3.4.1*
+- Update to Selenium v2.53.0
+- all dependencies were updated to latest versions
+- the dependency on org.apache.commons commons-lang3 v3.4 was added
+- the fix of Widget method invocation.[#340](https://github.com/appium/java-client/issues/340). A class visibility was taken into account. Thanks to [aznime](https://github.com/aznime) for the catching.
+ Server flags were added:
+ - GeneralServerFlag.ASYNC_TRACE
+ - IOSServerFlag.WEBKIT_DEBUG_PROXY_PORT
+- Source code was formatted using [eclipse-java-google-style.xml](https://google-styleguide.googlecode.com/svn/trunk/eclipse-java-google-style.xml). This is not the complete solution. The code style checking is going to be added further. Thanks to [SrinivasanTarget](https://github.com/SrinivasanTarget) for the work!
+
+*3.4.0*
+- Update to Selenium v2.52.0
+- `getAppStrings()` methods are deprecated now. They are going to be removed. `getAppStringMap()` methods were added and now return a map with app strings (keys and values)
+ instead of a string. Thanks to [@rgonalo](https://github.com/rgonalo) for the contribution.
+- Add `getAppStringMap(String language, String stringFile)` method to allow searching app strings in the specified file
+- FIXED of the bug which causes deadlocks of AppiumDriver LocalService in multithreading. Thanks to [saikrishna321](https://github.com/saikrishna321) for the [bug report](https://github.com/appium/java-client/issues/283).
+- FIXED Zoom methods, thanks to [@kkhaidukov](https://github.com/kkhaidukov)
+- FIXED The issue of compatibility of AppiumServiceBuilder with Appium node server v >= 1.5.x. Take a look at [#305](https://github.com/appium/java-client/issues/305)
+- `getDeviceTime()` was added. Thanks to [@SrinivasanTarget](https://github.com/SrinivasanTarget) for the contribution.
+- FIXED `longPressKeyCode()` methods. Now they use the convenient JSONWP command.Thanks to [@kirillbilchenko](https://github.com/kirillbilchenko) for the proposed fix.
+- FIXED javadoc.
+- Page object tools were updated. Details read here: [#311](https://github.com/appium/java-client/issues/311), [#313](https://github.com/appium/java-client/pull/313), [#317](https://github.com/appium/java-client/pull/317). By.name locator strategy is deprecated for Android and iOS. It is still valid for the Selendroid mode. Thanks to [@SrinivasanTarget](https://github.com/SrinivasanTarget) for the helping.
+- The method `lockScreen(seconds)` is deprecated and it is going to be removed in the next release. Since Appium node server v1.5.x it is recommended to use
+ `AndroidDriver.lockDevice()...AndroidDriver.unlockDevice()` or `IOSDriver.lockDevice(int seconds)` instead. Thanks to [@namannigam](https://github.com/namannigam) for
+ the catching. Read [#315](https://github.com/appium/java-client/issues/315)
+- `maven-release-plugin` was added to POM.XML configuration
+- [#320](https://github.com/appium/java-client/issues/320) fix. The `Widget.getSelfReference()` was added. This method allows to extract a real widget-object from inside a proxy at some extraordinary situations. Read: [PR](https://github.com/appium/java-client/pull/327). Thanks to [SergeyErmakovMercDev](https://github.com/SergeyErmakovMercDev) for the reporting.
+- all capabilities were added according to [this description](https://github.com/appium/appium/blob/1.5/docs/en/writing-running-appium/caps.md). There are three classes: `io.appium.java_client.remote.MobileCapabilityType` (just modified), `io.appium.java_client.remote.AndroidMobileCapabilityType` (android-specific capabilities), `io.appium.java_client.remote.IOSMobileCapabilityType` (iOS-specific capabilities). Details are here: [#326](https://github.com/appium/java-client/pull/326)
+- some server flags were marked `deprecated` because they are deprecated since server node v1.5.x. These flags are going to be removed at the java client release. Details are here: [#326](https://github.com/appium/java-client/pull/326)
+- The ability to start Appium node programmatically using desired capabilities. This feature is compatible with Appium node server v >= 1.5.x. Details are here: [#326](https://github.com/appium/java-client/pull/326)
+
+*3.3.0*
+- updated the dependency on Selenium to version 2.48.2
+- bug fix and enhancements of io.appium.java_client.service.local.AppiumDriverLocalService
+ - FIXED bug which was found and reproduced with Eclipse for Mac OS X. Please read about details here: [#252](https://github.com/appium/java-client/issues/252)
+ Thanks to [saikrishna321](https://github.com/saikrishna321) for the bug report
+ - FIXED bug which was found out by [Jonahss](https://github.com/Jonahss). Thanks for the reporting. Details: [#272](https://github.com/appium/java-client/issues/272)
+ and [#273](https://github.com/appium/java-client/issues/273)
+ - For starting an appium server using localService, added additional environment variable to specify the location of Node.js binary: NODE_BINARY_PATH
+ - The ability to set additional output streams was provided
+- The additional __startActivity()__ method was added to AndroidDriver. It allows to start activities without the stopping of a target app
+ Thanks to [deadmoto](https://github.com/deadmoto) for the contribution
+- The additional extension of the Page Object design pattern was designed. Please read about details here: [#267](https://github.com/appium/java-client/pull/267)
+- New public constructors to AndroidDriver/IOSDriver that allow passing a custom HttpClient.Factory Details: [#276](https://github.com/appium/java-client/pull/278) thanks to [baechul](https://github.com/baechul)
+
+*3.2.0*
+- updated the dependency on Selenium to version 2.47.1
+- the new dependency on commons-validator v1.4.1
+- the ability to start programmatically/silently an Appium node server is provided now. Details please read at [#240](https://github.com/appium/java-client/pull/240).
+ Historical reference: [The similar solution](https://github.com/Genium-Framework/Appium-Support) has been designed by [@Hassan-Radi](https://github.com/Hassan-Radi).
+ The mentioned framework and the current solution use different approaches.
+- Throwing declarations were added to some searching methods. The __"getMouse"__ method of RemoteWebDriver was marked __Deprecated__
+- Add `replaceValue` method for elements.
+- Replace `sendKeyEvent()` method in android with pressKeyCode(int key) and added: pressKeyCode(int key, Integer metastate), longPressKeyCode(int key), longPressKeyCode(int key, Integer metastate)
+
+*3.1.1*
+- Page-object findBy strategies are now aware of which driver (iOS or Android) you are using. For more details see the Pull Request: https://github.com/appium/java-client/pull/213
+- If somebody desires to use their own Webdriver implementation then it has to implement HasCapabilities.
+- Added a new annotation: `WithTimeout`. This annotation allows one to specify a specific timeout for finding an element which overrides the drivers default timeout. For more info see: https://github.com/appium/java-client/pull/210
+- Corrected an uninformative Exception message.
+
+*3.0.0*
+- AppiumDriver class is now a Generic. This allows us to return elements of class MobileElement (and its subclasses) instead of always returning WebElements and requiring users to cast to MobileElement. See https://github.com/appium/java-client/pull/182
+- Full set of Android KeyEvents added.
+- Selenium client version updated to 2.46
+- PageObject enhancements
+- Junit dependency removed
+
+*2.2.0*
+- Added new TouchAction methods for LongPress, on an element, at x,y coordinates, or at an offset from within an element
+- SwipeElementDirection changed. Read the documentation, it's now smarter about how/where to swipe
+- Added APPIUM_VERSION MobileCapabilityType
+- `sendKeyEvent()` moved from AppiumDriver to AndroidDriver
+- `linkText` and `partialLinkText` locators added
+- setValue() moved from MobileElement to iOSElement
+- Fixed Selendroid PageAnnotations
+
+*2.1.0*
+- Moved hasAppString() from AndroidDriver to AppiumDriver
+- Fixes to PageFactory
+- Added @AndroidFindAll and @iOSFindAll
+- Added toggleLocationServices() to AndroidDriver
+- Added touchAction methods to MobileElement, so now you can do `element.pinch()`, `element.zoom()`, etc.
+- Added the ability to choose a direction to swipe over an element. Use the `SwipeElementDirection` enums: `UP, DOWN, LEFT, RIGHT`
+
+*2.0.0*
+- AppiumDriver is now an abstract class, use IOSDriver and AndroidDriver which both extend it. You no longer need to include the `PLATFORM_NAME` desired capability since it's automatic for each class. Thanks to @TikhomirovSergey for all their work
+- ScrollTo() and ScrollToExact() methods reimplemented
+- Zoom() and Pinch() are now a little smarter and less likely to fail if you element is near the edge of the screen. Congratulate @BJap on their first PR!
+
+*1.7.0*
+- Removed `scrollTo()` and `scrollToExact()` methods because they relied on `complexFind()`. They will be added back in the next version!
+- Removed `complexFind()`
+- Added `startActivity()` method
+- Added `isLocked()` method
+- Added `getSettings()` and `ignoreUnimportantViews()` methods
+
+*1.6.2*
+- Added MobilePlatform interface (Android, IOS, FirefoxOS)
+- Added MobileBrowserType interface (Safari, Browser, Chromium, Chrome)
+- Added MobileCapabilityType.APP_WAIT_ACTIVITY
+- Fixed small Integer cast issue (in Eclipse it won't compile)
+- Set -source and -target of the Java Compiler to 1.7 (for maven compiler plugin)
+- Fixed bug in Page Factory
+
+*1.6.1*
+- Fixed the logic for checking connection status on NetworkConnectionSetting objects
+
+*1.6.0*
+- Added @findBy annotations. Explanation here: https://github.com/appium/java-client/pull/68 Thanks to TikhomirovSergey
+- Appium Driver now implements LocationContext interface, so setLocation() works for setting GPS coordinates
+
+*1.5.0*
+- Added MobileCapabilityType enums for desired capabilities
+- `findElement` and `findElements` return MobileElement objects (still need to be casted, but no longer instantiated)
+- new appium v1.2 `hideKeyboard()` strategies added
+- `getNetworkConnection()` and `setNetworkConnection()` commands added
+
+*1.4.0*
+- Added openNotifications() method, to open the notifications shade on Android
+- Added pullFolder() method, to pull an entire folder as a zip archive from a device/simulator
+- Upgraded Selenium dependency to 2.42.2
+
+*1.3.0*
+- MultiGesture with a single TouchAction fixed for Android
+- Now depends upon Selenium java client 2.42.1
+- Cleanup of Errorcode handling, due to merging a change into Selenium
+
+*1.2.1*
+- fix dependency issue
+
+*1.2.0*
+- complexFind() now returns MobileElement objects
+- added scrollTo() and scrollToExact() methods for use with complexFind()
+
+*1.1.0*
+- AppiumDriver now implements Rotatable. rotate() and getOrientation() methods added
+- when no appium server is running, the proper error is thrown, instead of a NullPointerException
+
+*1.0.2*
+- recompiled to include some missing methods such as shake() and complexFind()
diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md
index de0ad9449..6dc55c833 100644
--- a/ISSUE_TEMPLATE.md
+++ b/ISSUE_TEMPLATE.md
@@ -1,12 +1,12 @@
## Description
-Please describe the issue. It may be a bug description. So then please briefly descride steps which you were trying to perform and what happened instead.
-If there is the feature you want to see added to Appium Java client so please describe necessity of this feature and the way that it should work.
+Please describe the issue. If it is a bug, please briefly describe the steps to reproduce and the actual vs expected behavior.
+If there is a feature that you would like to see added to the Appium Java client, please describe the necessity of this feature and the way that it should work.
## Environment
-* java client build version or git revision if you use some shapshot:
-* Appium server version or git revision if you use some shapshot:
+* Java client build version or git revision if you use some snapshot:
+* Appium server version or git revision if you use some snapshot:
* Desktop OS/version used to run Appium if necessary:
* Node.js version (unless using Appium.app|exe) or Appium CLI or Appium.app|exe:
* Mobile platform/version under test:
@@ -19,16 +19,16 @@ Please provide more details, if necessary.
## Code To Reproduce Issue [ Good To Have ]
-Please remember that, with sample code; it's easier to reproduce bug and much faster to fix it.
-You can git clone https://github.com/appium/sample-code or https://github.com/appium/sample-code/tree/master/sample-code/apps and reproduce an issue using Java and sample apps.
+Please remember: it's easier to reproduce and fix the bug with sample code.
+You can git clone https://github.com/appium/appium/tree/master/sample-code or https://github.com/appium/appium/tree/master/sample-code/apps and reproduce an issue using Java and sample apps.
Also you can create a [gist](https://gist.github.com) with pasted java code sample or put it here using markdown. About markdown please read [Mastering markdown](https://guides.github.com/features/mastering-markdown/) and
[Writing on GitHub](https://help.github.com/categories/writing-on-github/)
-## Ecxeption stacktraces
+## Exception Stacktraces
-Please create a [gist](https://gist.github.com) with pasted stacktrace of exception thrown by java.
+Please create a [gist](https://gist.github.com) with the pasted stacktrace of the exception thrown by java.
-## Link to Appium logs
+## Link To Appium Logs
Please create a [gist](https://gist.github.com) which is a paste of your _full_ Appium logs, and link them here. Do _not_ paste your full Appium logs here, as it will make this issue very long and hard to read!
If you are reporting a bug, _always_ include Appium logs as linked gists! It helps to define the problem correctly and clearly.
diff --git a/NOTICE b/NOTICE
index c74837a3d..fab54b9d8 100644
--- a/NOTICE
+++ b/NOTICE
@@ -1 +1 @@
-Copyright 2014-2017 Appium Contributors
+Copyright 2014-2018 Appium Contributors
diff --git a/README.md b/README.md
index de0e3d128..7f3f54480 100644
--- a/README.md
+++ b/README.md
@@ -1,438 +1,273 @@
# java-client
-[](https://maven-badges.herokuapp.com/maven-central/io.appium/java-client)
-[](http://www.javadoc.io/doc/io.appium/java-client)
-[](https://www.codacy.com/app/appium/java-client)
-[](https://travis-ci.org/appium/java-client)
+[](https://central.sonatype.com/artifact/io.appium/java-client)
+[](https://www.javadoc.io/doc/io.appium/java-client)
+[](https://github.com/appium/java-client/actions/workflows/ci.yml)
-This is the Java language binding for writing Appium Tests, conforms to [Mobile JSON Wire Protocol](https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md)
+This is the Java language bindings for writing Appium Tests that conform to [WebDriver Protocol](https://w3c.github.io/webdriver/)
-[API docs](http://appium.github.io/java-client/)
-### Features and other interesting information
+## v9 to v10 Migration
-[Tech stack](https://github.com/appium/java-client/blob/master/docs/Tech-stack.md)
+Follow the [v9 to v10 Migration Guide](./docs/v9-to-v10-migration-guide.md) to streamline the migration process.
-[How to install the project](https://github.com/appium/java-client/blob/master/docs/Installing-the-project.md)
+## v8 to v9 Migration
-[WIKI](https://github.com/appium/java-client/wiki)
+Since v9 the client only supports Java 11 and above.
+Follow the [v8 to v9 Migration Guide](./docs/v8-to-v9-migration-guide.md) to streamline the migration process.
+
+## v7 to v8 Migration
+
+Since version 8 Appium Java Client had several major changes, which might require to
+update your client code. Make sure to follow the [v7 to v8 Migration Guide](./docs/v7-to-v8-migration-guide.md)
+to streamline the migration process.
+
+## Add Appium java client to your test framework
+
+### Stable
+
+#### Maven
+
+Add the following to pom.xml:
+
+```xml
+
+ io.appium
+ java-client
+ ${version.you.require}
+ test
+
+```
+
+#### Gradle
+
+Add the following to build.gradle:
+
+```groovy
+dependencies {
+ testImplementation 'io.appium:java-client:${version.you.require}'
+}
+```
+
+### Beta/Snapshots
+
+Java client project is available to use even before it is officially published to Maven Central. Refer [jitpack.io](https://jitpack.io/#appium/java-client)
+
+#### Maven
+
+Add the following to pom.xml:
+
+```xml
+
+
+ jitpack.io
+ https://jitpack.io
+
+
+```
+
+Add the dependency:
+
+```xml
+
+ com.github.appium
+ java-client
+ latest commit ID from master branch
+
+```
+
+#### Gradle
+
+Add the JitPack repository to your build file. Add it to your root build.gradle at the end of repositories:
+
+```groovy
+allprojects {
+ repositories {
+ // ...
+ maven { url 'https://jitpack.io' }
+ }
+}
+```
+
+Add the dependency:
+
+```groovy
+dependencies {
+ implementation 'com.github.appium:java-client:latest commit id from master branch'
+}
+```
+
+### Compatibility Matrix
+ Appium Java Client | Selenium client
+----------------------------------------------------------------------------------------------------|-----------------------------
+`next` (not released yet) | `4.36.0`
+`10.0.0` | `4.35.0`, `4.36.0`
+`9.5.0` | `4.34.0`
+`9.4.0` | `4.26.0`, `4.27.0`, `4.28.0`, `4.28.1`, `4.29.0`, `4.30.0`, `4.31.0`, `4.32.0`, `4.33.0`
+ `9.2.1`(known issues: appium/java-client#2145, appium/java-client#2146), `9.2.2`, `9.2.3`, `9.3.0` | `4.19.0`, `4.19.1`, `4.20.0`, `4.21.0`, `4.22.0`, `4.23.0`, `4.23.1`, `4.24.0`, `4.25.0`, `4.26.0`, `4.27.0`
+ `9.1.0`, `9.2.0` | `4.17.0`, `4.18.0`, `4.18.1`
+ `9.0.0` | `4.14.1`, `4.15.0`, `4.16.0` (partially [corrupted](https://github.com/SeleniumHQ/selenium/issues/13256)), `4.16.1`
+ N/A | `4.14.0`
+ `8.5.0`, `8.5.1`, `8.6.0` | `4.9.1`, `4.10.0`, `4.11.0`, `4.12.0`, `4.12.1` (known issue: appium/java-client#2004), `4.13.0`
+ `8.4.0` | `4.8.2`, `4.8.3`, `4.9.0`
+ `8.3.0` | `4.7.0`, `4.7.1`, `4.7.2`, `4.8.0`, `4.8.1`
+ `8.2.1` | `4.5.0`, `4.5.1`, `4.5.2`, `4.5.3`, `4.6.0`
+
+#### Why is it so complicated?
+
+Selenium client does not follow [Semantic Versioning](https://semver.org/), so breaking changes might be introduced
+even in patches, which requires the Appium team to update the Java client in response.
+
+#### How to pin Selenium dependencies?
+
+Appium Java Client declares Selenium dependencies using an open version range which is handled differently by different
+build tools. Sometimes users may want to pin used Selenium dependencies for [various reasons](https://github.com/appium/java-client/issues/1823).
+Follow the [Transitive Dependencies Management article](docs/transitive-dependencies-management.md) for more information
+about establishing a fixed Selenium version for your Java test framework.
+
+## Drivers Support
+
+Appium java client has dedicated classes to support the following Appium drivers:
+
+- [UiAutomator2](https://github.com/appium/appium-uiautomator2-driver) and [Espresso](https://github.com/appium/appium-espresso-driver): [AndroidDriver](src/main/java/io/appium/java_client/android/AndroidDriver.java)
+- [XCUITest](https://github.com/appium/appium-xcuitest-driver): [IOSDriver](src/main/java/io/appium/java_client/ios/IOSDriver.java)
+- [Windows](https://github.com/appium/appium-windows-driver): [WindowsDriver](src/main/java/io/appium/java_client/windows/WindowsDriver.java)
+- [Safari](https://github.com/appium/appium-safari-driver): [SafariDriver](src/main/java/io/appium/java_client/safari/SafariDriver.java)
+- [Gecko](https://github.com/appium/appium-geckodriver): [GeckoDriver](src/main/java/io/appium/java_client/gecko/GeckoDriver.java)
+- [Mac2](https://github.com/appium/appium-mac2-driver): [Mac2Driver](src/main/java/io/appium/java_client/mac/Mac2Driver.java)
+
+To automate other platforms that are not listed above you could use
+[AppiumDriver](src/main/java/io/appium/java_client/AppiumDriver.java) or its custom derivatives.
+
+Appium java client is built on top of Selenium and implements the same interfaces that the foundation
+[RemoteWebDriver](https://github.com/SeleniumHQ/selenium/blob/trunk/java/src/org/openqa/selenium/remote/RemoteWebDriver.java)
+does. However, Selenium lib is mostly focused on web browser automation while
+Appium is universal and covers a wide range of possible platforms, e.g. mobile and desktop
+operating systems, IOT devices, etc. Thus, the foundation `AppiumDriver` class in this package
+extends `RemoteWebDriver` with additional features, and makes it more flexible, so it is not so
+strictly focused on web-browser related operations.
+
+## Appium Server Service Wrapper
+
+Appium java client provides a dedicated class to control Appium server execution.
+The class is [AppiumDriverLocalService](src/main/java/io/appium/java_client/service/local/AppiumDriverLocalService.java).
+It allows to run and verify the Appium server **locally** from your test framework code
+and provides several convenient shortcuts. The service could be used as below:
+
+```java
+AppiumDriverLocalService service = AppiumDriverLocalService.buildDefaultService();
+service.start();
+try {
+ // do stuff with drivers
+} finally {
+ service.stop();
+}
+```
+
+You could customize the service behavior, for example, provide custom
+command line arguments or change paths to server executables
+using [AppiumServiceBuilder](src/main/java/io/appium/java_client/service/local/AppiumServiceBuilder.java)
+
+**Note**
+
+> AppiumDriverLocalService does not support server management on non-local hosts
+
+## Usage Examples
+
+### UiAutomator2
+
+```java
+UiAutomator2Options options = new UiAutomator2Options()
+ .setUdid("123456")
+ .setApp("/home/myapp.apk");
+AndroidDriver driver = new AndroidDriver(
+ // The default URL in Appium 1 is http://127.0.0.1:4723/wd/hub
+ new URI("http://127.0.0.1:4723").toURL(), options
+);
+try {
+ WebElement el = driver.findElement(AppiumBy.xpath("//Button"));
+ el.click();
+ driver.getPageSource();
+} finally {
+ driver.quit();
+}
+```
+
+### XCUITest
+
+```java
+XCUITestOptions options = new XCUITestOptions()
+ .setUdid("123456")
+ .setApp("/home/myapp.ipa");
+IOSDriver driver = new IOSDriver(
+ // The default URL in Appium 1 is http://127.0.0.1:4723/wd/hub
+ new URI("http://127.0.0.1:4723").toURL(), options
+);
+try {
+ WebElement el = driver.findElement(AppiumBy.accessibilityId("myId"));
+ el.click();
+ driver.getPageSource();
+} finally {
+ driver.quit();
+}
+```
+
+### Any generic driver that does not have a dedicated class
+
+```java
+BaseOptions options = new BaseOptions()
+ .setPlatformName("myplatform")
+ .setAutomationName("mydriver")
+ .amend("mycapability1", "capvalue1")
+ .amend("mycapability2", "capvalue2");
+AppiumDriver driver = new AppiumDriver(
+ // The default URL in Appium 1 is http://127.0.0.1:4723/wd/hub
+ new URI("http://127.0.0.1:4723").toURL(), options
+);
+try {
+ WebElement el = driver.findElement(AppiumBy.className("myClass"));
+ el.click();
+ driver.getPageSource();
+} finally {
+ driver.quit();
+}
+```
+
+Check the corresponding driver's READMEs to know the list of capabilities and features it supports.
+
+You can find many more code examples by checking client's
+[unit and integration tests](src/test/java/io/appium/java_client).
+
+## Troubleshooting
+
+### InaccessibleObjectException is thrown in runtime if Java 16+ is used
+
+Appium Java client uses reflective access to private members of other modules
+to ensure proper functionality of several features, like the Page Object model.
+If you get a runtime exception and `InaccessibleObjectException` is present in
+the stack trace and your Java runtime is at version 16 or higher, then consider the following
+[Oracle's tutorial](https://docs.oracle.com/en/java/javase/16/migrate/migrating-jdk-8-later-jdk-releases.html#GUID-7BB28E4D-99B3-4078-BDC4-FC24180CE82B)
+and/or checking [existing issues](https://github.com/appium/java-client/search?q=InaccessibleObjectException&type=issues)
+for possible solutions. The idea there would be to explicitly allow
+access for particular modules using `--add-exports/--add-opens` command line arguments.
+
+Another possible, but weakly advised solution, would be to downgrade Java to
+version 15 or lower.
+
+### Issues related to environment variables' presence or to their values
+
+Such issues are usually the case when the Appium server is started directly from your
+framework code rather than run separately by a script or manually. Depending
+on the way the server process is started it may or may not inherit the currently
+active shell environment. That is why you may still receive errors about the variables'
+presence even though these variables are defined for your command line interpreter.
+Again, there is no universal solution to that, as there are many ways to spin up a new
+server process. Consider checking the [Appium Environment Troubleshooting](docs/environment.md)
+document for more information on how to debug and fix process environment issues.
## Changelog
-*5.0.0 (under construction yet)*
-- **[REFACTOR]** **[BREAKING CHANGE]** 5.0.0 finalization. Removal of obsolete code. [#660](https://github.com/appium/java-client/pull/660)
-- **[ENHANCEMENT]** Enable nativeWebTap setting for iOS. [#658](https://github.com/appium/java-client/pull/658)
-- **[ENHANCEMENT]** The `getCurrentPackage` was added. [#657](https://github.com/appium/java-client/pull/657)
-- **[ENHANCEMENT]** The `toggleTouchIDEnrollment` was added. [#659](https://github.com/appium/java-client/pull/659)
-- **[BUG FIX]** The clearing of existing actions/parameters after perform is invoked. [#663](https://github.com/appium/java-client/pull/663)
-- **[BUG FIX]** [#669](https://github.com/appium/java-client/pull/669) missed parameters of the `OverrideWidget` were added:
- - `iOSXCUITAutomation`
- - `windowsAutomation`
-- **[BUG FIX]** ByAll was re-implemented. [#680](https://github.com/appium/java-client/pull/680)
-- **[BUG FIX]** **[BREAKING CHANGE]** The issue of compliance with Selenium grid 3.x was fixed. This change is breaking because now java_client is compatible with appiun server v>=1.6.5. Issue report [#655](https://github.com/appium/java-client/issues/655). FIX [#682](https://github.com/appium/java-client/pull/682)
-
-*5.0.0-BETA9*
-- **[ENHANCEMENT]** Page factory: Mixed locator strategies were implemented. Feature request:[#565](https://github.com/appium/java-client/issues/565) Implementation: [#646](https://github.com/appium/java-client/pull/646)
-- **[DEPRECATED]** All the content of the `io.appium.java_client.youiengine` package was marked `Deprecated`. It is going to be removed. [#652](https://github.com/appium/java-client/pull/652)
-- **[UPDATE]** Update of the `com.google.code.gson:gson` to v2.8.1.
-
-*5.0.0-BETA8*
-- **[ENHANCEMENT]** Page factory classes became which had package visibility are `public` now. [#630](https://github.com/appium/java-client/pull/630)
- - `io.appium.java_client.pagefactory.AppiumElementLocatorFactory`
- - `io.appium.java_client.pagefactory.DefaultElementByBuilder`
- - `io.appium.java_client.pagefactory.WidgetByBuilder`
-
-- **[ENHANCEMENT]** New capabilities were added [#626](https://github.com/appium/java-client/pull/626):
- - `AndroidMobileCapabilityType#AUTO_GRANT_PERMISSIONS`
- - `AndroidMobileCapabilityType#ANDROID_NATURAL_ORIENTATION`
- - `IOSMobileCapabilityType#XCODE_ORG_ID`
- - `IOSMobileCapabilityType#XCODE_SIGNING_ID`
- - `IOSMobileCapabilityType#UPDATE_WDA_BUNDLEID`
- - `IOSMobileCapabilityType#RESET_ON_SESSION_START_ONLY`
- - `IOSMobileCapabilityType#COMMAND_TIMEOUTS`
- - `IOSMobileCapabilityType#WDA_STARTUP_RETRIES`
- - `IOSMobileCapabilityType#WDA_STARTUP_RETRY_INTERVAL`
- - `IOSMobileCapabilityType#CONNECT_HARDWARE_KEYBOARD`
- - `IOSMobileCapabilityType#MAX_TYPING_FREQUENCY`
- - `IOSMobileCapabilityType#SIMPLE_ISVISIBLE_CHECK`
- - `IOSMobileCapabilityType#USE_CARTHAGE_SSL`
- - `IOSMobileCapabilityType#SHOULD_USE_SINGLETON_TESTMANAGER`
- - `IOSMobileCapabilityType#START_IWDP`
- - `IOSMobileCapabilityType#ALLOW_TOUCHID_ENROLL`
- - `MobileCapabilityType#EVENT_TIMINGS`
-
-- **[UPDATE]** Dependencies were updated:
- - `org.seleniumhq.selenium:selenium-java` was updated to 3.4.0
- - `cglib:cglib` was updated to 3.2.5
- - `org.apache.httpcomponents:httpclient` was updated to 4.5.3
- - `commons-validator:commons-validator` was updated to 1.6
- - `org.springframework:spring-context` was updated to 4.3.8.RELEASE
-
-
-*5.0.0-BETA7*
-- **[ENHANCEMENT]** The ability to customize the polling strategy of the waiting was provided. [#612](https://github.com/appium/java-client/pull/612)
-- **[ENHANCEMENT]** **[REFACTOR]** Methods which were representing time deltas instead of elementary types became `Deprecated`. Methods which use `java.time.Duration` are suugested to be used. [#611](https://github.com/appium/java-client/pull/611)
-- **[ENHANCEMENT]** The ability to calculate screenshots overlap was included. [#595](https://github.com/appium/java-client/pull/595).
-
-
-*5.0.0-BETA6*
-- **[UPDATE]** Update to Selenium 3.3.1
-- **[ENHANCEMENT]** iOS XCUIT mode automation: API to run application in background was added. [#593](https://github.com/appium/java-client/pull/593)
-- **[BUG FIX]** Issue report: [#594](https://github.com/appium/java-client/issues/594). FIX: [#597](https://github.com/appium/java-client/pull/597)
-- **[ENHANCEMENT]** The class chain locator was added. [#599](https://github.com/appium/java-client/pull/599)
-
-
-*5.0.0-BETA5*
-- **[UPDATE]** Update to Selenium 3.2.0
-- **[BUG FIX]** Excessive dependency on `guava` was removed. It causes errors. Issue report: [#588](https://github.com/appium/java-client/issues/588). FIX: [#589](https://github.com/appium/java-client/pull/589).
-- **[ENHANCEMENT]**. The capability `io.appium.java_client.remote.AndroidMobileCapabilityType#SYSTEM_PORT` was added. [#591](https://github.com/appium/java-client/pull/591)
-
-*5.0.0-BETA4*
-- **[ENHANCEMENT]** Android. API to read the performance data was added. [#562](https://github.com/appium/java-client/pull/562)
-- **[REFACTOR]** Android. Simplified the activity starting by reducing the number of parameters through POJO clas. Old methods which start activities were marked `@Deprecated`. [#579](https://github.com/appium/java-client/pull/579) [#585](https://github.com/appium/java-client/pull/585)
-- **[BUG FIX]** Issue report:[#574](https://github.com/appium/java-client/issues/574). Fix:[#582](https://github.com/appium/java-client/pull/582)
-
-*5.0.0-BETA3*
-[BUG FIX]
-- **[BUG FIX]**:Issue report: [#567](https://github.com/appium/java-client/issues/567). Fix: [#568](https://github.com/appium/java-client/pull/568)
-
-*5.0.0-BETA2*
-- **[BUG FIX]**:Issue report: [#549](https://github.com/appium/java-client/issues/549). Fix: [#551](https://github.com/appium/java-client/pull/551)
-- New capabilities were added [#533](https://github.com/appium/java-client/pull/553):
- - `IOSMobileCapabilityType#USE_NEW_WDA`
- - `IOSMobileCapabilityType#WDA_LAUNCH_TIMEOUT`
- - `IOSMobileCapabilityType#WDA_CONNECTION_TIMEOUT`
-
-The capability `IOSMobileCapabilityType#REAL_DEVICE_LOGGER` was removed. [#533](https://github.com/appium/java-client/pull/553)
-
-- **[BUG FIX]/[ENHANCEMENT]**. Issue report: [#552](https://github.com/appium/java-client/issues/552). FIX [#556](https://github.com/appium/java-client/pull/556)
- - Additional methods were added to the `io.appium.java_client.HasSessionDetails`
- - `String getPlatformName()`
- - `String getAutomationName()`
- - `boolean isBrowser()`
- - `io.appium.java_client.HasSessionDetails` is used by the ` io.appium.java_client.internal.JsonToMobileElementConverter ` to define which instance of the `org.openqa.selenium.WebElement` subclass should be created.
-
-- **[ENHANCEMENT]**: The additional event firing feature. PR: [#559](https://github.com/appium/java-client/pull/559). The [WIKI chapter about the event firing](https://github.com/appium/java-client/blob/master/docs/The-event_firing.md) was updated.
-
-*5.0.0-BETA1*
-- **[MAJOR ENHANCEMENT]**: Migration to Java 8. Epic: [#399](https://github.com/appium/java-client/issues/399)
- - API with default implementation. PR [#470](https://github.com/appium/java-client/pull/470)
- - Tools that provide _Page Object_ engines were redesigned. The migration to [repeatable annotations](http://docs.oracle.com/javase/tutorial/java/annotations/repeating.html). Details you can read there: [#497](https://github.com/appium/java-client/pull/497). [Documentation was synced as well](https://github.com/appium/java-client/blob/master/docs/Page-objects.md#also-it-is-possible-to-define-chained-or-any-possible-locators).
- - The new functional interface `io.appium.java_client.functions.AppiumFunctio`n was designed. It extends `java.util.function.Function` and `com.google.common.base.Function`. It was designed in order to provide compatibility with the `org.openqa.selenium.support.ui.Wait` [#543](https://github.com/appium/java-client/pull/543)
- - The new functional interface `io.appium.java_client.functions.ExpectedCondition` was designed. It extends `io.appium.java_client.functions.AppiumFunction` and ```org.openqa.selenium.support.ui.ExpectedCondition```. [#543](https://github.com/appium/java-client/pull/543)
- - The new functional interface `io.appium.java_client.functions.ActionSupplier` was designed. It extends ```java.util.function.Supplier```. [#543](https://github.com/appium/java-client/pull/543)
-
-- **[MAJOR ENHANCEMENT]**: Migration from Maven to Gradle. Feature request is [#214](https://github.com/appium/java-client/issues/214). Fixes: [#442](https://github.com/appium/java-client/pull/442), [#465](https://github.com/appium/java-client/pull/465).
-
-- **[MAJOR ENHANCEMENT]** **[MAJOR REFACTORING]**. Non-abstract **AppiumDriver**:
- - Now the `io.appium.java_client.AppiumDriver` can use an instance of any `io.appium.java_client.MobileBy` subclass for the searching. It should work as expected when current session supports the given selector. It will throw `org.openqa.selenium.WebDriverException` otherwise. [#462](https://github.com/appium/java-client/pull/462)
- - The new interface `io.appium.java_client.FindsByFluentSelector` was added. [#462](https://github.com/appium/java-client/pull/462)
- - API was redesigned:
-
- these interfaces were marked deprecated and they are going to be removed [#513](https://github.com/appium/java-client/pull/513)[#514](https://github.com/appium/java-client/pull/514):
- - `io.appium.java_client.DeviceActionShortcuts`
- - `io.appium.java_client.android.AndroidDeviceActionShortcuts`
- - `io.appium.java_client.ios.IOSDeviceActionShortcuts`
-
- instead following inerfaces were designed:
- - `io.appium.java_client.HasDeviceTime`
- - `io.appium.java_client.HidesKeyboard`
- - `io.appium.java_client.HidesKeyboardWithKeyName`
- - `io.appium.java_client.PressesKeyCode`
- - `io.appium.java_client.ios.ShakesDevice`
- - `io.appium.java_client.HasSessionDetails`
- _That was done because Windows automation tools have some features that were considered as Android-specific and iOS-specific._
-
- The list of classes and methods which were marked _deprecated_ and they are going to be removed
- - `AppiumDriver#swipe(int, int, int, int, int)`
- - `AppiumDriver#pinch(WebElement)`
- - `AppiumDriver#pinch(int, int)`
- - `AppiumDriver#zoom(WebElement)`
- - `AppiumDriver#zoom(int, int)`
- - `AppiumDriver#tap(int, WebElement, int)`
- - `AppiumDriver#tap(int, int, int, int)`
- - `AppiumDriver#swipe(int, int, int, int, int)`
- - `MobileElement#swipe(SwipeElementDirection, int)`
- - `MobileElement#swipe(SwipeElementDirection, int, int, int)`
- - `MobileElement#zoom()`
- - `MobileElement#pinch()`
- - `MobileElement#tap(int, int)`
- - `io.appium.java_client.SwipeElementDirection` and `io.appium.java_client.TouchebleElement` also were marked deprecated.
-
- redesign of `TouchAction` and `MultiTouchAction`
- - constructors were redesigned. There is no strict binding of `AppiumDriver` and `TouchAction` /`MultiTouchAction`. They can consume any instance of a class that implements `PerformsTouchActions`.
- - `io.appium.java_client.ios.IOSTouchAction` was added. It extends `io.appium.java_client.TouchAction`.
- - the new interface `io.appium.java_client.PerformsActions` was added. It unifies `TouchAction` and `MultiTouchAction` now. [#543](https://github.com/appium/java-client/pull/543)
-
- `JsonToMobileElementConverter` re-design [#532](https://github.com/appium/java-client/pull/532):
- - unused `MobileElementToJsonConverter` was removed
- - `JsonToMobileElementConverter` is not rhe abstract class now. It generates instances of MobileElement subclasses according to current session parameters
- - `JsonToAndroidElementConverter` is deprecated now
- - `JsonToIOSElementConverter` is depreacated now
- - `JsonToYouiEngineElementConverter` is deprecated now.
- - constructors of 'AppiumDriver' were re-designed.
- - constructors of 'AndroidDriver' were re-designed.
- - constructors of 'IOSDriver' were re-designed.
-
-- **[MAJOR ENHANCEMENT]** Windows automation. Epic [#471](https://github.com/appium/java-client/issues/471)
- - The new interface `io.appium.java_client.FindsByWindowsAutomation` was added. [#462](https://github.com/appium/java-client/pull/462). With [@jonstoneman](https://github.com/jonstoneman) 's authorship.
- - The new selector strategy `io.appium.java_client.MobileBy.ByWindowsAutomation` was added. [#462](https://github.com/appium/java-client/pull/462). With [@jonstoneman](https://github.com/jonstoneman) 's authorship.
- - `io.appium.java_client.windows.WindowsDriver` was designed. [#538](https://github.com/appium/java-client/pull/538)
- - `io.appium.java_client.windows.WindowsElement` was designed. [#538](https://github.com/appium/java-client/pull/538)
- - `io.appium.java_client.windows.WindowsKeyCode ` was added. [#538](https://github.com/appium/java-client/pull/538)
- - Page object tools were updated [#538](https://github.com/appium/java-client/pull/538)
- - the `io.appium.java_client.pagefactory.WindowsFindBy` annotation was added.
- - `io.appium.java_client.pagefactory.AppiumFieldDecorator` and supporting tools were actualized.
-
-- **[MAJOR ENHANCEMENT]** iOS XCUIT mode automation:
- - `io.appium.java_client.remote.AutomationName#IOS_XCUI_TEST` was added
- - The new interface `io.appium.java_client.FindsByIosNSPredicate` was added. [#462](https://github.com/appium/java-client/pull/462). With [@rafael-chavez](https://github.com/rafael-chavez) 's authorship. It is implemented by `io.appium.java_client.ios.IOSDriver` and `io.appium.java_client.ios.IOSElement`.
- - The new selector strategy `io.appium.java_client.MobileBy.ByIosNsPredicate` was added. [#462](https://github.com/appium/java-client/pull/462). With [@rafael-chavez](https://github.com/rafael-chavez) 's authorship.
- - Page object tools were updated [#545](https://github.com/appium/java-client/pull/545), [#546](https://github.com/appium/java-client/pull/546)
- - the `io.appium.java_client.pagefactory.iOSXCUITFindBy` annotation was added.
- - `io.appium.java_client.pagefactory.AppiumFieldDecorator` and supporting tools were actualized.
-
-- [ENHANCEMENT] Added the ability to set UiAutomator Congfigurator values. [#410](https://github.com/appium/java-client/pull/410).
-[#477](https://github.com/appium/java-client/pull/477).
-- [ENHANCEMENT]. Additional methods which perform device rotation were implemented. [#489](https://github.com/appium/java-client/pull/489). [#439](https://github.com/appium/java-client/pull/439). But it works for iOS in XCUIT mode and for Android in UIAutomator2 mode only. The feature request: [#7131](https://github.com/appium/appium/issues/7131)
-- [ENHANCEMENT]. TouchID Implementation (iOS Sim Only). Details: [#509](https://github.com/appium/java-client/pull/509)
-- [ENHANCEMENT]. The ability to use port, ip and log file as server arguments was provided. Feature request: [#521](https://github.com/appium/java-client/issues/521). Fixes: [#522](https://github.com/appium/java-client/issues/522), [#524](https://github.com/appium/java-client/issues/524).
-- [ENHANCEMENT]. The new interface ```io.appium.java_client.android.HasDeviceDetails``` was added. It is implemented by ```io.appium.java_client.android.AndroidDriver``` by default. [#518](https://github.com/appium/java-client/pull/518)
-- [ENHANCEMENT]. New touch actions were added. ```io.appium.java_client.ios.IOSTouchAction#doubleTap(WebElement, int, int)``` and ```io.appium.java_client.ios.IOSTouchAction#doubleTap(WebElement)```. [#523](https://github.com/appium/java-client/pull/523), [#444](https://github.com/appium/java-client/pull/444)
-- [ENHANCEMENT]. All constructors declared by `io.appium.java_client.AppiumDriver` are public now.
-- [BUG FIX]: There was the issue when "@WithTimeout" was changing general timeout of the waiting for elements. Bug report: [#467](https://github.com/appium/java-client/issues/467). Fixes: [#468](https://github.com/appium/java-client/issues/468), [#469](https://github.com/appium/java-client/issues/469), [#480](https://github.com/appium/java-client/issues/480). Read: [supported-settings](https://github.com/appium/appium/blob/master/docs/en/advanced-concepts/settings.md#supported-settings)
-- Added the server flag `io.appium.java_client.service.local.flags.AndroidServerFlag#REBOOT`. [#476](https://github.com/appium/java-client/pull/476)
-- Added `io.appium.java_client.remote.AndroidMobileCapabilityType.APP_WAIT_DURATION ` capability. [#461](https://github.com/appium/java-client/pull/461)
-- the new automation type `io.appium.java_client.remote.MobilePlatform#ANDROID_UIAUTOMATOR2` was add.
-- the new automation type `io.appium.java_client.remote.MobilePlatform#YOUI_ENGINE` was add.
-- Additional capabilities were addede:
- - `IOSMobileCapabilityType#CUSTOM_SSL_CERT`
- - `IOSMobileCapabilityType#TAP_WITH_SHORT_PRESS_DURATION`
- - `IOSMobileCapabilityType#SCALE_FACTOR`
- - `IOSMobileCapabilityType#WDA_LOCAL_PORT`
- - `IOSMobileCapabilityType#SHOW_XCODE_LOG`
- - `IOSMobileCapabilityType#REAL_DEVICE_LOGGER`
- - `IOSMobileCapabilityType#IOS_INSTALL_PAUSE`
- - `IOSMobileCapabilityType#XCODE_CONFIG_FILE`
- - `IOSMobileCapabilityType#KEYCHAIN_PASSWORD`
- - `IOSMobileCapabilityType#USE_PREBUILT_WDA`
- - `IOSMobileCapabilityType#PREVENT_WDAATTACHMENTS`
- - `IOSMobileCapabilityType#WEB_DRIVER_AGENT_URL`
- - `IOSMobileCapabilityType#KEYCHAIN_PATH`
- - `MobileCapabilityType#CLEAR_SYSTEM_FILES`
-- **[UPDATE]** to Selenium 3.0.1.
-- **[UPDATE]** to Spring Framework 4.3.5.RELEASE.
-- **[UPDATE]** to AspectJ weaver 1.8.10.
-
-
-
-*4.1.2*
-
-- Following capabilities were added:
- - `io.appium.java_client.remote.AndroidMobileCapabilityType.ANDROID_INSTALL_TIMEOUT`
- - `io.appium.java_client.remote.AndroidMobileCapabilityType.NATIVE_WEB_SCREENSHOT`
- - `io.appium.java_client.remote.AndroidMobileCapabilityType.ANDROID_SCREENSHOT_PATH`. The pull request: [#452](https://github.com/appium/java-client/pull/452)
-- `org.openqa.selenium.Alert` was reimplemented for iOS. Details: [#459](https://github.com/appium/java-client/pull/459)
-- The deprecated `io.appium.java_client.generic.searchcontext` was removed.
-- The dependency on `com.google.code.gson` was updated to 2.7. Also it was adde to exclusions
-for `org.seleniumhq.selenium` `selenium-java`.
-- The new AutomationName was added. IOS_XCUI_TEST. It is needed for the further development.
-- The new MobilePlatform was added. WINDOWS. It is needed for the further development.
-
-*4.1.1*
-
-BUG FIX: Issue [#450](https://github.com/appium/java-client/issues/450). Fix: [#451](https://github.com/appium/java-client/issues/451). Thanks to [@tutunang](https://github.com/appium/java-client/pull/451) for the report.
-
-*4.1.0*
-- all code marked `@Deprecated` was removed.
-- `getSessionDetails()` was added. Thanks to [@saikrishna321](https://github.com/saikrishna321) for the contribution.
-- FIX [#362](https://github.com/appium/java-client/issues/362), [#220](https://github.com/appium/java-client/issues/220), [#323](https://github.com/appium/java-client/issues/323). Details read there: [#413](https://github.com/appium/java-client/pull/413)
-- FIX [#392](https://github.com/appium/java-client/issues/392). Thanks to [@truebit](https://github.com/truebit) for the bug report.
-- The dependency on `cglib` was replaced by the dependency on `cglib-nodep`. FIX [#418](https://github.com/appium/java-client/issues/418)
-- The casting to the weaker interface `HasIdentity` instead of class `RemoteWebElement` was added. It is the internal refactoring of the `TouchAction`. [#432](https://github.com/appium/java-client/pull/432). Thanks to [@asolntsev](https://github.com/asolntsev) for the contribution.
-- The `setValue` method was moved to `MobileElement`. It works against text input elements on Android.
-- The dependency on `org.springframework` `spring-context` v`4.3.2.RELEASE` was added
-- The dependency on `org.aspectj` `aspectjweaver` v`1.8.9` was added
-- ENHANCEMENT: The alternative event firing engine. The feature request: [#242](https://github.com/appium/java-client/issues/242).
-Implementation: [#437](https://github.com/appium/java-client/pull/437). Also [new WIKI chapter](https://github.com/appium/java-client/blob/master/docs/The-event_firing.md) was added.
-- ENHANCEMENT: Convenient access to specific commands for each supported mobile OS. Details: [#445](https://github.com/appium/java-client/pull/445)
-- dependencies and plugins were updated
-- ENHANCEMENT: `YouiEngineDriver` was added. Details: [appium server #6215](https://github.com/appium/appium/pull/6215), [#429](https://github.com/appium/java-client/pull/429), [#448](https://github.com/appium/java-client/pull/448). It is just the draft of the new solution that is going to be extended further. Please stay tuned. There are many interesting things are coming up. Thanks to `You I Engine` team for the contribution.
-
-*4.0.0*
-- all code marked `@Deprecated` was removed. Java client won't support old servers (v<1.5.0)
-anymore.
-- the ability to start an activity using Android intent actions, intent categories, flags and arguments
-was added to `AndroidDriver`. Thanks to [@saikrishna321](https://github.com/saikrishna321) for the contribution.
-- `scrollTo()` and `scrollToExact()` became deprecated. They are going to be removed in the next release.
-- The interface `io.appium.java_client.ios.GetsNamedTextField` and the declared method `T getNamedTextField(String name)` are
-deprecated as well. They are going to be removed in the next release.
-- Methods `findElements(String by, String using)` and `findElement(String by, String using)` of `org.openga.selenium.remote.RemoteWebdriver` are public now. Thanks to [@SrinivasanTarget](https://github.com/SrinivasanTarget).
-- the `io.appium.java_client.NetworkConnectionSetting` class was marked deprecated
-- the enum `io.appium.java_client.android.Connection` was added. All supported network bitmasks are defined there.
-- Android. Old methods which get/set connection were marked `@Deprecated`
-- Android. New methods which consume/return `io.appium.java_client.android.Connection` were added.
-- the `commandRepository` field is public now. The modification of the `MobileCommand`
-- Constructors like `AppiumDriver(HttpCommandExecutor executor, Capabilities capabilities)` were added to
-`io.appium.java_client.android.AndroidDriver` and `io.appium.java_client.ios.IOSDriver`
-- The refactoring of `io.appium.java_client.internal.JsonToMobileElementConverter`. Now it accepts
-`org.openqa.selenium.remote.RemoteWebDriver` as the constructor parameter. It is possible to re-use
-`io.appium.java_client.android.internal.JsonToAndroidElementConverter` or
-`io.appium.java_client.ios.internal.JsonToIOSElementConverter` by RemoteWebDriver when it is needed.
-- Constructors of the abstract `io.appium.java_client.AppiumDriver` were redesigned. Now they require
-a subclass of `io.appium.java_client.internal.JsonToMobileElementConverter`. Constructors of
-`io.appium.java_client.android.AndroidDriver` and `io.appium.java_client.ios.IOSDriver` are same still.
-- The `pushFile(String remotePath, File file)` was added to AndroidDriver
-- FIX of TouchAction. Instances of the TouchAction class are reusable now
-- FIX of the swiping issue (iOS, server version >= 1.5.0). Now the swiping is implemented differently by
-AndroidDriver and IOSDriver. Thanks to [@truebit](https://github.com/truebit) and [@nuggit32](https://github.com/nuggit32) for the catching.
-- the project was integrated with [maven-checkstyle-plugin](https://maven.apache.org/plugins/maven-checkstyle-plugin/). Thanks to [@SrinivasanTarget](https://github.com/SrinivasanTarget) for the work
-- source code was improved according to code style checking rules.
-- the integration with `org.owasp dependency-check-maven` was added. Thanks to [@saikrishna321](https://github.com/saikrishna321)
-for the work.
-- the integration with `org.jacoco jacoco-maven-plugin` was added. Thanks to [@SrinivasanTarget](https://github.com/SrinivasanTarget) for the contribution.
-
-*3.4.1*
-- Update to Selenium v2.53.0
-- all dependencies were updated to latest versions
-- the dependency on org.apache.commons commons-lang3 v3.4 was added
-- the fix of Widget method invocation.[#340](https://github.com/appium/java-client/issues/340). A class visibility was taken into account. Thanks to [aznime](https://github.com/aznime) for the catching.
-Server flags were added:
- - GeneralServerFlag.ASYNC_TRACE
- - IOSServerFlag.WEBKIT_DEBUG_PROXY_PORT
-- Source code was formatted using [eclipse-java-google-style.xml](https://google-styleguide.googlecode.com/svn/trunk/eclipse-java-google-style.xml). This is not the complete solution. The code style checking is going to be added further. Thanks to [SrinivasanTarget](https://github.com/SrinivasanTarget) for the work!
-
-*3.4.0*
-- Update to Selenium v2.52.0
-- `getAppStrings()` methods are deprecated now. They are going to be removed. `getAppStringMap()` methods were added and now return a map with app strings (keys and values)
-instead of a string. Thanks to [@rgonalo](https://github.com/rgonalo) for the contribution.
-- Add `getAppStringMap(String language, String stringFile)` method to allow searching app strings in the specified file
-- FIXED of the bug which causes deadlocks of AppiumDriver LocalService in multithreading. Thanks to [saikrishna321](https://github.com/saikrishna321) for the [bug report](https://github.com/appium/java-client/issues/283).
-- FIXED Zoom methods, thanks to [@kkhaidukov](https://github.com/kkhaidukov)
-- FIXED The issue of compatibility of AppiumServiceBuilder with Appium node server v >= 1.5.x. Take a look at [#305](https://github.com/appium/java-client/issues/305)
-- `getDeviceTime()` was added. Thanks to [@SrinivasanTarget](https://github.com/SrinivasanTarget) for the contribution.
-- FIXED `longPressKeyCode()` methods. Now they use the convenient JSONWP command.Thanks to [@kirillbilchenko](https://github.com/kirillbilchenko) for the proposed fix.
-- FIXED javadoc.
-- Page object tools were updated. Details read here: [#311](https://github.com/appium/java-client/issues/311), [#313](https://github.com/appium/java-client/pull/313), [#317](https://github.com/appium/java-client/pull/317). By.name locator strategy is deprecated for Android and iOS. It is still valid for the Selendroid mode. Thanks to [@SrinivasanTarget](https://github.com/SrinivasanTarget) for the helping.
-- The method `lockScreen(seconds)` is deprecated and it is going to be removed in the next release. Since Appium node server v1.5.x it is recommended to use
-`AndroidDriver.lockDevice()...AndroidDriver.unlockDevice()` or `IOSDriver.lockDevice(int seconds)` instead. Thanks to [@namannigam](https://github.com/namannigam) for
-the catching. Read [#315](https://github.com/appium/java-client/issues/315)
-- `maven-release-plugin` was added to POM.XML configuration
-- [#320](https://github.com/appium/java-client/issues/320) fix. The `Widget.getSelfReference()` was added. This method allows to extract a real widget-object from inside a proxy at some extraordinary situations. Read: [PR](https://github.com/appium/java-client/pull/327). Thanks to [SergeyErmakovMercDev](https://github.com/SergeyErmakovMercDev) for the reporting.
-- all capabilities were added according to [this description](https://github.com/appium/appium/blob/1.5/docs/en/writing-running-appium/caps.md). There are three classes: `io.appium.java_client.remote.MobileCapabilityType` (just modified), `io.appium.java_client.remote.AndroidMobileCapabilityType` (android-specific capabilities), `io.appium.java_client.remote.IOSMobileCapabilityType` (iOS-specific capabilities). Details are here: [#326](https://github.com/appium/java-client/pull/326)
-- some server flags were marked `deprecated` because they are deprecated since server node v1.5.x. These flags are going to be removed at the java client release. Details are here: [#326](https://github.com/appium/java-client/pull/326)
-- The ability to start Appium node programmatically using desired capabilities. This feature is compatible with Appium node server v >= 1.5.x. Details are here: [#326](https://github.com/appium/java-client/pull/326)
-
-*3.3.0*
-- updated the dependency on Selenium to version 2.48.2
-- bug fix and enhancements of io.appium.java_client.service.local.AppiumDriverLocalService
- - FIXED bug which was found and reproduced with Eclipse for Mac OS X. Please read about details here: [#252](https://github.com/appium/java-client/issues/252)
- Thanks to [saikrishna321](https://github.com/saikrishna321) for the bug report
- - FIXED bug which was found out by [Jonahss](https://github.com/Jonahss). Thanks for the reporting. Details: [#272](https://github.com/appium/java-client/issues/272)
- and [#273](https://github.com/appium/java-client/issues/273)
- - For starting an appium server using localService, added additional environment variable to specify the location of Node.js binary: NODE_BINARY_PATH
- - The ability to set additional output streams was provided
-- The additional __startActivity()__ method was added to AndroidDriver. It allows to start activities without the stopping of a target app
-Thanks to [deadmoto](https://github.com/deadmoto) for the contribution
-- The additional extension of the Page Object design pattern was designed. Please read about details here: [#267](https://github.com/appium/java-client/pull/267)
-- New public constructors to AndroidDriver/IOSDriver that allow passing a custom HttpClient.Factory Details: [#276](https://github.com/appium/java-client/pull/278) thanks to [baechul](https://github.com/baechul)
-
-*3.2.0*
-- updated the dependency on Selenium to version 2.47.1
-- the new dependency on commons-validator v1.4.1
-- the ability to start programmatically/silently an Appium node server is provided now. Details please read at [#240](https://github.com/appium/java-client/pull/240).
-Historical reference: [The similar solution](https://github.com/Genium-Framework/Appium-Support) has been designed by [@Hassan-Radi](https://github.com/Hassan-Radi).
-The mentioned framework and the current solution use different approaches.
-- Throwing declarations were added to some searching methods. The __"getMouse"__ method of RemoteWebDriver was marked __Deprecated__
-- Add `replaceValue` method for elements.
-- Replace `sendKeyEvent()` method in android with pressKeyCode(int key) and added: pressKeyCode(int key, Integer metastate), longPressKeyCode(int key), longPressKeyCode(int key, Integer metastate)
-
-*3.1.1*
-- Page-object findBy strategies are now aware of which driver (iOS or Android) you are using. For more details see the Pull Request: https://github.com/appium/java-client/pull/213
-- If somebody desires to use their own Webdriver implementation then it has to implement HasCapabilities.
-- Added a new annotation: `WithTimeout`. This annotation allows one to specify a specific timeout for finding an element which overrides the drivers default timeout. For more info see: https://github.com/appium/java-client/pull/210
-- Corrected an uninformative Exception message.
-
-*3.0.0*
-- AppiumDriver class is now a Generic. This allows us to return elements of class MobileElement (and its subclasses) instead of always returning WebElements and requiring users to cast to MobileElement. See https://github.com/appium/java-client/pull/182
-- Full set of Android KeyEvents added.
-- Selenium client version updated to 2.46
-- PageObject enhancements
-- Junit dependency removed
-
-*2.2.0*
-- Added new TouchAction methods for LongPress, on an element, at x,y coordinates, or at an offset from within an element
-- SwipeElementDirection changed. Read the documentation, it's now smarter about how/where to swipe
-- Added APPIUM_VERSION MobileCapabilityType
-- `sendKeyEvent()` moved from AppiumDriver to AndroidDriver
-- `linkText` and `partialLinkText` locators added
-- setValue() moved from MobileElement to iOSElement
-- Fixed Selendroid PageAnnotations
-
-*2.1.0*
-- Moved hasAppString() from AndroidDriver to AppiumDriver
-- Fixes to PageFactory
-- Added @AndroidFindAll and @iOSFindAll
-- Added toggleLocationServices() to AndroidDriver
-- Added touchAction methods to MobileElement, so now you can do `element.pinch()`, `element.zoom()`, etc.
-- Added the ability to choose a direction to swipe over an element. Use the `SwipeElementDirection` enums: `UP, DOWN, LEFT, RIGHT`
-
-*2.0.0*
-- AppiumDriver is now an abstract class, use IOSDriver and AndroidDriver which both extend it. You no longer need to include the `PLATFORM_NAME` desired capability since it's automatic for each class. Thanks to @TikhomirovSergey for all their work
-- ScrollTo() and ScrollToExact() methods reimplemented
-- Zoom() and Pinch() are now a little smarter and less likely to fail if you element is near the edge of the screen. Congratulate @BJap on their first PR!
-
-*1.7.0*
-- Removed `scrollTo()` and `scrollToExact()` methods because they relied on `complexFind()`. They will be added back in the next version!
-- Removed `complexFind()`
-- Added `startActivity()` method
-- Added `isLocked()` method
-- Added `getSettings()` and `ignoreUnimportantViews()` methods
-
-*1.6.2*
-- Added MobilePlatform interface (Android, IOS, FirefoxOS)
-- Added MobileBrowserType interface (Safari, Browser, Chromium, Chrome)
-- Added MobileCapabilityType.APP_WAIT_ACTIVITY
-- Fixed small Integer cast issue (in Eclipse it won't compile)
-- Set -source and -target of the Java Compiler to 1.7 (for maven compiler plugin)
-- Fixed bug in Page Factory
-
-*1.6.1*
-- Fixed the logic for checking connection status on NetworkConnectionSetting objects
-
-*1.6.0*
-- Added @findBy annotations. Explanation here: https://github.com/appium/java-client/pull/68 Thanks to TikhomirovSergey
-- Appium Driver now implements LocationContext interface, so setLocation() works for setting GPS coordinates
-
-*1.5.0*
-- Added MobileCapabilityType enums for desired capabilities
-- `findElement` and `findElements` return MobileElement objects (still need to be casted, but no longer instantiated)
-- new appium v1.2 `hideKeyboard()` strategies added
-- `getNetworkConnection()` and `setNetworkConnection()` commands added
-
-*1.4.0*
-- Added openNotifications() method, to open the notifications shade on Android
-- Added pullFolder() method, to pull an entire folder as a zip archive from a device/simulator
-- Upgraded Selenium dependency to 2.42.2
-
-*1.3.0*
-- MultiGesture with a single TouchAction fixed for Android
-- Now depends upon Selenium java client 2.42.1
-- Cleanup of Errorcode handling, due to merging a change into Selenium
-
-*1.2.1*
-- fix dependency issue
-
-*1.2.0*
-- complexFind() now returns MobileElement objects
-- added scrollTo() and scrollToExact() methods for use with complexFind()
-
-*1.1.0*
-- AppiumDriver now implements Rotatable. rotate() and getOrientation() methods added
-- when no appium server is running, the proper error is thrown, instead of a NullPointerException
-
-*1.0.2*
-- recompiled to include some missing methods such as shake() and complexFind()
+Visit [CHANGELOG.md](CHANGELOG.md) to see the full list of changes between versions.
## Running tests
diff --git a/archive/docs/How-to-propose-a-PR.md b/archive/docs/How-to-propose-a-PR.md
deleted file mode 100644
index 22a1a6995..000000000
--- a/archive/docs/How-to-propose-a-PR.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# A good pull-request should contain
-
-### Change list
-
-There should be provided briefly described change list which are you going to propose.
-
-### Types of changes
-
-What types of changes are proposed/introduced to Java client?
-_Put an `x` in the boxes that apply_
-
-- [ ] Bugfix (non-breaking change which fixes an issue)
-- [ ] New feature (non-breaking change which adds functionality)
-- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
-
-### Details
-
-There should be provided more details about changes if it is necessary. If there are new features you
-can provide code samples which show the way they work and possible use cases. Also you can create [gists](https://gist.github.com)
-with pasted java code samples or put them at a PR description using markdown. About markdown please read [Mastering markdown](https://guides.github.com/features/mastering-markdown/) and [Writing on GitHub](https://help.github.com/categories/writing-on-github/)
-
-# Pull-request template
-
-There is [PULL_REQUEST_TEMPLATE.md)](https://github.com/appium/java-client/blob/master/PULL_REQUEST_TEMPLATE.md) which should help you to make a good pull request.
diff --git a/archive/docs/How-to-report-an-issue.md b/archive/docs/How-to-report-an-issue.md
deleted file mode 100644
index 0adf13fbf..000000000
--- a/archive/docs/How-to-report-an-issue.md
+++ /dev/null
@@ -1,50 +0,0 @@
-# Be sure that it is not a server-side problem if you are facing something that looks like a bug
-
-The Appium Java client is the thin client which just sends requests and receives responces generally.
-Be sure that this bug is not reported [here](https://github.com/appium/appium/issues) and/or there is
-no progress on this issue.
-
-# The good issue report should contain
-
-### Description
-
-The bug report should contain a brief description of a bug.
-If it is the feature request then there should be the description of this feature and the way that it should work.
-
-### Environment (bug report)
-
-* java client build version or git revision if you use some shapshot:
-* Appium server version or git revision if you use some shapshot:
-* Desktop OS/version used to run Appium if necessary:
-* Node.js version (unless using Appium.app|exe) or Appium CLI or Appium.app|exe:
-* Mobile platform/version under test:
-* Real device or emulator/simulator:
-
-### Details
-
-If it is necessary there should provided more details
-
-
-### Code To Reproduce Issue (good to Have if you report a bug)
-
-It's easier to reproduce bug and much faster to fix it.
-You can git clone https://github.com/appium/sample-code or https://github.com/appium/sample-code/tree/master/sample-code/apps and reproduce an issue using Java and sample apps.
-Also you can create a [gist](https://gist.github.com) with pasted java code sample or paste it at ussue description using markdown. About markdown please read [Mastering markdown](https://guides.github.com/features/mastering-markdown/) and
-[Writing on GitHub](https://help.github.com/categories/writing-on-github/)
-
-### Ecxeption stacktraces (bug report)
-
-There should be created a [gist](https://gist.github.com) with pasted stacktrace of exception thrown by java.
-
-### Link to Appium logs
-
-There should be created a [gist](https://gist.github.com) which is a paste of your _full_ Appium logs, and link them to a new issue. Do _not_ paste your full Appium logs at the issue description, as it will make this issue very long and hard to read!
-If you are reporting a bug, _always_ include Appium logs as linked gists! It helps to define the problem correctly and clearly.
-
-
-# Issue template
-There is [ISSUE_TEMPLATE.md](https://github.com/appium/java-client/blob/master/ISSUE_TEMPLATE.md) which should help you to make a good issue report.
-
-# ... And don't say that you weren't warned.
-
-If a report is not readable and/or there is no response from a reporter and some important details are needed then the issue will be closed after some time.
diff --git a/archive/docs/Installing-the-project.md b/archive/docs/Installing-the-project.md
deleted file mode 100644
index a11590564..000000000
--- a/archive/docs/Installing-the-project.md
+++ /dev/null
@@ -1,31 +0,0 @@
-[Download the jar from Maven](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22io.appium%22%20AND%20a%3A%22java-client%22) or add the following to pom.xml:
-
-```
-
- io.appium
- java-client
- 4.1.2
-
-```
-
-It currently depends on selenium-java 2.53.1. If it is necessary to use another version of Selenium then you can configure pom.xml as follows:
-
-```
-
- io.appium
- java-client
- 4.1.1
-
-
- org.seleniumhq.selenium
- selenium-java
-
-
-
-
-
- org.seleniumhq.selenium
- selenium-java
- ${selenium.version.you.require}
-
-```
diff --git a/archive/docs/Note-for-developers.md b/archive/docs/Note-for-developers.md
deleted file mode 100644
index 97f9dbe2f..000000000
--- a/archive/docs/Note-for-developers.md
+++ /dev/null
@@ -1,63 +0,0 @@
-# IDE
-
-The **Intellij Idea** is recommended.
-
-# Settings
-
-## Importing the project
-
-This is the Gradle project.
-
-
-
-Be sure that:
-
-- The `JAVA_HOME` environmental contains a path to JDK > 7
-
-- If non built-in gradle distribution is used then its version should be > 2.1
-
-## Compiler
-
-This project is compiled in some not common way. We use `ecj` Eclipse Java Compiler. Below is the sample how to define this compiler by IDE.
-
-
-## JDK
-
-Please check following settings:
-
-
-
-
-
-
-
-
-
-
-
-## Coding Standards
-
-Appium java-client strictly follows [Google Java Style](http://google-styleguide.googlecode.com/svn/trunk/javaguide.html) as a coding standards. Contributors are requested to follow this by configuring in their IDE's Editor Code style,
-
-* Clone [Google Style Guide](https://github.com/google/styleguide.git) from git
-
-**Intellij IDEA** users can configure this way,
-`Files -> Other Settings -> Default Settings ->Editor -> Code Style -> Manage -> Manage -> Import -> eclipse-java-google-style.xml (Downloaded from Google Style Guide)-> Apply`
-
-Reformat your code before raising a Pull Request.
-
-
-## Code Coverage
-
-`jacoco-maven-plugin` generates the coverage reports, once integration tests are successfully run by `maven-surefire-plugin`
-
-**Intellij IDEA** user's can configure and view this way,
-`Analyse -> show coverage Data -> Add -> Select ${basedir}/target/coverage-reports/jacoco-unit.exec (jacoco-unit.exec generated after integration test run) -> Click Show Selected -> Coverage Results displayed in IDE`
-
-# Please do not forget to check the code before the pull-request proposal.
-
-It is needed to go to the directory where `java_client` is located. You can do it via command line. And then run the following command
-
-`gradle check`. If everything is ok then all checks should be passed. Otherwise you can open reports at `JAVA_CLIENT_DIRECTORY/build/reports`
-
-**The adding of new tests is required when new feature is added or some bug is fixed.**
\ No newline at end of file
diff --git a/archive/docs/Page-objects.md b/archive/docs/Page-objects.md
deleted file mode 100644
index 9b8ae8aba..000000000
--- a/archive/docs/Page-objects.md
+++ /dev/null
@@ -1,586 +0,0 @@
-Appium Java client has facilities which components to [Page Object](https://github.com/SeleniumHQ/selenium/wiki/PageObjects) design pattern and [Selenium PageFactory](https://github.com/SeleniumHQ/selenium/wiki/PageFactory).
-
-
-# WebElement/list of WebElement field can be populated by default:
-```java
-import org.openqa.selenium.WebElement;
-import org.openqa.selenium.support.FindBy;
-...
-
-@FindBy(someStrategy) //for browser or web view html UI
-//also for mobile native applications when other locator strategies are not defined
-WebElement someElement;
-
-@FindBy(someStrategy) //for browser or web view html UI
-//also for mobile native applications when other locator strategies are not defined
-List someElements;
-```
-
-# If there is need to use convinient locators for mobile native applications then the following is available:
-
-```java
-import io.appium.java_client.android.AndroidElement;
-import org.openqa.selenium.remote.RemoteWebElement;
-import io.appium.java_client.pagefactory.*;
-import io.appium.java_client.ios.IOSElement;
-
-@AndroidFindBy(someStrategy) //for Android UI when Android UI automator is used
-AndroidElement someElement;
-
-@AndroidFindBy(someStrategy) //for Android UI when Android UI automator is used
-List someElements;
-
-@SelendroidFindBy(someStrategy) //for Android UI when Selendroid automation is used
-RemoteWebElement someElement;
-
-@SelendroidFindBy(someStrategy) //for Android UI when Selendroid automation is used
-List someElements;
-
-@iOSFindBy(someStrategy) //for iOS native UI
-IOSElement someElement;
-
-@iOSFindBy(someStrategy) //for iOS native UI
-List someElements;
-```
-
-# The example for the crossplatform mobile native testing
-
-```java
-import io.appium.java_client.MobileElement;
-import io.appium.java_client.pagefactory.*;
-
-@AndroidFindBy(someStrategy)
-@iOSFindBy(someStrategy)
-MobileElement someElement;
-
-@AndroidFindBy(someStrategy) //for the crossplatform mobile native
-@iOSFindBy(someStrategy) //testing
-List someElements;
-```
-
-# The fully cross platform examle
-
-```java
-import org.openqa.selenium.remote.RemoteWebElement;
-import io.appium.java_client.pagefactory.*;
-import org.openqa.selenium.support.FindBy;
-
-//the fully cross platform examle
-@FindBy(someStrategy) //for browser or web view html UI
-@AndroidFindBy(someStrategy) //for Android native UI
-@iOSFindBy(someStrategy) //for iOS native UI
-RemoteWebElement someElement;
-
-//the fully cross platform examle
-@FindBy(someStrategy)
-@AndroidFindBy(someStrategy) //for Android native UI
-@iOSFindBy(someStrategy) //for iOS native UI
-List someElements;
-```
-
-# Also it is possible to define chained or any possible locators.
-
-## - Chained
-
-```java
-import org.openqa.selenium.remote.RemoteWebElement;
-import io.appium.java_client.pagefactory.*;
-import org.openqa.selenium.support.FindBys;
-import org.openqa.selenium.support.FindBy;
-
-@FindBys({@FindBy(someStrategy1), @FindBy(someStrategy2)})
-@AndroidFindBys({@AndroidFindBy(someStrategy1), @AndroidFindBy(someStrategy2)})
-@iOSFindBys({@iOSFindBy(someStrategy1), @iOSFindBy(someStrategy2)})
-RemoteWebElement someElement;
-
-@FindBys({@FindBy(someStrategy1), @FindBy(someStrategy2)})
-@AndroidFindBys({@AndroidFindBy(someStrategy1), @AndroidFindBy(someStrategy2)})
-@iOSFindBys({@iOSFindBy(someStrategy1), @iOSFindBy(someStrategy2)})
-List someElements;
-```
-
-## - Any possible
-
-```java
-import org.openqa.selenium.remote.RemoteWebElement;
-import io.appium.java_client.pagefactory.*;
-import org.openqa.selenium.support.FindBy;
-import org.openqa.selenium.support.FindByAll;
-
-@FindAll({@FindBy(someStrategy1), @FindBy(someStrategy2)})
-@AndroidFindAll({@AndroidFindBy(someStrategy1), @AndroidFindBy(someStrategy2)})
-@iOSFindAll({@iOSFindBy(someStrategy1), @iOSFindBy(someStrategy2)})
-RemoteWebElement someElement;
-
-@FindAll({@FindBy(someStrategy1), @FindBy(someStrategy2)})
-@AndroidFindAll({@AndroidFindBy(someStrategy1), @AndroidFindBy(someStrategy2)})
-@iOSFindAll({@iOSFindBy(someStrategy1), @iOSFindBy(someStrategy2)})
-List someElements;
-```
-
-# Appium Java client is integrated with Selenium PageFactory by AppiumFieldDecorator.
-
-Object fields are populated as below:
-
--
-```java
-import io.appium.java_client.pagefactory.*;
-import org.openqa.selenium.support.PageFactory;
-
-PageFactory.initElements(new AppiumFieldDecorator(searchContext
- /*searchContext is a WebDriver or WebElement
- instance */),
- pageObject //an instance of PageObject.class
-);
-```
-
--
-```java
-import io.appium.java_client.pagefactory.*;
-import org.openqa.selenium.support.PageFactory;
-import java.util.concurrent.TimeUnit;
-
-PageFactory.initElements(new AppiumFieldDecorator(searchContext,
- /*searchContext is a WebDriver or WebElement
- instance */
- 15, //default implicit waiting timeout for all strategies
- TimeUnit.SECONDS),
- pageObject //an instance of PageObject.class
-);
-```
-
--
-```java
-import io.appium.java_client.pagefactory.*;
-import org.openqa.selenium.support.PageFactory;
-import java.util.concurrent.TimeUnit;
-
-PageFactory.initElements(new AppiumFieldDecorator(searchContext,
- /*searchContext is a WebDriver or WebElement
- instance */
- new TimeOutDuration(15, //default implicit waiting timeout for all strategies
- TimeUnit.SECONDS)),
- pageObject //an instance of PageObject.class
-);
-```
-
-If time of the waiting for elements differs from usual (longer, or shorter when element is needed only for quick checkings/assertions) then
-
-```java
-import io.appium.java_client.pagefactory.*;
-
-@WithTimeout(timeOut = yourTime, timeUnit = yourTimeUnit)
-RemoteWebElement someElement;
-
-@WithTimeout(timeOut = yourTime, timeUnit = yourTimeUnit)
-List someElements;
-```
-
-# The additional feature.
-
-## The simple example
-Let's imagine that the task is to check an Android client of the [http://www.rottentomatoes.com](http://www.rottentomatoes.com/). Let it be like a picture below
-
- Lets imagine that it is only a part of the screen.
-
-A typical page object could look like:
-
-```java
-public class RottenTomatoesScreen {
- //convinient locator
- private List titles;
-
- //convinient locator
- private List scores;
-
- //convinient locator
- private List castings;
- //element declaration goes on
-
- public String getMovieCount(){
- //.......
- }
-
- public String getTitle(params){
- //.......
- }
-
- public String getScore(params){
- //.......
- }
-
- public String getCasting(params){
- //.......
- }
-
- public void openMovieInfo(params){
- //.......
- }
-
- //method declaration goes on
-}
-```
-
-The description above can be decomposed. Let's work it out!
-
-Firstly a Movie-widget could be described this way:
-
-```java
-import io.appium.java_client.pagefactory.Widget;
-import org.openqa.selenium.WebElement;
-
-public class Movie extends Widget{
- protected Movie(WebElement element) {
- super(element);
- }
-
- //convinient locator
- private AndroidElement title;
-
- //convinient locator
- private AndroidElement score;
-
- //convinient locator
- private AndroidElement casting;
-
- public String getTitle(params){
- //.......
- }
-
- public String getScore(params){
- //.......
- }
-
- public String getCasting(params){
- //.......
- }
-
- public void openMovieInfo(params){
- ((AndroidElement) getWrappedElement()).tap(1, 1500);
- }
-
-}
-```
-
-So, now page object looks
-
-```java
-public class RottenTomatoesScreen {
-
- @AndroidFindBy(a locator which convinient to find a single movie-root - element)
- private List movies;
-
- //element declaration goes on
-
- public String getMovieCount(){
- return movies.size();
- }
-
- public Movie getMovie(int index){
- //any interaction with sub-elements of a movie-element
- //will be performed outside of the page-object instance
- return movie.get(index);
- }
- //method declaration goes on
-}
-```
-
-### Ok. What if Movie-class is reused and a wrapped root element is usually found by the same locator?
-
-Then
-```java
-//the class is annotated !!!
-@AndroidFindBy(a locator which convinient to find a single movie-root - element)
-public class Movie extends Widget{
-...
-}
-
-```
-and
-
-```java
-public class RottenTomatoesScreen {
- //!!! locator is not necessary at this case
- private List movies;
-...
-}
-```
-
-### Ok. What if movie list is not a whole screen? E.g. we want to describe it as a widget with nested movies.
-
-Then:
-
-```java
-//with the usual locator or without it
-public class Movies extends Widget{
-
- //with a custom locator or without it
- private List movies;
-...
-}
-```
-
-and
-
-```java
-public class RottenTomatoesScreen {
-
- //with a custom locator or without it
- Movies movies;
-...
-}
-```
-
-### Good! How to poputate all these fields?
-
-As usual:
-
-```java
-RottenTomatoesScreen screen = new RottenTomatoesScreen();
-PageFactory.initElements(new AppiumFieldDecorator(searchContext /*WebDriver or WebElement
- instance */), screen);
-```
-
-
-## Specification
-
-A class which describes a widget or group of elements should extend
-
-```java
-io.appium.java_client.pagefactory.Widget;
-```
-
-Any widget/group of elements can be described it terms of sub-elements or nested sub-widgets.
-Appium-specific annotations are used for this purpose.
-
-### Any class which describes the real widget or group of elements can be annotated
-
-That means that when the same "widget" is used frequently and any root element of this can be found by the same locator then user can
-
-```java
-@FindBy(relevant locator) //how to find a root element
-public class UsersWidget extends Widget{
-
- @FindBy(relevant locator) //this element will be found
- //using the root element
- WebElement subElement1;
-
- @FindBy(relevant locator) //this element will be found
- //using the root element
- WebElement subElement2;
-
- @FindBy(relevant locator) //a root element
- //of this widget is the sub-element which
- //will be found from top-element
- UsersWidget subWidget;
-
- //and so on..
-}
-```
-
-and then it is enough
-
-```java
- //above is the other field declaration
-
- UsersWidget widget;
-
- //below is the other field/method declaration
-```
-
-If the widget really should be found using an another locator then
-
-```java
- //above is the other field declaration
- @FindBy(another relevant locator) //this locator overrides
- //the declared in the using class
- UsersWidget widget;
-
- //below is the other field/method declaration
-```
-
-### Ok. What should users do if they want to implement a subclass which describes a similar group of elements for the same platform?
-
-There is nothing special.
-
-```java
-@FindBy(relevant locator) //how to find a root element
-public class UsersWidget extends Widget{
-...
-}
-
-```
-```java
-//at this case the root element will be found by the locator
-//which is declared in superclass
-public class UsersOverriddenWidget extends UsersWidget {
-...
-}
-```
-
-and
-
-```java
-@FindBy(relevant locator2) //this locator overrides
-//all locators declared in superclasses
-public class UsersOverriddenWidget2 extends UsersWidget {
-...
-}
-```
-
-### Is it possible to reuse "widgets" in crossplatform testing?
-
-If there is no special details of interaction with an application browser version and/or versions for different mobile OS's then
-
-
-```java
-@FindBy(relevant locator for browser/webview html or by default)
-@AndroidFindBy(relevant locator for Android UI automator)
-@iOSFindBy(relevant locator for iOS UI automation)
-public class UsersWidget extends Widget {
-
- @FindBy(relevant locator for browser/webview html or by default)
- @AndroidFindBy(relevant locator for Android UI automator)
- @iOSFindBy(relevant locator for iOS UI automation)
- RemoteWebElement subElement1;
-
- @FindBy(relevant locator for browser/webview html or by default)
- @AndroidFindBy(relevant locator for Android UI automator)
- @iOSFindBy(relevant locator for iOS UI automation)
- RemoteWebElement subElement2;
-
- //overrides a html/default
- //locator declared in the used class
- @FindBy(relevant locator for browser/webview html or by default)
- //overrides an Android UI automator
- //locator declared in the used class
- @AndroidFindBy(relevant locator for Android UI automator)
- //overrides an iOS UI automation
- //locator declared in the using class
- @iOSFindBy(relevant locator for iOS UI automation)
- UsersWidget subWidget;
-
- //and so on..
-}
-```
-
-### What if interaction with a "widget" has special details for each used platform, but the same at high-level
-
-Then it is possible
-
-```java
-public /*abstract*/ class DefaultAbstractUsersWidget extends Widget{
-
-}
-```
-
-and
-
-```java
-@FindBy(locator)
-public class UsersWidgetForHtml extends DefaultAbstractUsersWidget {
-
-}
-```
-
-and
-
-```java
-@AndroidFindBy(locator)
-public class UsersWidgetForAndroid extends DefaultAbstractUsersWidget {
-
-}
-```
-
-and even
-
-```java
-@iOSFindBy(locator)
-public class UsersWidgetForIOS extends DefaultAbstractUsersWidget {
-
-}
-```
-
-and then
-
-
-```java
- import io.appium.java_client.pagefactory.OverrideWidget;
- ...
-
- //above is the other field declaration
- @OverrideWidget(html = UsersWidgetForHtml.class,
- androidUIAutomator = UsersWidgetForAndroid.class,
- iOSUIAutomation = UsersWidgetForIOS .class)
- DefaultAbstractUsersWidget widget;
-
- //below is the other field/method declaration
-```
-
-This use case has some restrictions;
-
-- All classes which are declared by the OverrideWidget annotation should be subclasses of the class declared by field
-
-- All classes which are declared by the OverrideWidget should not be abstract. If a declared class is overriden partially like
-
-```java
- //above is the other field declaration
-
- @OverrideWidget(iOSUIAutomation = UsersWidgetForIOS .class)
- DefaultUsersWidget widget; //lets assume that there are differences of
- //interaction with iOS and by default we use DefaultUsersWidget.
- //Then DefaultUsersWidget should not be abstract too.
- //
-
- //below is the other field/method declaration
-```
-
-- for now it is not possible to
-
-```java
- import io.appium.java_client.pagefactory.OverrideWidget;
- ...
-
- //above is the other field declaration
- @OverrideWidget(html = UsersWidgetForHtml.class,
- androidUIAutomator = UsersWidgetForAndroid.class,
- iOSUIAutomation = UsersWidgetForIOS .class)
- DefaultAbstractUsersWidget widget;
-
- //below is the other field/method declaration
-
- //user's code
- ((UsersWidgetForAndroid) widget).doSpecialWorkForAndroing()
-```
-
-The workaround:
-
-```java
- import io.appium.java_client.pagefactory.OverrideWidget;
- ...
-
- //above is the other field declaration
- @OverrideWidget(html = UsersWidgetForHtml.class,
- androidUIAutomator = UsersWidgetForAndroid.class,
- iOSUIAutomation = UsersWidgetForIOS .class)
- DefaultAbstractUsersWidget widget;
-
- //below is the other field/method declaration
-
- //user's code
- ((UsersWidgetForAndroid) widget.getSelfReference()).doSpecialWorkForAndroing()
-```
-
-### Good! What about widget lists?
-
-All that has been mentioned above is true for "widget" lists.
-
-### One more restriction
-
-It is strongly recommended to implement each subclass of __io.appium.java_client.pagefactory.Widget__ with this constructor
-
-```java
- public /*or any other available modifier*/ WidgetSubclass(WebElement element) {
- super(element);
- }
-```
\ No newline at end of file
diff --git a/archive/docs/The-event_firing.md b/archive/docs/The-event_firing.md
deleted file mode 100644
index 38071a9a7..000000000
--- a/archive/docs/The-event_firing.md
+++ /dev/null
@@ -1,125 +0,0 @@
-since 4.1.0
-
-# The purpose
-
-This feature allows end user to organize the event logging on the client side. Also this feature may be useful in a binding with standard or custom reporting
-frameworks.
-
-
-# The API
-
-The API was designed the way which allows end user to select events (searching, navigation, exception throwing etc.) which should be listened to. It contains
-the following list of interfaces (new items may be added further):
-
-- `io.appium.java_client.events.api.Listener` is the basic interface
-- `io.appium.java_client.events.api.general.AlertEventListener` is for the listening to alerts
-- `io.appium.java_client.events.api.general.ElementEventListener` is for the listening to actions related to elements
-- `io.appium.java_client.events.api.general.JavaScriptEventListener` is for the listening to java script executing
-- `io.appium.java_client.events.api.general.ListensToException` is for the listening to exceptions which are thrown
-- `io.appium.java_client.events.api.general.NavigationEventListener` is for the listening to events related to navigation
-- `io.appium.java_client.events.api.general.SearchingEventListener` is for the listening to events related to the searching.
-- `io.appium.java_client.events.api.general.WindowEventListener` is for the listening to actions on a window
-- `io.appium.java_client.events.api.mobile.ContextEventListener` is for the listening to the switching to mobile context
-- `io.appium.java_client.events.api.mobile.RotationEventListener` is for the listening to screen rotation
-- `io.appium.java_client.events.api.general.AppiumWebDriverEventListener` was added to provide the compatibility with
-user's implementation of `org.openqa.selenium.support.events.WebDriverEventListener`. Also it extends some interfaces above.
-
-# Briefly about the engine.
-
-This is pretty similar solution as the `org.openqa.selenium.support.events.EventFiringWebDriver` of the Selenium project. You
-can read about this thing there [The blog post](http://seleniumworks.blogspot.ru/2014/02/eventfiringwebdriver.html).
-
-Here we were trying to improve existing drawbacks and restrictions using:
-
-- API splitting, see above.
-
-- the binding of some [Spring framework engines](https://projects.spring.io/spring-framework/) with [AspectJ](https://en.wikipedia.org/wiki/AspectJ).
-
-# How to use
-
-It is easy.
-
-```java
-import io.appium.java_client.events.api.general.AlertEventListener;
-
-public class AlertListener implements AlertEventListener {
-...
-}
-
-...
-import io.appium.java_client.events.api.general.ElementEventListener;
-
-public class ElementListener implements ElementEventListener {
-...
-}
-
-//and so on
-...
-import io.appium.java_client.events.EventFiringWebDriverFactory;
-import io.appium.java_client.events.api.Listener;
-...
-
-AndroidDriver driver = new AndroidDriver(parameters);
-driver = EventFiringWebDriverFactory.getEventFiringWebDriver(driver, new AlertListener(),
- new ElementListener());
-
-//or
-AndroidDriver driver2 = new AndroidDriver(parameters);
-List listeners = new ArrayList<>();
-listeners.add(new AlertListener());
-listeners.add(new ElementListener());
-driver = EventFiringWebDriverFactory.getEventFiringWebDriver(driver2, listeners);
-```
-
-## What if there are listeners which used everywhere by default.
-
-In order to avoid the repeating actions an end user is free to do these things:
-
-- create folders `/META-INF/services` and put the file `io.appium.java_client.events.api.Listener` there. Please read about
-[SPI](https://docs.oracle.com/javase/tutorial/sound/SPI-intro.html).
-
-
-
-- define the list of default listeners at the `io.appium.java_client.events.api.Listener`
-
-
-
-And then it is enough
-
-```java
-
-//and so on
-...
-import io.appium.java_client.events.EventFiringWebDriverFactory;
-...
-
-AndroidDriver driver = new AndroidDriver(parameters);
-driver = EventFiringWebDriverFactory.getEventFiringWebDriver(driver);
-```
-
-If there are listeners defined externally when this collection is merged with default set of listeners.
-
-# How to reuse customized WebDriverEventListener
-
-If an end user has their own `org.openqa.selenium.support.events.WebDriverEventListener` implementation then in order to
-make it compatible with this engine it is enough to do the following.
-
-
-```java
-import org.openqa.selenium.support.events.WebDriverEventListener;
-import io.appium.java_client.events.api.general.AppiumWebDriverEventListener;
-
-public class UsersWebDriverEventListener implements WebDriverEventListener, AppiumWebDriverEventListener {
-...
-}
-```
-
-or just
-
-```java
-import io.appium.java_client.events.api.general.AppiumWebDriverEventListener;
-
-public class UsersWebDriverEventListener implements AppiumWebDriverEventListener {
-...
-}
-```
diff --git a/archive/docs/The-starting-of-an-Android-app.md b/archive/docs/The-starting-of-an-Android-app.md
deleted file mode 100644
index 31ff4203e..000000000
--- a/archive/docs/The-starting-of-an-Android-app.md
+++ /dev/null
@@ -1,88 +0,0 @@
-# Steps:
-
-- you have to prepare environment for Android. Details are provided here: http://appium.io/slate/en/master/?java#setup-(android)
-
-- you have to download the desktop app [for Windows or Mac OS X](https://bitbucket.org/appium/appium.app/downloads/) or install it using _npm_
-_$ npm install -g appium_ or _$ npm install appium@required_version_
-
-- it needs to launch the appium server. If you use the server installed via npm then
-
- _$ node **the_path_to_js_file** --arg1 value1 --arg2 value2_
-where **the_path_to_js_file** is the full path to **appium.js** file (if the node server version version <= 1.4.16) or **main.js** (if the node server version version >= 1.5.0). It is not necessary to use arguments. The list of arguments: http://appium.io/slate/en/master/?java#appium-server-arguments
-
-
-# The starting of an app
-
-It looks like creation of a common [RemoteWebDriver](https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/remote/RemoteWebDriver.html) instance.
-
-[Common capabilities](http://appium.io/slate/en/master/?java#the---default-capabilities-flag)
-
-[Android-specific capabilities](http://appium.io/slate/en/master/?java#android-only)
-
-[Common capabilities provided by Java client](http://appium.github.io/java-client/io/appium/java_client/remote/MobileCapabilityType.html)
-
-[Android-specific capabilities provided by Java client](http://appium.github.io/java-client/io/appium/java_client/remote/AndroidMobileCapabilityType.html)
-
-```java
-import java.io.File;
-import org.openqa.selenium.remote.DesiredCapabilities;
-import io.appium.java_client.AppiumDriver;
-import io.appium.java_client.android.AndroidDriver;
-import io.appium.java_client.MobileElement;
-import java.net.URL;
-
-...
-File app = new File("The absolute or relative path to an *.apk file");
-DesiredCapabilities capabilities = new DesiredCapabilities();
-capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "Android Emulator");
-capabilities.setCapability(MobileCapabilityType.APP, app.getAbsolutePath());
-//you are free to set additional capabilities
-AppiumDriver driver = new AndroidDriver<>(
-new URL("http://target_ip:used_port/wd/hub"), //if it needs to use locally started server
-//then the target_ip is 127.0.0.1 or 0.0.0.0
-//the default port is 4723
-capabilities);
-```
-
-If it needs to start browser then:
-
-```java
-import org.openqa.selenium.remote.DesiredCapabilities;
-import io.appium.java_client.remote.MobileBrowserType;
-import io.appium.java_client.AppiumDriver;
-import io.appium.java_client.android.AndroidDriver;
-import org.openqa.selenium.remote.RemoteWebElement;
-import java.net.URL;
-
-
-...
-DesiredCapabilities capabilities = new DesiredCapabilities();
-capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "Android Emulator");
-capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, MobileBrowserType.CHROME);
-//if it is necessary to use the default Android browser then MobileBrowserType.BROWSER
-//is your choise
-...
-//you are free to set additional capabilities
-AppiumDriver driver = new AndroidDriver<>(
-new URL("http://target_ip:used_port/wd/hub"), capabilities);
-```
-
-or
-
-```java
-import org.openqa.selenium.remote.DesiredCapabilities;
-import io.appium.java_client.remote.MobileBrowserType;
-import io.appium.java_client.remote.MobilePlatform;
-import org.openqa.selenium.remote.RemoteWebDriver;
-import java.net.URL;
-
-
-...
-DesiredCapabilities capabilities = new DesiredCapabilities();
-capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, MobilePlatform.ANDROID);
-capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "Android Emulator");
-capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, MobileBrowserType.CHROME);
-//you are free to set additional capabilities
-RemoteWebDriver driver = new RemoteWebDriver(
-new URL("http://target_ip:used_port/wd/hub"), capabilities);
-```
\ No newline at end of file
diff --git a/archive/docs/The-starting-of-an-app-using-Appium-node-server-started-programmatically.md b/archive/docs/The-starting-of-an-app-using-Appium-node-server-started-programmatically.md
deleted file mode 100644
index 6b897c61d..000000000
--- a/archive/docs/The-starting-of-an-app-using-Appium-node-server-started-programmatically.md
+++ /dev/null
@@ -1,289 +0,0 @@
-# Requirements
-- Installed Node.js 0.12 or greater.
-
-- At least an appium server instance installed via __npm__.
-
-# The basic principle.
-
-It works the similar way as common [ChromeDriver](https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/chrome/ChromeDriver.html), [InternetExplorerDriver](https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/ie/InternetExplorerDriver.html) of Selenium project or [PhantomJSDriver](http://cdn.ivandemarino.me/phantomjsdriver-javadoc/org/openqa/selenium/phantomjs/PhantomJSDriver.html). They use subclasses of the [DriverService](https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/remote/service/DriverService.html).
-
-# Which capabilities this feature provides
-
-This feature providese abilities and options of the starting of a local Appium node server. End users still able to open apps as usual
-
-```java
- DesiredCapabilities capabilities = new DesiredCapabilities();
- capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, "");
- capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "Android Emulator");
- capabilities.setCapability(MobileCapabilityType.APP, app.getAbsolutePath());
- capabilities.setCapability(MobileCapabilityType.NEW_COMMAND_TIMEOUT, 120);
- driver = new AndroidDriver<>(new URL("remoteOrLocalAddress"), capabilities);
-```
-
-when the server is launched locally\remotely. Also user is free to launch a local Appium node server and open their app for the further testing the following way:
-
-```java
- DesiredCapabilities capabilities = new DesiredCapabilities();
- capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, "");
- capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "Android Emulator");
- capabilities.setCapability(MobileCapabilityType.APP, app.getAbsolutePath());
- capabilities.setCapability(MobileCapabilityType.NEW_COMMAND_TIMEOUT, 120);
- driver = new AndroidDriver<>(capabilities);
-```
-
-# How to prepare the local service before the starting
-
-
-## If there is no specific parameters then
-
-```java
- import io.appium.java_client.service.local.AppiumDriverLocalService;
- ...
-
- AppiumDriverLocalService service = AppiumDriverLocalService.buildDefaultService();
- service.start();
- ...
- service.stop();
-```
-
-### FYI
-
-There are possible problems related to local environment which could break this:
-```java
-AppiumDriverLocalService service = AppiumDriverLocalService.buildDefaultService();
-```
-
-It is more usual for UNIX/LINUX-like OS's. Also there are situations when should be used an another Node.JS instance, e.g. the instance which is installed in the directory that differs from one defined at the PATH environmental variable. The same may be true for Appium node server (it is related to _appium.js_ file (v <= 1.4.16) and _main.js_ (v >= 1.5.0)).
-
-At this case user is able to set up values of the **NODE_BINARY_PATH** (The environmental variable used to define the path to executable NodeJS file (node.exe for WIN and node for Linux/MacOS X)) and the **APPIUM_BINARY_PATH** (The environmental variable used to define the path to executable appium.js (1.4.x and lower) or main.js (1.5.x and higher)) environmental variables/system properties. Also it is possible to define these values programmatically:
-
-```java
-//appium.node.js.exec.path
-System.setProperty(AppiumServiceBuilder.NODE_PATH ,
-"the path to the desired node.js executable");
-
-System.setProperty(AppiumServiceBuilder.APPIUM_PATH ,
-"the path to the desired appium.js or main.js");
-
-AppiumDriverLocalService service = AppiumDriverLocalService.buildDefaultService();
-```
-
-## If there should be non default parameters specified then
-
-```java
-import io.appium.java_client.service.local.AppiumDriverLocalService;
-import io.appium.java_client.service.local.AppiumServiceBuilder;
-import io.appium.java_client.service.local.flags.GeneralServerFlag;
-...
-
-AppiumDriverLocalService service = AppiumDriverLocalService.
-buildService(new AppiumServiceBuilder().
-withArgument(GeneralServerFlag.TEMP_DIRECTORY,
- "The_path_to_the_temporary_directory"));
-```
-
-or
-
-```java
-import io.appium.java_client.service.local.AppiumDriverLocalService;
-import io.appium.java_client.service.local.AppiumServiceBuilder;
-import io.appium.java_client.service.local.flags.GeneralServerFlag;
-...
-
-AppiumDriverLocalService service = new AppiumServiceBuilder().
-withArgument(GeneralServerFlag.TEMP_DIRECTORY,
- "The_path_to_the_temporary_directory").build();
-```
-
-Lists of available server side flags are here:
-
-- io.appium.java_client.service.local.flags.GeneralServerFlag;
-- io.appium.java_client.service.local.flags.AndroidServerFlag;
-- io.appium.java_client.service.local.flags.IOSServerFlag
-
-
-## Which parameters also can be defined
-
-- If it is necessary to define some specific port or any free port
-
-```java
-new AppiumServiceBuilder().usingPort(4000);
-```
-
-or
-
-```java
-new AppiumServiceBuilder().usingAnyFreePort();
-```
-
-- If it is necessary to use another IP address
-
-```java
-new AppiumServiceBuilder().withIPAddress("127.0.0.1");
-```
-
-- If it is necessary to define output log file
-
-```java
-import java.io.File;
- ...
-
-new AppiumServiceBuilder().withLogFile(logFile);
-```
-
-- If it is necessary to define another Node.js executable file
-
-```java
-import java.io.File;
-
-...
-
-new AppiumServiceBuilder().usingDriverExecutable(nodeJSExecutable);
-```
-
-- If it is necessary to define another appium.js/main.js file
-
-```java
-import java.io.File;
-
-...
-//appiumJS is the full or relative path to
-//the appium.js (v<=1.4.16) or maim.js (v>=1.5.0)
-new AppiumServiceBuilder().withAppiumJS(new File(appiumJS));
-```
-
-- It is possible to define server capabilities (node server v >= 1.5.0)
-
-```java
-DesiredCapabilities serverCapabilities = new DesiredCapabilities();
-...//the capability filling
-
-AppiumServiceBuilder builder = new AppiumServiceBuilder().
-withCapabilities(serverCapabilities);
-AppiumDriverLocalService service = builder.build();
-service.start();
-...
-service.stop();
-```
-
-Capabilities which are used by a builder can be completed/orerriden any similar way:
-
-```java
-DesiredCapabilities serverCapabilities = new DesiredCapabilities();
-serverCapabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
-serverCapabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "Android Emulator");
-serverCapabilities.setCapability(MobileCapabilityType.FULL_RESET, true);
-serverCapabilities.setCapability(MobileCapabilityType.NEW_COMMAND_TIMEOUT, 60);
-serverCapabilities.setCapability(MobileCapabilityType.APP, app.getAbsolutePath());
-serverCapabilities.setCapability(AndroidMobileCapabilityType.CHROMEDRIVER_EXECUTABLE,
-chrome.getAbsolutePath()); //this capability set can be used for all cases
-
-AppiumServiceBuilder builder = new AppiumServiceBuilder().
-withCapabilities(serverCapabilities);
-AppiumDriverLocalService service = builder.build();
-
-DesiredCapabilities clientCapabilities = new DesiredCapabilities();
-clientCapabilities.setCapability(AndroidMobileCapabilityType.APP_PACKAGE,
-"io.appium.android.apis");
-clientCapabilities.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY,
-".view.WebView1");
-```
-
-then
-
-```java
-AndroidDriver driver =
-new AndroidDriver<>(service, clientCapabilities);
-```
-
-or
-
-```java
-AndroidDriver driver =
-new AndroidDriver<>(builder, clientCapabilities);
-```
-
-or
-
-```java
-service.start();
-AndroidDriver driver =
-new AndroidDriver<>(service.getUrl(), clientCapabilities);
-```
-
-# How to create an AppiumDriver instance
-
-Many constructors of [AndroidDriver](http://appium.github.io/java-client/io/appium/java_client/android/AndroidDriver.html)/[IOSDriver](http://appium.github.io/java-client/io/appium/java_client/ios/IOSDriver.html) use [AppiumDriverLocalService](http://appium.github.io/java-client/io/appium/java_client/service/local/AppiumDriverLocalService.html) or [AppiumServiceBuilder](http://appium.github.io/java-client/io/appium/java_client/service/local/AppiumServiceBuilder.html) as parameters.
-The list of constructors is below.
-
-```java
-public AndroidDriver(URL remoteAddress,
- org.openqa.selenium.Capabilities desiredCapabilities)
-
-public AndroidDriver(URL remoteAddress,
- org.openqa.selenium.remote.http.HttpClient.Factory httpClientFactory,
- org.openqa.selenium.Capabilities desiredCapabilities)
-
-public AndroidDriver(AppiumDriverLocalService service,
- org.openqa.selenium.Capabilities desiredCapabilities)
-
-public AndroidDriver(AppiumDriverLocalService service,
- org.openqa.selenium.remote.http.HttpClient.Factory httpClientFactory,
- org.openqa.selenium.Capabilities desiredCapabilities)
-
-public AndroidDriver(AppiumServiceBuilder builder,
- org.openqa.selenium.Capabilities desiredCapabilities)
-
-public AndroidDriver(AppiumServiceBuilder builder,
- org.openqa.selenium.remote.http.HttpClient.Factory httpClientFactory,
- org.openqa.selenium.Capabilities desiredCapabilities)
-
-public AndroidDriver(org.openqa.selenium.remote.http.HttpClient.Factory httpClientFactory,
- org.openqa.selenium.Capabilities desiredCapabilities)
-
-public AndroidDriver(org.openqa.selenium.Capabilities desiredCapabilities)
-```
-
-```java
-public IOSDriver(URL remoteAddress,
- org.openqa.selenium.Capabilities desiredCapabilities)
-
-public IOSDriver(URL remoteAddress,
- org.openqa.selenium.remote.http.HttpClient.Factory httpClientFactory,
- org.openqa.selenium.Capabilities desiredCapabilities)
-
-public IOSDriver(AppiumDriverLocalService service,
- org.openqa.selenium.Capabilities desiredCapabilities)
-
-public IOSDriver(AppiumDriverLocalService service,
- org.openqa.selenium.remote.http.HttpClient.Factory httpClientFactory,
- org.openqa.selenium.Capabilities desiredCapabilities)
-
-public IOSDriver(AppiumServiceBuilder builder,
- org.openqa.selenium.Capabilities desiredCapabilities)
-
-public IOSDriver(AppiumServiceBuilder builder,
- org.openqa.selenium.remote.http.HttpClient.Factory httpClientFactory,
- org.openqa.selenium.Capabilities desiredCapabilities)
-
-public IOSDriver(org.openqa.selenium.remote.http.HttpClient.Factory httpClientFactory,
- org.openqa.selenium.Capabilities desiredCapabilities)
-
-public IOSDriver(org.openqa.selenium.Capabilities desiredCapabilities)
-```
-
-An instance of __AppiumDriverLocalService__ which has passed through constructors will be stopped when
-
-```java
- driver.quit();
-```
-
-If it is necessary to keep the service alive during a long time then something like that is available
-
-```java
- service.start();
-
- ....
-
- new IOSDriver(service.getUrl(), capabilities)
-```
diff --git a/archive/docs/The-starting-of-an-iOS-app.md b/archive/docs/The-starting-of-an-iOS-app.md
deleted file mode 100644
index a470c4137..000000000
--- a/archive/docs/The-starting-of-an-iOS-app.md
+++ /dev/null
@@ -1,91 +0,0 @@
-# Steps:
-
-- you have to prepare environment for iOS. Details are provided here: http://appium.io/slate/en/master/?ruby#system-setup-(ios)
-
-- you have to download the desktop app [for Mac OS X](https://bitbucket.org/appium/appium.app/downloads/) or install it using _npm_
-_$ npm install -g appium_ or _$ npm install appium@required_version_
-
-- it needs to launch the appium server. If you use the server installed via npm then
-
- _$ node **the_path_to_js_file** --arg1 value1 --arg2 value2_
-where **the_path_to_js_file** is the full path to **appium.js** file (if the node server version version <= 1.4.16) or **main.js** (if the node server version version >= 1.5.0). It is not necessary to use arguments. The list of arguments: http://appium.io/slate/en/master/?ruby#appium-server-arguments
-
-# The starting of an app
-
-It looks like creation of a common [RemoteWebDriver](https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/remote/RemoteWebDriver.html) instance.
-
-[Common capabilities](http://appium.io/slate/en/master/?ruby#the---default-capabilities-flag)
-
-[iOS-specific capabilities](http://appium.io/slate/en/master/?ruby#ios-only)
-
-[Common capabilities provided by Java client](http://appium.github.io/java-client/io/appium/java_client/remote/MobileCapabilityType.html)
-
-[iOS-specific capabilities provided by Java client](http://appium.github.io/java-client/io/appium/java_client/remote/IOSMobileCapabilityType.html)
-
-```java
-import java.io.File;
-import org.openqa.selenium.remote.DesiredCapabilities;
-import io.appium.java_client.AppiumDriver;
-import io.appium.java_client.ios.IOSDriver;
-import io.appium.java_client.MobileElement;
-import java.net.URL;
-
-...
-File app = new File("The absolute or relative path to an *.app, *.zip or ipa file");
-DesiredCapabilities capabilities = new DesiredCapabilities();
-capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "iPhone Simulator");
-capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "The_target_version");
-//The_target_version is the supported iOS version, e.g. 8.1, 8.2, 9.2 etc
-capabilities.setCapability(MobileCapabilityType.APP, app.getAbsolutePath());
-//you are free to set additional capabilities
-AppiumDriver driver = new IOSDriver<>(
-new URL("http://target_ip:used_port/wd/hub"), //if it needs to use locally started server
-//then the target_ip is 127.0.0.1 or 0.0.0.0
-//the default port is 4723
-capabilities);
-```
-
-If it needs to start browser then:
-
-```java
-import org.openqa.selenium.remote.DesiredCapabilities;
-import io.appium.java_client.remote.MobileBrowserType;
-import io.appium.java_client.AppiumDriver;
-import io.appium.java_client.ios.IOSDriver;
-import org.openqa.selenium.remote.RemoteWebElement;
-import java.net.URL;
-
-
-...
-DesiredCapabilities capabilities = new DesiredCapabilities();
-capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "iPhone Simulator");
-capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "The_target_version");
-//The_target_version is the supported iOS version, e.g. 8.1, 8.2, 9.2 etc
-capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, MobileBrowserType.SAFARI);
-...
-//you are free to set additional capabilities
-AppiumDriver driver = new IOSDriver<>(
-new URL("http://target_ip:used_port/wd/hub"), capabilities);
-```
-
-or
-
-```java
-import io.appium.java_client.remote.MobilePlatform;
-import org.openqa.selenium.remote.DesiredCapabilities;
-import io.appium.java_client.remote.MobileBrowserType;
-import org.openqa.selenium.remote.RemoteWebDriver;
-import java.net.URL;
-
-
-...
-DesiredCapabilities capabilities = new DesiredCapabilities();
-capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, MobilePlatform.IOS);
-capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "iPhone Simulator");
-capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "The_target_version");
-//The_target_version is the supported iOS version, e.g. 8.1, 8.2, 9.2 etc
-capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, MobileBrowserType.SAFARI);
-//you are free to set additional capabilities
-RemoteWebDriver driver = new RemoteWebDriver(
-new URL("http://target_ip:used_port/wd/hub"), capabilities);
-```
diff --git a/archive/docs/Touch-actions.md b/archive/docs/Touch-actions.md
deleted file mode 100644
index 20467c458..000000000
--- a/archive/docs/Touch-actions.md
+++ /dev/null
@@ -1 +0,0 @@
-... under constraction
\ No newline at end of file
diff --git a/archive/pom.xml b/archive/pom.xml
deleted file mode 100644
index 30378f00c..000000000
--- a/archive/pom.xml
+++ /dev/null
@@ -1,362 +0,0 @@
-
-
-
-
- 4.0.0
-
- io.appium
- java-client
- 5.0.0-SNAPSHOT
-
-
- org.seleniumhq.selenium
- selenium-java
- 2.53.1
-
-
- cglib
- cglib-nodep
-
-
- com.google.code.gson
- gson
-
-
-
-
- com.google.code.gson
- gson
- 2.7
-
-
- junit
- junit
- 4.12
- test
-
-
- org.apache.httpcomponents
- httpclient
- 4.5.2
-
-
- com.google.guava
- guava
- 19.0
-
-
- commons-validator
- commons-validator
- 1.5.1
-
-
- org.apache.commons
- commons-lang3
- 3.4
-
-
- cglib
- cglib-nodep
- 3.2.4
-
-
- org.springframework
- spring-context
- 4.3.2.RELEASE
- compile
-
-
- org.aspectj
- aspectjweaver
- 1.8.9
- compile
-
-
- jar
- java-client
- Java client for Appium Mobile Webdriver
- http://appium.io
-
-
-
- Apache License, Version 2.0
- http://www.apache.org/licenses/LICENSE-2.0.txt
- repo
-
-
-
-
- https://github.com/appium/java-client
- scm:git:ssh://git@github.com/appium/java-client.git
- scm:git:ssh://git@github.com/appium/java-client.git
-
- HEAD
-
-
-
-
- jonahss@gmail.com
- Jonah Stiennon
- https://github.com/jonahss
- jonahss
-
-
- tichomirovsergey@gmail.com
- Sergey Tikhomirov
- https://github.com/TikhomirovSergey
- TikhomirovSergey
-
-
- srinivasan.sekar1990@gmail.com
- Srinivasan Sekar
- https://github.com/SrinivasanTarget
- SrinivasanTarget
-
-
-
-
-
- ossrh
- https://oss.sonatype.org/content/repositories/snapshots
-
-
- ossrh
- https://oss.sonatype.org/service/local/staging/deploy/maven2/
-
-
-
-
-
-
- src/main/resources
-
-
-
-
- org.apache.maven.plugins
- maven-eclipse-plugin
- 2.10
-
- true
- true
- ${basedir}
-
- https://google-styleguide.googlecode.com/svn/trunk/eclipse-java-google-style.xml
-
-
-
-
- org.apache.maven.plugins
- maven-release-plugin
- 2.5.3
-
-
- org.apache.maven.scm
- maven-scm-provider-jgit
- 1.9.5
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-source-plugin
- 3.0.1
-
-
- attach-sources
-
- jar-no-fork
-
-
-
-
-
- org.apache.maven.plugins
- maven-javadoc-plugin
- 2.10.4
-
-
- attach-javadocs
-
- jar
-
-
-
-
-
- org.apache.maven.plugins
- maven-gpg-plugin
- 1.6
-
-
- sign-artifacts
- verify
-
- sign
-
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- 3.5.1
-
- 1.7
- 1.7
- eclipse
-
-
-
- org.codehaus.plexus
- plexus-compiler-eclipse
- 2.8
-
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.19.1
-
-
- org.apache.maven.surefire
- surefire-junit47
- 2.19.1
-
-
-
-
-
- test
-
- integration-test
-
-
- **/*Test.java
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-checkstyle-plugin
- 2.17
-
-
- com.puppycrawl.tools
- checkstyle
- LATEST
-
-
-
- ${basedir}/google-style.xml
- UTF-8
- false
- true
- true
- true
-
-
-
- validate
- validate
-
- check
-
-
-
-
-
- org.owasp
- dependency-check-maven
- 1.4.0
-
- 22
-
-
-
-
- check
-
-
-
-
-
- org.jacoco
- jacoco-maven-plugin
- 0.7.7.201606060606
-
- ${basedir}/target/coverage-reports/jacoco-unit.exec
- ${basedir}/target/coverage-reports/jacoco-unit.exec
-
-
-
- jacoco-initialize
-
- prepare-agent
-
-
-
- jacoco-site
- package
-
- report
-
-
-
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-checkstyle-plugin
- 2.17
-
- ${basedir}/google-style.xml
- UTF-8
- false
- true
- false
- true
-
-
-
-
- checkstyle
-
-
-
-
-
- org.apache.maven.plugins
- maven-jxr-plugin
- 2.3
-
-
- org.owasp
- dependency-check-maven
- 1.4.0
-
-
-
-
diff --git a/build.gradle b/build.gradle
index 26098d0a1..2990ec51c 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,211 +1,322 @@
-apply plugin: 'java'
-apply plugin: 'maven'
-apply plugin: 'eclipse'
-apply plugin: 'jacoco'
-apply plugin: 'checkstyle'
-apply plugin: 'signing'
-apply plugin: 'maven-publish'
-
-group 'io.appium'
-version '5.0.0-BETA9'
+import org.apache.tools.ant.filters.*
-repositories {
- jcenter()
- maven {
- url "http://repo.maven.apache.org/maven2"
- }
+plugins {
+ id 'java-library'
+ id 'idea'
+ id 'eclipse'
+ id 'maven-publish'
+ id 'jacoco'
+ id 'signing'
+ id 'org.owasp.dependencycheck' version '12.2.0'
+ id 'com.gradleup.shadow' version '9.3.1'
+ id 'org.jreleaser' version '1.21.0'
}
-buildscript {
- repositories {
- jcenter()
- maven {
- url "http://repo.maven.apache.org/maven2"
- }
- }
- dependencies {
- classpath "org.owasp:dependency-check-gradle:1.4.0"
- classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.4'
- }
+ext {
+ seleniumVersion = project.property('selenium.version')
+ appiumClientVersion = project.property('appiumClient.version')
+ slf4jVersion = '2.0.17'
}
-apply plugin: "org.owasp.dependencycheck"
-apply plugin: 'com.github.johnrengelman.shadow'
+group = 'io.appium'
+version = appiumClientVersion
-configurations {
- ecj
-}
+repositories {
+ mavenCentral()
-dependencies {
- ecj 'org.eclipse.jdt.core.compiler:ecj:4.5.1'
+ if (project.hasProperty("isCI")) {
+ maven {
+ url uri('https://central.sonatype.com/api/v1/publisher')
+ mavenContent {
+ snapshotsOnly()
+ }
+ }
+ }
}
-compileJava {
- sourceCompatibility = 1.8
- targetCompatibility = 1.8
-
- def ecjJar = configurations.ecj.singleFile
-
- options.fork = true
- options.fork executable: 'java', jvmArgs: [ '-cp', ecjJar.path, 'org.eclipse.jdt.internal.compiler.batch.Main' ]
- options.define compilerArgs: [
- '-encoding', 'utf-8'
- ]
+java {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+ withJavadocJar()
+ withSourcesJar()
}
dependencies {
- compile('org.seleniumhq.selenium:selenium-java:3.4.0'){
- exclude module: 'cglib'
- exclude group: 'com.google.code.gson'
- }
- compile 'com.google.code.gson:gson:2.8.1'
- compile 'org.apache.httpcomponents:httpclient:4.5.3'
- compile 'cglib:cglib:3.2.5'
- compile 'commons-validator:commons-validator:1.6'
- compile 'org.apache.commons:commons-lang3:3.5'
- compile 'commons-io:commons-io:2.5'
- compile 'org.springframework:spring-context:4.3.8.RELEASE'
- compile 'org.aspectj:aspectjweaver:1.8.10'
- compile 'org.openpnp:opencv:3.2.0-1'
-
- testCompile 'junit:junit:4.12'
- testCompile 'org.hamcrest:hamcrest-all:1.3'
-}
-
-ext {
- Sources = fileTree("$buildDir/src/main/java").include('**/*.java')
- Tests = fileTree("$buildDir/src/test/java").include('**/*.java')
- Docs = file("$buildDir/doc")
-}
+ compileOnly 'org.projectlombok:lombok:1.18.42'
+ annotationProcessor 'org.projectlombok:lombok:1.18.42'
-sourceSets {
- main {
- java {
- srcDir('src/main/java')
+ if (project.hasProperty("isCI")) {
+ api "org.seleniumhq.selenium:selenium-api:${seleniumVersion}"
+ api "org.seleniumhq.selenium:selenium-remote-driver:${seleniumVersion}"
+ api "org.seleniumhq.selenium:selenium-support:${seleniumVersion}"
+ } else {
+ api('org.seleniumhq.selenium:selenium-api') {
+ version {
+ strictly "[${seleniumVersion}, 5.0)"
+ prefer "${seleniumVersion}"
+ }
}
- resources {
- srcDir('src/main/resources')
+ api('org.seleniumhq.selenium:selenium-remote-driver') {
+ version {
+ strictly "[${seleniumVersion}, 5.0)"
+ prefer "${seleniumVersion}"
+ }
}
- }
- test {
- java {
- srcDir('src/test/java')
+ api('org.seleniumhq.selenium:selenium-support') {
+ version {
+ strictly "[${seleniumVersion}, 5.0)"
+ prefer "${seleniumVersion}"
+ }
}
}
+ implementation 'com.google.code.gson:gson:2.13.2'
+ implementation "org.slf4j:slf4j-api:${slf4jVersion}"
+ implementation 'org.jspecify:jspecify:1.0.0'
}
dependencyCheck {
- failBuildOnCVSS=22
+ failBuildOnCVSS = 22
}
jacoco {
- toolVersion = "0.7.7.201606060606"
+ toolVersion = '0.8.13'
}
-tasks.withType(JacocoReport) {
- description = "Generate Jacoco coverage reports after running tests"
+tasks.withType(JacocoReport).configureEach {
+ description = 'Generate Jacoco coverage reports after running tests'
sourceSets sourceSets.main
reports {
- html.enabled true
- html.destination "${buildDir}/Reports/jacoco"
+ html.required = true
+ html.outputLocation = file("${buildDir}/Reports/jacoco")
}
}
jacocoTestReport.dependsOn test
+apply plugin: 'checkstyle'
+
checkstyle {
- toolVersion = "7.0"
+ toolVersion = '10.23.1'
+ configFile = configDirectory.file('appium-style.xml').get().getAsFile()
showViolations = true
+ ignoreFailures = false
}
-dependencies {
- checkstyle( 'com.puppycrawl.tools:checkstyle:7.0' )
+javadoc {
+ options.addStringOption('encoding', 'UTF-8')
}
-tasks.withType(Checkstyle) {
- ignoreFailures = false
- configFile = file("$projectDir/google-style.xml")
- exclude '**/org/openqa/selenium/**'
+publishing {
+ publications {
+ mavenJava(MavenPublication) {
+ groupId = 'io.appium'
+ artifactId = 'java-client'
+ version = appiumClientVersion
+ from components.java
+ pom {
+ name = 'java-client'
+ description = 'Java client for Appium Mobile Webdriver'
+ url = 'http://appium.io'
+ developers {
+ developer {
+ name = 'Jonah Stiennon'
+ email = 'jonahss@gmail.com'
+ url = 'https://github.com/jonahss'
+ id = 'jonahss'
+ }
+ developer {
+ name = 'Sergey Tikhomirov'
+ email = 'tichomirovsergey@gmail.com'
+ url = 'https://github.com/TikhomirovSergey'
+ id = 'TikhomirovSergey'
+ }
+ developer {
+ name = 'Srinivasan Sekar'
+ email = 'srinivasan.sekar1990@gmail.com'
+ url = 'https://github.com/SrinivasanTarget'
+ id = 'SrinivasanTarget'
+ }
+ developer {
+ name = 'Mykola Mokhnach'
+ url = 'https://github.com/mykola-mokhnach'
+ id = 'mykola-mokhnach'
+ }
+ developer {
+ name = 'Valery Yatsynovich'
+ url = 'https://github.com/valfirst'
+ id = 'valfirst'
+ }
+ }
+ licenses {
+ license {
+ name = 'Apache License, Version 2.0'
+ url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+ distribution = 'repo'
+ }
+ }
+ scm {
+ url = 'https://github.com/appium/java-client'
+ connection = 'scm:git:ssh://git@github.com/appium/java-client.git'
+ developerConnection = 'scm:git:ssh://git@github.com/appium/java-client.git'
+ tag = 'HEAD'
+ }
+ }
+ }
+ }
+ repositories {
+ maven {
+ url = layout.buildDirectory.dir('staging-deploy')
+ }
+ }
}
-task javadocJar(type: Jar) {
- classifier = 'javadoc'
- from javadoc
+jreleaser {
+ signing {
+ active = 'ALWAYS'
+ armored = true
+ }
+ deploy {
+ maven {
+ mavenCentral {
+ sonatype {
+ active = 'ALWAYS'
+ url = 'https://central.sonatype.com/api/v1/publisher'
+ stagingRepository('build/staging-deploy')
+ }
+ }
+ }
+ }
}
-task sourcesJar(type: Jar) {
- classifier = 'sources'
- from sourceSets.main.allSource
+wrapper {
+ gradleVersion = '9.1.0'
+ distributionType = Wrapper.DistributionType.ALL
}
-artifacts {
- archives javadocJar, sourcesJar
+processResources {
+ filter ReplaceTokens, tokens: [
+ 'selenium.version' : seleniumVersion,
+ 'appiumClient.version': appiumClientVersion
+ ]
}
-signing {
- sign configurations.archives
-}
+testing {
+ suites {
+ configureEach {
+ useJUnitJupiter()
+ dependencies {
+ implementation 'org.junit.jupiter:junit-jupiter:5.14.2'
+ runtimeOnly 'org.junit.platform:junit-platform-launcher'
+ implementation 'org.hamcrest:hamcrest:3.0'
+ runtimeOnly "org.slf4j:slf4j-simple:${slf4jVersion}"
+ }
+ targets.configureEach {
+ testTask.configure {
+ testLogging {
+ showStandardStreams = true
+ exceptionFormat = 'full'
+ }
+ }
+ }
+ }
-uploadArchives {
- repositories {
- mavenDeployer {
- beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
+ test {
+ dependencies {
+ implementation "org.seleniumhq.selenium:selenium-chrome-driver:${seleniumVersion}"
+ implementation('io.github.bonigarcia:webdrivermanager:6.3.3') {
+ exclude group: 'org.seleniumhq.selenium'
+ }
+ }
+ targets.configureEach {
+ testTask.configure {
+ finalizedBy jacocoTestReport
+ }
+ }
+ }
- repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") {
- authentication(userName: ossrhUsername, password: ossrhPassword)
+ e2eIosTest(JvmTestSuite) {
+ sources {
+ java {
+ srcDirs = ['src/e2eIosTest/java']
+ }
+ }
+ dependencies {
+ implementation project()
+ implementation(sourceSets.test.output)
+ implementation('org.apache.commons:commons-lang3:3.20.0')
}
- snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") {
- authentication(userName: ossrhUsername, password: ossrhPassword)
+ targets.configureEach {
+ testTask.configure {
+ shouldRunAfter(test)
+ filter {
+ exclude '**/IOSScreenRecordTest.class'
+ exclude '**/ImagesComparisonTest.class'
+ exclude '**/IOSNativeWebTapSettingTest.class'
+ }
+ }
}
+ }
- pom.project {
- packaging 'jar'
- name 'java-client'
- description 'Java client for Appium Mobile Webdriver'
- url 'http://appium.io'
- developers {
- developer {
- name 'Jonah Stiennon'
- email 'jonahss@gmail.com'
- url 'https://github.com/jonahss'
- id 'jonahss'
- };
- developer {
- name 'Sergey Tikhomirov'
- email 'tichomirovsergey@gmail.com'
- url 'https://github.com/TikhomirovSergey'
- id 'TikhomirovSergey'
- };
- developer {
- name 'Srinivasan Sekar'
- email 'srinivasan.sekar1990@gmail.com'
- url 'https://github.com/SrinivasanTarget'
- id 'SrinivasanTarget'
- };
+ e2eAndroidTest(JvmTestSuite) {
+ sources {
+ java {
+ srcDirs = ['src/e2eAndroidTest/java']
}
- licenses {
- license {
- name 'Apache License, Version 2.0'
- url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
- distribution 'repo'
- }
+ }
+ dependencies {
+ implementation project()
+ implementation(sourceSets.test.output)
+ implementation('io.github.bonigarcia:webdrivermanager:6.3.3') {
+ exclude group: 'org.seleniumhq.selenium'
}
- scm {
- url 'https://github.com/appium/java-client'
- connection 'scm:git:ssh://git@github.com/appium/java-client.git'
- developerConnection 'scm:git:ssh://git@github.com/appium/java-client.git'
- tag 'HEAD'
+ }
+
+ targets.configureEach {
+ testTask.configure {
+ shouldRunAfter(test)
+ filter {
+ // The following tests fail and should be reviewed/fixed
+ exclude '**/AndroidAbilityToUseSupplierTest.class'
+ exclude '**/AndroidConnectionTest.class'
+ exclude '**/AndroidContextTest.class'
+ exclude '**/AndroidDataMatcherTest.class'
+ exclude '**/AndroidDriverTest.class'
+ exclude '**/AndroidElementTest.class'
+ exclude '**/AndroidFunctionTest.class'
+ exclude '**/AndroidSearchingTest.class'
+ exclude '**/AndroidTouchTest.class'
+ exclude '**/AndroidViewMatcherTest.class'
+ exclude '**/ExecuteCDPCommandTest.class'
+ exclude '**/ExecuteDriverScriptTest.class'
+ exclude '**/FingerPrintTest.class'
+ exclude '**/ImagesComparisonTest.class'
+ exclude '**/KeyCodeTest.class'
+ exclude '**/LogEventTest.class'
+ exclude '**/UIAutomator2Test.class'
+ exclude '**/AndroidPageObjectTest.class'
+ exclude '**/MobileBrowserCompatibilityTest.class'
+ }
}
}
}
- }
-}
-task wrapper(type: Wrapper) {
- gradleVersion = '2.14.1'
- description 'Generates the Gradle wrapper scripts.'
-}
+ e2eFlutterTest(JvmTestSuite) {
+ sources {
+ java {
+ srcDirs = ['src/e2eFlutterTest/java']
+ }
+ }
+ dependencies {
+ implementation project()
+ implementation(sourceSets.test.output)
+ }
-test {
- useJUnit()
+ targets.configureEach {
+ testTask.configure {
+ shouldRunAfter(test)
+ systemProperties project.properties.subMap(["platform", "flutterApp"])
+ }
+ }
+ }
+ }
}
diff --git a/google-style.xml b/config/checkstyle/appium-style.xml
similarity index 81%
rename from google-style.xml
rename to config/checkstyle/appium-style.xml
index 06e2c452c..b7473e937 100755
--- a/google-style.xml
+++ b/config/checkstyle/appium-style.xml
@@ -1,21 +1,11 @@
-
-
+ "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
+ "http://checkstyle.sourceforge.net/dtds/configuration_1_3.dtd">
-
@@ -41,13 +31,16 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
@@ -55,10 +48,7 @@
-
-
-
-
+
@@ -73,6 +63,7 @@
+
@@ -97,7 +88,7 @@
value="Package name ''{0}'' must match pattern ''{1}''."/>
-
+
@@ -138,6 +129,7 @@
+
@@ -162,12 +154,6 @@
-
-
-
-
-
-
@@ -181,29 +167,25 @@
-
-
-
+
-
-
-
+
+
-
-
+
-
-
-
+
+
+
@@ -215,8 +197,26 @@
-
+
+
+
+
+
+
+
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/config/checkstyle/suppressions.xml b/config/checkstyle/suppressions.xml
new file mode 100644
index 000000000..0587e646e
--- /dev/null
+++ b/config/checkstyle/suppressions.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/docs/Advanced-By.md b/docs/Advanced-By.md
new file mode 100644
index 000000000..96609f2a7
--- /dev/null
+++ b/docs/Advanced-By.md
@@ -0,0 +1,160 @@
+# Standard Selectors
+
+## AndroidFindBy / iOSXCUITFindBy / WindowsFindBy
+
+# Advanced Selectors
+
+## iOS's String Predicates
+
+You can specify a [predicate](https://developer.apple.com/documentation/foundation/nspredicate)
+in your Class Chain to limit the number of matched items. There's
+[a detailed guide to that](https://appium.io/docs/en/writing-running-appium/ios/ios-predicate/index.html)
+on the Appium Docs website with some Appium-specific considerations.
+
+## iOS's Class Chain Queries
+
+Our XCUiTest integration has full support for the 'Class Chain' concept. This
+can do much of what XPath does...but faster. Note that many Class Chains leverage
+String Predicates too.
+
+### String Predicates in Class Chains
+
+There's a special array-style syntax for defining predicates in a Class Chain:
+
+```
+// Start with [
+// Followed by `
+// Followed by some text
+// Followed by `
+// End with ]
+[`label != 'a'`]
+[`isWDVisible == 1`]
+[`value < 0`]
+```
+
+#### Searching Descendents
+
+If you replace the backticks (`` ` ``) around a predicate with dollar signs (`$`),
+then the Class Chain will match against the children, grandchildren, and other
+descendants of each element.
+
+```
+// Find a cell element with the label 'here'
+XCUIElementTypeCell[`label == 'here'`]
+// Find a cell element which contains SOMETHING ELSE that has the label 'here'
+XCUIElementTypeCell[$label == 'here'$]
+```
+
+#### Handling Quote Marks
+
+Most of the time, you can treat pairs of single quotes or double quotes
+interchangeably. If you're searching with a string that contains quote marks,
+though, you [need to be careful](https://stackoverflow.com/q/14116217).
+
+```c
+// Make sure to escape each quote mark that matches your delimiter
+"text with \"some\" 'quote' marks"
+// To NSPredicate, the line above and the line below are equivalent
+'text with "some" \'quote\' marks'
+```
+```java
+// When defining a iOSXCUITFindBy annotation, you'll be constrained by the
+// Java string-quoting rules too.
+@iOSXCUITFindBy(iOSClassChain = "**/SomeElement[`'text with \"some\" \\\'quote\\\' marks'`]")
+```
+
+### External References
+
+Refer to [the official WebDriverAgent query docs](https://github.com/facebookarchive/WebDriverAgent/wiki/Class-Chain-Queries-Construction-Rules)
+to learn more about the general concept.
+
+### Sample usage:
+
+```java
+// Selector for image elements
+@iOSXCUITFindBy(iOSClassChain = "**/XCUIElementTypeImage")
+
+// Selector for the first image element on screen
+@iOSXCUITFindBy(iOSClassChain = "**/XCUIElementTypeImage[1]")
+// Selector for the second image element on screen
+@iOSXCUITFindBy(iOSClassChain = "**/XCUIElementTypeImage[2]")
+// Selector for the last image element on screen
+@iOSXCUITFindBy(iOSClassChain = "**/XCUIElementTypeImage[-1]")
+// Selector for the penultimate image element on screen
+@iOSXCUITFindBy(iOSClassChain = "**/XCUIElementTypeImage[-2]")
+
+// Selector for every cell with the name 'Foo' (single quote style)
+@iOSXCUITFindBy(iOSClassChain = "**/XCUIElementTypeCell[`name == 'Foo'`]")
+// Selector for every cell with the name "Foo" (double quote style)
+@iOSXCUITFindBy(iOSClassChain = "**/XCUIElementTypeCell[`name == \"Foo\"`]")
+
+// Selector for every cell with a name that starts with 'Foo' (single quote style)
+@iOSXCUITFindBy(iOSClassChain = "**/XCUIElementTypeCell[`name BEGINSWITH 'Foo'`]")
+// Selector for every cell with a name that starts with "Foo" (double quote style)
+@iOSXCUITFindBy(iOSClassChain = "**/XCUIElementTypeCell[`name BEGINSWITH \"Foo\"`]")
+
+// Selector for every cell with a name that starts with "it's not"
+@iOSXCUITFindBy(iOSClassChain = "**/XCUIElementTypeCell[`name BEGINSWITH \"it's not\"`]")
+
+// Selector that'll match every top-level element on screen
+@iOSXCUITFindBy(iOSClassChain = "*")
+// Selector that'll match every leaf element on screen (watch out: this can be SLOW)
+@iOSXCUITFindBy(iOSClassChain = "**/*")
+
+// You can place an index after a predicate: the following finds the last image element with name 'Foo'
+@iOSXCUITFindBy(iOSClassChain = "**/XCUIElementTypeCell[`name == 'Foo'`][-1]")
+```
+
+## Android's uiAutomator String
+
+Available when using [AndroidBy](AndroidBy) and [AndroidFindBy](AndroidFindBy) with
+[appium-uiautomator2-server](https://github.com/appium/appium-uiautomator2-server). This
+string will be used by the server to construct a UiSelector or UiScrollable object.
+
+### External References
+
+For an overview of what the backend is capable of, please check out the
+
+* [Main UI Automator Guide](https://developer.android.com/training/testing/ui-automator)
+* [UiScrollable API docs](https://developer.android.com/reference/androidx/test/uiautomator/UiScrollable)
+and
+* [UiSelector API docs](https://developer.android.com/reference/androidx/test/uiautomator/UiSelector)
+
+### Sample Strings
+
+Here are some ways you could configure a UiSelector in your project:
+
+```java
+// Create a selector that looks for the text "Hello World":
+@AndroidFindBy(uiAutomator = "new UiSelector().text(\"Hello World\")")
+
+// Create a selector that tries to find an ImageView:
+@AndroidFindBy(uiAutomator = "new UiSelector().className(\"android.widget.ImageView\")")
+
+// Create a selector that matches resource ids against a regular expression:
+private static final String looksLikeAPage = "page_number_\d*";
+@AndroidFindBy(uiAutomator = "new UiSelector().resourceIdMatches(\"" + looksLikeAPage + "\")")
+
+// The agent also supports some abbreviated forms - all 3 of the below
+// strings are equivalent.
+@AndroidFindBy(uiAutomator = "new UiSelector().className(\"android.widget.EditText\")")
+@AndroidFindBy(uiAutomator = "UiSelector().className(\"android.widget.EditText\")")
+@AndroidFindBy(uiAutomator = ".className(\"android.widget.EditText\")")
+
+// You can connect up conditions to search for multiple things at once
+@AndroidFindBy(uiAutomator = ".resourceId(\"android:id/list\").classNameMatches(\"\.*RecyclerView\").index(3)")
+```
+
+..and here are some that create UiScrollable objects:
+
+```java
+private static final String ourImageSelector = ".className(\"android.widget.ImageView\")";
+private static final String ourListSelector = ".className(\"android.widget.ListView\")";
+
+// Create a scrollable associated with a list (by itself, this doesn't do anything useful...)
+@AndroidFindBy(uiAutomator = "new UiScrollable(" + ourListSelector + ")")
+
+// Create a scrollable that scrolls forward along a list until it finds an ImageView:
+@AndroidFindBy(uiAutomator = "new UiScrollable(" + ourListSelector + ").scrollIntoView(" + ourImageSelector + ")")
+
+```
diff --git a/docs/Functions.md b/docs/Functions.md
deleted file mode 100644
index bdf962f7c..000000000
--- a/docs/Functions.md
+++ /dev/null
@@ -1,147 +0,0 @@
-Appium java client has some features based on [Java 8 Functional interfaces](https://www.oreilly.com/learning/java-8-functional-interfaces).
-
-# Conditions
-
-```java
-io.appium.java_client.functions.AppiumFunction
-```
-It extends
-```java
-java.util.function.Function
-```
-and
-```java
-com.google.common.base.Function
-```
-to make end user available to use _org.openqa.selenium.support.ui.Wait_. There is additional interface
-```java
-io.appium.java_client.functions.ExpectedCondition
-```
-which extends
-```java
-io.appium.java_client.functions.AppiumFunction
-```
-
-and
-
-```java
-org.openqa.selenium.support.ui.ExpectedCondition
-```
-
-This feature provides the ability to create complex condition of the waiting for something.
-
-```java
-//waiting for elements
- private final AppiumFunction> searchingFunction = input -> {
- List result = input.findElements(By.tagName("a"));
-
- if (result.size() > 0) {
- return result;
- }
- return null;
-};
-
-//waiting for some context using regular expression pattern
-private final AppiumFunction contextFunction = input -> {
- Set contexts = driver.getContextHandles();
- String current = driver.getContext();
- contexts.forEach(context -> {
- Matcher m = input.matcher(context);
- if (m.find()) {
- driver.context(context);
- }
- });
- if (!current.equals(driver.getContext())) {
- return driver;
- }
- return null;
-};
-```
-
-## using one function as pre-condition
-
-```java
-@Test public void tezt() {
- ....
- Wait wait = new FluentWait<>(Pattern.compile("WEBVIEW"))
- .withTimeout(30, TimeUnit.SECONDS);
- List elements = wait.until(searchingFunction.compose(contextFunction));
- ....
-}
-```
-
-## using one function as post-condition
-
-```java
-import org.openqa.selenium.support.ui.FluentWait;
-import org.openqa.selenium.support.ui.Wait;
-
-@Test public void tezt() {
- ....
- Wait wait = new FluentWait<>(Pattern.compile("WEBVIEW"))
- .withTimeout(30, TimeUnit.SECONDS);
- List elements = wait.until(contextFunction.andThen(searchingFunction));
- ....
-}
-```
-
-# Touch action supplier
-
-[About touch actions](https://github.com/appium/java-client/blob/master/docs/Touch-actions.md)
-
-You can use suppliers to declare touch/multitouch actions for some screens/tests. Also it is possible to
-create gesture libraries/utils using suppliers. Appium java client provides this interface
-
-```java
-io.appium.java_client.functions.ActionSupplier
-```
-
-## Samples
-
-```java
-private final ActionSupplier horizontalSwipe = () -> {
- driver.findElementById("io.appium.android.apis:id/gallery");
-
- AndroidElement gallery = driver.findElementById("io.appium.android.apis:id/gallery");
- List images = gallery
- .findElementsByClassName("android.widget.ImageView");
- Point location = gallery.getLocation();
- Point center = gallery.getCenter();
-
- return new TouchAction(driver).press(images.get(2), -10, center.y - location.y)
- .waitAction(2000).moveTo(gallery, 10, center.y - location.y).release();
-};
-
-private final ActionSupplier verticalSwiping = () ->
- new TouchAction(driver).press(driver.findElementByAccessibilityId("Gallery"))
- .waitAction(2000).moveTo(driver.findElementByAccessibilityId("Auto Complete")).release();
-
-@Test public void tezt() {
- ...
- horizontalSwipe.get().perform();
- ...
- verticalSwiping.get().perform();
- ...
-}
-```
-
-```java
-public class GestureUtils {
-
- public static ActionSupplier swipe(final AppiumDriver> driver, final params) {
- return () -> {
- new TouchAction(driver).press(params)
- .waitAction(params).moveTo(params).release();
- };
- }
-}
-
-public class SomeTest {
- @Test public void tezt() {
- ...
- GestureUtils.swipe(driver, params).get().perform();
- ...
- }
-}
-
-```
\ No newline at end of file
diff --git a/docs/How-to-propose-a-PR.md b/docs/How-to-propose-a-PR.md
index 22a1a6995..83dfefa64 100644
--- a/docs/How-to-propose-a-PR.md
+++ b/docs/How-to-propose-a-PR.md
@@ -21,4 +21,4 @@ with pasted java code samples or put them at a PR description using markdown. Ab
# Pull-request template
-There is [PULL_REQUEST_TEMPLATE.md)](https://github.com/appium/java-client/blob/master/PULL_REQUEST_TEMPLATE.md) which should help you to make a good pull request.
+There is [PULL_REQUEST_TEMPLATE.md](https://github.com/appium/java-client/blob/master/PULL_REQUEST_TEMPLATE.md) which should help you to make a good pull request.
diff --git a/docs/How-to-report-an-issue.md b/docs/How-to-report-an-issue.md
index 0adf13fbf..863c90187 100644
--- a/docs/How-to-report-an-issue.md
+++ b/docs/How-to-report-an-issue.md
@@ -1,6 +1,6 @@
# Be sure that it is not a server-side problem if you are facing something that looks like a bug
-The Appium Java client is the thin client which just sends requests and receives responces generally.
+The Appium Java client is the thin client which just sends requests and receives responses generally.
Be sure that this bug is not reported [here](https://github.com/appium/appium/issues) and/or there is
no progress on this issue.
@@ -13,8 +13,8 @@ If it is the feature request then there should be the description of this featur
### Environment (bug report)
-* java client build version or git revision if you use some shapshot:
-* Appium server version or git revision if you use some shapshot:
+* java client build version or git revision if you use some snapshot:
+* Appium server version or git revision if you use some snapshot:
* Desktop OS/version used to run Appium if necessary:
* Node.js version (unless using Appium.app|exe) or Appium CLI or Appium.app|exe:
* Mobile platform/version under test:
@@ -28,11 +28,11 @@ If it is necessary there should provided more details
### Code To Reproduce Issue (good to Have if you report a bug)
It's easier to reproduce bug and much faster to fix it.
-You can git clone https://github.com/appium/sample-code or https://github.com/appium/sample-code/tree/master/sample-code/apps and reproduce an issue using Java and sample apps.
+You can git clone https://github.com/appium/appium/tree/master/sample-code or https://github.com/appium/appium/tree/master/sample-code/apps and reproduce an issue using Java and sample apps.
Also you can create a [gist](https://gist.github.com) with pasted java code sample or paste it at ussue description using markdown. About markdown please read [Mastering markdown](https://guides.github.com/features/mastering-markdown/) and
[Writing on GitHub](https://help.github.com/categories/writing-on-github/)
-### Ecxeption stacktraces (bug report)
+### Exception stacktraces (bug report)
There should be created a [gist](https://gist.github.com) with pasted stacktrace of exception thrown by java.
diff --git a/docs/Installing-the-project.md b/docs/Installing-the-project.md
deleted file mode 100644
index 14f20686d..000000000
--- a/docs/Installing-the-project.md
+++ /dev/null
@@ -1,83 +0,0 @@
-# Requirements
-
-Firstly you should install appium server. [Appium getting started](http://appium.io/getting-started.html). The version 1.6.3 or greater is recommended.
-
-Since version 5.x there many features based on Java 8. So we recommend to install JDK SE 8 and provide that source compatibility.
-
-# Maven
-
-Add the following to pom.xml:
-
-```
-
- io.appium
- java-client
- ${version.you.require}
- test
-
-```
-
-If it is necessary to change the version of Selenium then you can configure pom.xml like following:
-
-```
-
- io.appium
- java-client
- ${version.you.require}
- test
-
-
- org.seleniumhq.selenium
- selenium-java
-
-
-
-
-
- org.seleniumhq.selenium
- selenium-java
- ${selenium.version.you.require}
-
-```
-
-# Gradle
-
-Add the following to build.gradle:
-
-```
-repositories {
- jcenter()
- maven {
- url "http://repo.maven.apache.org/maven2"
- }
-}
-
-dependencies {
- ...
- testCompile group: 'io.appium', name: 'java-client', version: requiredVersion
- ...
-}
-```
-
-If it is necessary to change the version of Selenium then you can configure build.gradle like the sample below:
-
-```
-repositories {
- jcenter()
- maven {
- url "http://repo.maven.apache.org/maven2"
- }
-}
-
-dependencies {
- ...
- testCompile group: 'io.appium', name: 'java-client', version: requiredVersion {
- exclude module: 'selenium-java'
- }
-
- testCompile group: 'org.seleniumhq.selenium', name: 'selenium-java',
- version: requiredSeleniumVersion
- ...
-}
-```
-
diff --git a/docs/Note-for-developers.md b/docs/Note-for-developers.md
index 97f9dbe2f..d6182196d 100644
--- a/docs/Note-for-developers.md
+++ b/docs/Note-for-developers.md
@@ -12,32 +12,11 @@ This is the Gradle project.
Be sure that:
-- The `JAVA_HOME` environmental contains a path to JDK > 7
-
-- If non built-in gradle distribution is used then its version should be > 2.1
-
-## Compiler
-
-This project is compiled in some not common way. We use `ecj` Eclipse Java Compiler. Below is the sample how to define this compiler by IDE.
-
-
-## JDK
-
-Please check following settings:
-
-
-
-
-
-
-
-
-
-
+- The `JAVA_HOME` environmental contains a path to JDK 1.8+
## Coding Standards
-Appium java-client strictly follows [Google Java Style](http://google-styleguide.googlecode.com/svn/trunk/javaguide.html) as a coding standards. Contributors are requested to follow this by configuring in their IDE's Editor Code style,
+Appium java-client strictly follows [Google Java Style](https://google.github.io/styleguide/javaguide.html) as a coding standards. Contributors are requested to follow this by configuring in their IDE's Editor Code style,
* Clone [Google Style Guide](https://github.com/google/styleguide.git) from git
diff --git a/docs/Page-objects.md b/docs/Page-objects.md
index 7c41cc612..f3e1c9627 100644
--- a/docs/Page-objects.md
+++ b/docs/Page-objects.md
@@ -16,7 +16,7 @@ WebElement someElement;
List someElements;
```
-# If there is need to use convinient locators for mobile native applications then the following is available:
+# If there is need to use convenient locators for mobile native applications then the following is available:
```java
import io.appium.java_client.android.AndroidElement;
@@ -46,32 +46,31 @@ List someElements;
# The example for the crossplatform mobile native testing
```java
-import io.appium.java_client.MobileElement;
import io.appium.java_client.pagefactory.*;
@AndroidFindBy(someStrategy)
@iOSFindBy(someStrategy)
-MobileElement someElement;
+WebElement someElement;
@AndroidFindBy(someStrategy) //for the crossplatform mobile native
@iOSFindBy(someStrategy) //testing
-List someElements;
+List someElements;
```
-# The fully cross platform examle
+# The fully cross platform example
```java
import org.openqa.selenium.remote.RemoteWebElement;
import io.appium.java_client.pagefactory.*;
import org.openqa.selenium.support.FindBy;
-//the fully cross platform examle
+//the fully cross platform example
@FindBy(someStrategy) //for browser or web view html UI
@AndroidFindBy(someStrategy) //for Android native UI
@iOSFindBy(someStrategy) //for iOS native UI
RemoteWebElement someElement;
-//the fully cross platform examle
+//the fully cross platform example
@FindBy(someStrategy)
@AndroidFindBy(someStrategy) //for Android native UI
@iOSFindBy(someStrategy) //for iOS native UI
@@ -305,18 +304,19 @@ If time of the waiting for elements differs from usual (longer, or shorter when
```java
import io.appium.java_client.pagefactory.*;
+import java.time.temporal.ChronoUnit;
-@WithTimeout(timeOut = yourTime, timeUnit = yourTimeUnit)
+@WithTimeout(timeOut = yourTime, chronoUnit = yourTimeUnit)
RemoteWebElement someElement;
-@WithTimeout(timeOut = yourTime, timeUnit = yourTimeUnit)
+@WithTimeout(timeOut = yourTime, chronoUnit = yourTimeUnit)
List someElements;
```
# The additional feature.
## The simple example
-Let's imagine that the task is to check an Android client of the [http://www.rottentomatoes.com](http://www.rottentomatoes.com/). Let it be like a picture below
+Let's imagine that the task is to check an Android client of the [https://www.rottentomatoes.com](https://www.rottentomatoes.com/). Let it be like a picture below
 Lets imagine that it is only a part of the screen.
@@ -324,13 +324,13 @@ A typical page object could look like:
```java
public class RottenTomatoesScreen {
- //convinient locator
+ //convenient locator
private List titles;
- //convinient locator
+ //convenient locator
private List scores;
- //convinient locator
+ //convenient locator
private List castings;
//element declaration goes on
@@ -371,13 +371,13 @@ public class Movie extends Widget{
super(element);
}
- //convinient locator
+ //convenient locator
private AndroidElement title;
- //convinient locator
+ //convenient locator
private AndroidElement score;
- //convinient locator
+ //convenient locator
private AndroidElement casting;
public String getTitle(params){
@@ -404,7 +404,7 @@ So, now page object looks
```java
public class RottenTomatoesScreen {
- @AndroidFindBy(a locator which convinient to find a single movie-root - element)
+ @AndroidFindBy(a locator which convenient to find a single movie-root - element)
private List movies;
//element declaration goes on
@@ -427,7 +427,7 @@ public class RottenTomatoesScreen {
Then
```java
//the class is annotated !!!
-@AndroidFindBy(a locator which convinient to find a single movie-root - element)
+@AndroidFindBy(a locator which convenient to find a single movie-root - element)
public class Movie extends Widget{
...
}
@@ -658,7 +658,7 @@ This use case has some restrictions;
- All classes which are declared by the OverrideWidget annotation should be subclasses of the class declared by field
-- All classes which are declared by the OverrideWidget should not be abstract. If a declared class is overriden partially like
+- All classes which are declared by the OverrideWidget should not be abstract. If a declared class is overridden partially like
```java
//above is the other field declaration
@@ -720,4 +720,4 @@ It is strongly recommended to implement each subclass of __io.appium.java_clien
public /*or any other available modifier*/ WidgetSubclass(WebElement element) {
super(element);
}
-```
\ No newline at end of file
+```
diff --git a/docs/Tech-stack.md b/docs/Tech-stack.md
deleted file mode 100644
index e3b66655e..000000000
--- a/docs/Tech-stack.md
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
- + **AspectJ** and **CGlib**
-
-This project is based on [Selenium java client](https://github.com/SeleniumHQ/selenium/tree/master/java/client). It already depends on it and extends it to mobile platforms.
-
-This project is built by [gradle](https://gradle.org/)
-
-Also tech stack includes [Spring framework](https://projects.spring.io/spring-framework/) in binding with AspectJ. This is used by [event firing feature](https://github.com/appium/java-client/blob/master/docs/The-event_firing.md). Also **CGlib** is used by [Page Object tools](https://github.com/appium/java-client/blob/master/docs/Page-objects.md).
-
-It is the client framework. It is the thin client which just sends requests to Appium server and receives responses. Also it has some
-high-level features which were designed to simplify user's work.
-
-# It supports:
-
-
-
-
\ No newline at end of file
diff --git a/docs/The-event_firing.md b/docs/The-event_firing.md
index e703e5cd7..ff77c1247 100644
--- a/docs/The-event_firing.md
+++ b/docs/The-event_firing.md
@@ -1,151 +1,213 @@
-since 4.1.0
+since v8.0.0
# The purpose
-This feature allows end user to organize the event logging on the client side. Also this feature may be useful in a binding with standard or custom reporting
-frameworks.
-
-
-# The API
+This feature allows end user to organize the event logging on the client side.
+Also, this feature may be useful in a binding with standard or custom reporting
+frameworks. The feature has been introduced first since Selenium API v4.
-The API was designed the way which allows end user to select events (searching, navigation, exception throwing etc.) which should be listened to. It contains
-the following list of interfaces (new items may be added further):
+# The API
-- `io.appium.java_client.events.api.Listener` is the basic interface
-- `io.appium.java_client.events.api.general.AlertEventListener` is for the listening to alerts
-- `io.appium.java_client.events.api.general.ElementEventListener` is for the listening to actions related to elements
-- `io.appium.java_client.events.api.general.JavaScriptEventListener` is for the listening to java script executing
-- `io.appium.java_client.events.api.general.ListensToException` is for the listening to exceptions which are thrown
-- `io.appium.java_client.events.api.general.NavigationEventListener` is for the listening to events related to navigation
-- `io.appium.java_client.events.api.general.SearchingEventListener` is for the listening to events related to the searching.
-- `io.appium.java_client.events.api.general.WindowEventListener` is for the listening to actions on a window
-- `io.appium.java_client.events.api.mobile.ContextEventListener` is for the listening to the switching to mobile context
-- `io.appium.java_client.events.api.mobile.RotationEventListener` is for the listening to screen rotation
-- `io.appium.java_client.events.api.general.AppiumWebDriverEventListener` was added to provide the compatibility with
-user's implementation of `org.openqa.selenium.support.events.WebDriverEventListener`. Also it extends some interfaces above.
-
-# Briefly about the engine.
+There are two main entities used to implement events firing logic:
+- [org.openqa.selenium.support.events.EventFiringDecorator](https://github.com/SeleniumHQ/selenium/blob/trunk/java/src/org/openqa/selenium/support/events/EventFiringDecorator.java) class
+- [org.openqa.selenium.support.events.WebDriverListener](https://github.com/SeleniumHQ/selenium/blob/trunk/java/src/org/openqa/selenium/support/events/WebDriverListener.java) interface
-This is pretty similar solution as the `org.openqa.selenium.support.events.EventFiringWebDriver` of the Selenium project. You
-can read about this thing there [The blog post](http://seleniumworks.blogspot.ru/2014/02/eventfiringwebdriver.html).
+## WebDriverListener
-Here we were trying to improve existing drawbacks and restrictions using:
+Classes that implement this interface are intended to be used with EventFiringDecorator.
+This interface provides empty default implementation for all methods that do nothing.
+You could easily extend that interface to add more methods that you'd like to listen to.
+The strategy to add new/custom event listeners is the following. Let say there is a public `setOrientation`
+method in the target WebDriver instance. Then you'd have to add `beforeSetOrientation` and/or
+`afterSetOrientation` methods to your WebDriverListener descendant accepting single argument
+of `WebDriver` type. If the target method accepts one or more arguments then these arguments
+should also be added to the event listeners in the same order they are accepted by the original method,
+but the very first argument should still be the firing WebDriver instance.
-- API splitting, see above.
+_Important_: Make sure that your implementation of WebDriverListener class is public
+and that event listener methods are also public.
-- the binding of some [Spring framework engines](https://projects.spring.io/spring-framework/) with [AspectJ](https://en.wikipedia.org/wiki/AspectJ).
+## EventFiringDecorator
-# How to use
+This decorator creates a wrapper around an arbitrary WebDriver instance that notifies
+registered listeners about events happening in this WebDriver and derived objects,
+such as WebElements and Alert.
+Listeners should implement WebDriverListener. It supports three types of events:
+- "before"-event: a method is about to be called;
+- "after"-event: a method was called successfully and returned some result;
+- "error"-event: a method was called and thrown an exception.
-It is easy.
+To use this decorator you have to prepare a listener, create a decorator using this listener,
+decorate the original WebDriver instance with this decorator and use the new WebDriver instance
+created by the decorator instead of the original one:
```java
-import io.appium.java_client.events.api.general.AlertEventListener;
-
-public class AlertListener implements AlertEventListener {
-...
-}
-
-...
-import io.appium.java_client.events.api.general.ElementEventListener;
-
-public class ElementListener implements ElementEventListener {
-...
-}
-
-//and so on
-...
-import io.appium.java_client.events.EventFiringWebDriverFactory;
-import io.appium.java_client.events.api.Listener;
-...
-
-AndroidDriver driver = new AndroidDriver(parameters);
-driver = EventFiringWebDriverFactory.getEventFiringWebDriver(driver, new AlertListener(),
- new ElementListener());
-
-//or
-AndroidDriver driver2 = new AndroidDriver(parameters);
-List listeners = new ArrayList<>();
-listeners.add(new AlertListener());
-listeners.add(new ElementListener());
-driver = EventFiringWebDriverFactory.getEventFiringWebDriver(driver2, listeners);
+WebDriver original = new AndroidDriver();
+// it is expected that MyListener class implements WebDriverListener
+// interface or its descendant
+WebDriverListener listener = new MyListener();
+WebDriver decorated = new EventFiringDecorator(listener).decorate(original);
+// the next call is going to fire:
+// - beforeAnyCall
+// - beforeAnyWebDriverCall
+// - beforeGet
+// - afterGet
+// - afterAnyWebDriverCall
+// - afterAnyCall
+// events in the listener instence (in this order)
+decorated.get("http://example.com/");
+// the next call is going to fire:
+// - beforeAnyCall
+// - beforeAnyWebDriverCall
+// - beforeFindElement
+// - afterFindElement
+// - afterAnyWebDriverCall
+// - afterAnyCall
+// events in the listener instence (in this order)
+WebElement header = decorated.findElement(By.tagName("h1"));
+// if an error happens during any of these calls the the onError event is fired
```
-## What if there are listeners which used everywhere by default.
-
-In order to avoid the repeating actions an end user is free to do these things:
-
-- create folders `/META-INF/services` and put the file `io.appium.java_client.events.api.Listener` there. Please read about
-[SPI](https://docs.oracle.com/javase/tutorial/sound/SPI-intro.html).
-
-
+The instance of WebDriver created by the decorator implements all the same interfaces
+as the original driver. A listener can subscribe to "specific" or "generic" events (or both).
+A "specific" event correspond to a single specific method, a "generic" event correspond to any
+method called in a class or in any class. To subscribe to a "specific" event a listener should
+implement a method with a name derived from the target method to be watched. The listener methods
+for "before"-events receive the parameters passed to the decorated method. The listener
+methods for "after"-events receive the parameters passed to the decorated method as well as the
+result returned by this method.
-- define the list of default listeners at the `io.appium.java_client.events.api.Listener`
+## createProxy API (since Java Client 8.3.0)
-
-
-And then it is enough
+This API is unique to Appium Java Client and does not exist in Selenium. The reason for
+its existence is the fact that the original event listeners API provided by Selenium is limited
+because it can only use interface types for decorator objects. For example, the code below won't
+work:
```java
-
-//and so on
-...
-import io.appium.java_client.events.EventFiringWebDriverFactory;
-...
-
-AndroidDriver driver = new AndroidDriver(parameters);
-driver = EventFiringWebDriverFactory.getEventFiringWebDriver(driver);
+IOSDriver driver = new IOSDriver(new URL("http://doesnot.matter/"), new ImmutableCapabilities())
+{
+ @Override
+ protected void startSession(Capabilities capabilities)
+ {
+ // Override in a sake of simplicity to avoid the actual session start
+ }
+};
+WebDriverListener webDriverListener = new WebDriverListener()
+{
+};
+IOSDriver decoratedDriver = (IOSDriver) new EventFiringDecorator(IOSDriver.class, webDriverListener).decorate(
+ driver);
```
-If there are listeners defined externally when this collection is merged with default set of listeners.
+The last line throws `ClassCastException` because `decoratedDriver` is of type `IOSDriver`,
+which is a class rather than an interface.
+See the issue [#1694](https://github.com/appium/java-client/issues/1694) for more
+details. In order to workaround this limitation a special proxy implementation has been created,
+which is capable of decorating class types:
-# How to reuse customized WebDriverEventListener
+```java
+import io.appium.java_client.proxy.MethodCallListener;
+import io.appium.java_client.proxy.NotImplementedException;
-If an end user has their own `org.openqa.selenium.support.events.WebDriverEventListener` implementation then in order to
-make it compatible with this engine it is enough to do the following.
+import static io.appium.java_client.proxy.Helpers.createProxy;
+// ...
-```java
-import org.openqa.selenium.support.events.WebDriverEventListener;
-import io.appium.java_client.events.api.general.AppiumWebDriverEventListener;
+MethodCallListener listener = new MethodCallListener() {
+ @Override
+ public void beforeCall(Object target, Method method, Object[] args) {
+ if (!method.getName().equals("get")) {
+ throw new NotImplementedException();
+ }
+ acc.append("beforeCall ").append(method.getName()).append("\n");
+ }
-public class UsersWebDriverEventListener implements WebDriverEventListener, AppiumWebDriverEventListener {
-...
-}
+ @Override
+ public void afterCall(Object target, Method method, Object[] args, Object result) {
+ if (!method.getName().equals("get")) {
+ throw new NotImplementedException();
+ }
+ acc.append("afterCall ").append(method.getName()).append("\n");
+ }
+};
+
+IOSDriver decoratedDriver = createProxy(
+ IOSDriver.class,
+ new Object[] {new URL("http://localhost:4723/"), new XCUITestOptions()},
+ new Class[] {URL.class, Capabilities.class},
+ listener
+);
+
+decoratedDriver.get("http://example.com/");
+
+assertThat(acc.toString().trim()).isEqualTo(
+ String.join("\n",
+ "beforeCall get",
+ "afterCall get"
+ )
+);
```
-or just
+This proxy is not tied to WebDriver descendants and could be used to any classes that have
+**public** constructors. It also allows to intercept exceptions thrown by **public** class methods and/or
+change/replace the original methods behavior. It is important to know that callbacks are **not** invoked
+for methods derived from the standard `Object` class, like `toString` or `equals`.
+Check [unit tests](../src/test/java/io/appium/java_client/proxy/ProxyHelpersTest.java) for more examples.
-```java
-import io.appium.java_client.events.api.general.AppiumWebDriverEventListener;
+#### ElementAwareWebDriverListener
-public class UsersWebDriverEventListener implements AppiumWebDriverEventListener {
-...
-}
-```
-# Also
+A specialized MethodCallListener that listens to all method calls on a WebDriver instance and automatically wraps any returned RemoteWebElement (or list of elements) with a proxy. This enables your listener to intercept and react to method calls on both:
+
+- The driver itself (e.g., findElement, getTitle)
-As soon as Appium java client has *Java 8-style* API (methods with default implementation) there was provided the ability to get objects created by these interfaces (anonymous types) listenable. Also there is an option to make some objects (some single element that has been found, for example) listenable too.
+- Any elements returned by the driver (e.g., click, isSelected on a WebElement)
```java
-import static io.appium.java_client.events.EventFiringObjectFactory.getEventFiringObject;
-...
+import io.appium.java_client.ios.IOSDriver;
+import io.appium.java_client.ios.options.XCUITestOptions;
+import io.appium.java_client.proxy.ElementAwareWebDriverListener;
+import io.appium.java_client.proxy.Helpers;
+import io.appium.java_client.proxy.MethodCallListener;
-AppiumDriver appiumDriver = new AppiumDriver(parameters);
-FindsByAndroidUIAutomator findsByAndroidUIAutomator =
- new FindsByAndroidUIAutomator() {
- @Override
- public AndroidElement findElement(String by, String using) {
- return appiumDriver.findElement(String by, String using);
- }
+// ...
+
+final StringBuilder acc = new StringBuilder();
+var listener = new ElementAwareWebDriverListener() {
@Override
- public List findElements(String by, String using) {
- return appiumDriver.findElements(by, using);
+ public void beforeCall(Object target, Method method, Object[] args) {
+ acc.append("beforeCall ").append(method.getName()).append("\n");
}
};
-findsByAndroidUIAutomator =
- getEventFiringObject(findsByAndroidUIAutomator, appiumDriver, listeners);
+IOSDriver> decoratedDriver = createProxy(
+ IOSDriver.class,
+ new Object[]{new URL("http://localhost:4723/"), new XCUITestOptions()},
+ new Class[]{URL.class, Capabilities.class},
+ listener
+);
+
+WebElement element = decoratedDriver.findElement(By.id("button"));
+element::click;
+
+List elements = decoratedDriver.findElements(By.id("button"));
+elements.get(1).isSelected();
+
+assertThat(acc.toString().trim()).isEqualTo(
+ String.join("\n",
+ "beforeCall findElement",
+ "beforeCall click",
+ "beforeCall getSessionId",
+ "beforeCall getCapabilities",
+ "beforeCall getCapabilities",
+ "beforeCall findElements",
+ "beforeCall isSelected",
+ "beforeCall getSessionId",
+ "beforeCall getCapabilities",
+ "beforeCall getCapabilities"
+ )
+);
+
```
diff --git a/docs/The-starting-of-an-Android-app.md b/docs/The-starting-of-an-Android-app.md
deleted file mode 100644
index d65e4c20b..000000000
--- a/docs/The-starting-of-an-Android-app.md
+++ /dev/null
@@ -1,156 +0,0 @@
-# Steps:
-
-- you have to prepare environment for Android. [Details are provided here](http://appium.io/slate/en/master/?java#setup-(android))
-
-- it needs to launch the appium server. You can launch Appium desktop application. If you use the server installed via npm then
-
- _$ node **the_path_to_main.js_file** --arg1 value1 --arg2 value2_
-It is not necessary to use arguments. [The list of arguments](http://appium.io/slate/en/master/?java#appium-server-arguments)
-
-
-# The starting of an app
-
-It looks like creation of a common [RemoteWebDriver](https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/remote/RemoteWebDriver.html) instance.
-
-[Common capabilities](http://appium.io/slate/en/master/?java#the---default-capabilities-flag)
-
-[Android-specific capabilities](http://appium.io/slate/en/master/?java#android-only)
-
-[Common capabilities provided by Java client](http://appium.github.io/java-client/io/appium/java_client/remote/MobileCapabilityType.html)
-
-[Android-specific capabilities provided by Java client](http://appium.github.io/java-client/io/appium/java_client/remote/AndroidMobileCapabilityType.html)
-
-```java
-import java.io.File;
-import org.openqa.selenium.remote.DesiredCapabilities;
-import io.appium.java_client.AppiumDriver;
-import io.appium.java_client.android.AndroidDriver;
-import io.appium.java_client.MobileElement;
-import java.net.URL;
-
-...
-File app = new File("The absolute or relative path to an *.apk file");
-DesiredCapabilities capabilities = new DesiredCapabilities();
-capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "Android Emulator");
-capabilities.setCapability(MobileCapabilityType.APP, app.getAbsolutePath());
-capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, MobilePlatform.ANDROID);
-//you are free to set additional capabilities
-AppiumDriver driver = new AppiumDriver<>(
-new URL("http://target_ip:used_port/wd/hub"), //if it needs to use locally started server
-//then the target_ip is 127.0.0.1 or 0.0.0.0
-//the default port is 4723
-capabilities);
-```
-
-or
-
-```java
-import java.io.File;
-import org.openqa.selenium.remote.DesiredCapabilities;
-import io.appium.java_client.AppiumDriver;
-import io.appium.java_client.MobileElement;
-import java.net.URL;
-
-...
-File app = new File("The absolute or relative path to an *.apk file");
-DesiredCapabilities capabilities = new DesiredCapabilities();
-capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "Android Emulator");
-capabilities.setCapability(MobileCapabilityType.APP, app.getAbsolutePath());
-//you are free to set additional capabilities
-AppiumDriver driver = new AndroidDriver<>(
-new URL("http://target_ip:used_port/wd/hub"), //if it needs to use locally started server
-//then the target_ip is 127.0.0.1 or 0.0.0.0
-//the default port is 4723
-capabilities);
-```
-
-
-## If it needs to start browser then
-
-This capability should be used
-
-```java
-capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, MobileBrowserType.CHROME);
-//if it is necessary to use the default Android browser then MobileBrowserType.BROWSER
-//is your choice
-```
-
-## There are three automation types
-
-```java
-capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, AutomationName.SELENDROID);
-```
-
-This automation type is usually recommended for old versions (<4.2) of Android.
-
-Default Android UIAutomator does not require any specific capability. However you can
-```java
-capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, AutomationName.APPIUM);
-```
-
-You have to define this automation type to be able to use Android UIAutomator2 for new Android versions
-```java
-capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, AutomationName.ANDROID_UIAUTOMATOR2);
-```
-
-# Possible cases
-
-You can use ```io.appium.java_client.AppiumDriver``` and ```io.appium.java_client.android.AndroidDriver``` as well. The main difference
-is that ```AndroidDriver``` implements all API that describes interaction with Android native/hybrid app. ```AppiumDriver``` allows to
-use Android-specific API eventually.
-
- _The sample of the activity starting by_ ```io.appium.java_client.AppiumDriver```
-
- ```java
- import io.appium.java_client.android.StartsActivity;
- import io.appium.java_client.android.Activity;
-
-...
-
-StartsActivity startsActivity = new StartsActivity() {
- @Override
- public Response execute(String driverCommand, Map parameters) {
- return driver.execute(driverCommand, parameters);
- }
-
- @Override
- public Response execute(String driverCommand) {
- return driver.execute(driverCommand);
- }
-};
-
-Activity activity = new Activity("app package goes here", "app activity goes here")
- .setWaitAppPackage("app wait package goes here");
- .setWaitAppActivity("app wait activity goes here");
-StartsActivity startsActivity.startActivity(activity);
- ```
-
-_Samples of the searching by AndroidUIAutomator using_ ```io.appium.java_client.AppiumDriver```
-
-```java
-import io.appium.java_client.FindsByAndroidUIAutomator;
-import io.appium.java_client.android.AndroidElement;
-
-...
-
-FindsByAndroidUIAutomator findsByAndroidUIAutomator =
- new FindsByAndroidUIAutomator() {
- @Override
- public AndroidElement findElement(String by, String using) {
- return driver.findElement(by, using);
- }
-
- @Override
- public List findElements(String by, String using) {
- return driver.findElements(by, using);
- };
-};
-
-findsByAndroidUIAutomator.findElementByAndroidUIAutomator("automatorString");
-```
-
-```java
-driver.findElement(MobileBy.AndroidUIAutomator("automatorString"));
-```
-
-All that ```AndroidDriver``` can do by design.
diff --git a/docs/The-starting-of-an-app-using-Appium-node-server-started-programmatically.md b/docs/The-starting-of-an-app-using-Appium-node-server-started-programmatically.md
index 6e75bc93b..9397385c5 100644
--- a/docs/The-starting-of-an-app-using-Appium-node-server-started-programmatically.md
+++ b/docs/The-starting-of-an-app-using-Appium-node-server-started-programmatically.md
@@ -1,35 +1,11 @@
# Requirements
-- Installed Node.js 4 or greater.
+- Installed Node.js 7 or greater.
- At least an appium server instance installed via __npm__.
# The basic principle.
-It works the similar way as common [ChromeDriver](https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/chrome/ChromeDriver.html), [InternetExplorerDriver](https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/ie/InternetExplorerDriver.html) of Selenium project or [PhantomJSDriver](http://cdn.ivandemarino.me/phantomjsdriver-javadoc/org/openqa/selenium/phantomjs/PhantomJSDriver.html). They use subclasses of the [DriverService](https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/remote/service/DriverService.html).
-
-# Which capabilities this feature provides
-
-This feature provides abilities and options of the starting of a local Appium node server. End users still able to open apps as usual
-
-```java
- DesiredCapabilities capabilities = new DesiredCapabilities();
- capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, "");
- capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "Android Emulator");
- capabilities.setCapability(MobileCapabilityType.APP, app.getAbsolutePath());
- capabilities.setCapability(MobileCapabilityType.NEW_COMMAND_TIMEOUT, 120);
- driver = new AndroidDriver<>(new URL("remoteOrLocalAddress"), capabilities);
-```
-
-when the server is launched locally\remotely. Also user is free to launch a local Appium node server and open their app for the further testing the following way:
-
-```java
- DesiredCapabilities capabilities = new DesiredCapabilities();
- capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, "");
- capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "Android Emulator");
- capabilities.setCapability(MobileCapabilityType.APP, app.getAbsolutePath());
- capabilities.setCapability(MobileCapabilityType.NEW_COMMAND_TIMEOUT, 120);
- driver = new AndroidDriver<>(capabilities);
-```
+It works the similar way as common [ChromeDriver](https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/chrome/ChromeDriver.html), [InternetExplorerDriver](https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/ie/InternetExplorerDriver.html) of Selenium project or [PhantomJSDriver](https://cdn.rawgit.com/detro/ghostdriver/master/binding/java/docs/javadoc/org/openqa/selenium/phantomjs/PhantomJSDriver.html). They use subclasses of the [DriverService](https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/remote/service/DriverService.html).
# How to prepare the local service before the starting
@@ -49,6 +25,7 @@ when the server is launched locally\remotely. Also user is free to launch a loca
### FYI
There are possible problems related to local environment which could break this:
+
```java
AppiumDriverLocalService service = AppiumDriverLocalService.buildDefaultService();
```
@@ -148,7 +125,7 @@ import java.io.File;
...
//appiumJS is the full or relative path to
-//the appium.js (v<=1.4.16) or maim.js (v>=1.5.0)
+//the appium.js (v<=1.4.16) or main.js (v>=1.5.0)
new AppiumServiceBuilder().withAppiumJS(new File(appiumJS));
```
diff --git a/docs/The-starting-of-an-iOS-app.md b/docs/The-starting-of-an-iOS-app.md
deleted file mode 100644
index d126f8333..000000000
--- a/docs/The-starting-of-an-iOS-app.md
+++ /dev/null
@@ -1,122 +0,0 @@
-# Steps:
-
-- you have to prepare environment for iOS. [Details are provided here](http://appium.io/slate/en/master/?ruby#system-setup-(ios))
-
-- it needs to launch the appium server. You can launch Appium desktop application. If you use the server installed via npm then
-
- _$ node **the_path_to_js_file** --arg1 value1 --arg2 value2_
-It is not necessary to use arguments. [The list of arguments](http://appium.io/slate/en/master/?java#appium-server-arguments)
-
-# The starting of an app
-
-It looks like creation of a common [RemoteWebDriver](https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/remote/RemoteWebDriver.html) instance.
-
-[Common capabilities](http://appium.io/slate/en/master/?ruby#the---default-capabilities-flag)
-
-[iOS-specific capabilities](http://appium.io/slate/en/master/?ruby#ios-only)
-
-[Common capabilities provided by Java client](http://appium.github.io/java-client/io/appium/java_client/remote/MobileCapabilityType.html)
-
-[iOS-specific capabilities provided by Java client](http://appium.github.io/java-client/io/appium/java_client/remote/IOSMobileCapabilityType.html)
-
-
-```java
-import java.io.File;
-import org.openqa.selenium.remote.DesiredCapabilities;
-import io.appium.java_client.AppiumDriver;
-import io.appium.java_client.MobileElement;
-import java.net.URL;
-
-...
-File app = new File("The absolute or relative path to an *.app, *.zip or ipa file");
-DesiredCapabilities capabilities = new DesiredCapabilities();
-capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "iPhone Simulator");
-capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "The_target_version");
-capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, MobilePlatform.IOS);
-//The_target_version is the supported iOS version, e.g. 8.1, 8.2, 9.2 etc
-capabilities.setCapability(MobileCapabilityType.APP, app.getAbsolutePath());
-//you are free to set additional capabilities
-AppiumDriver driver = new AppiumDriver<>(
-new URL("http://target_ip:used_port/wd/hub"), //if it needs to use locally started server
-//then the target_ip is 127.0.0.1 or 0.0.0.0
-//the default port is 4723
-capabilities);
-```
-
-or
-
-```java
-import java.io.File;
-import org.openqa.selenium.remote.DesiredCapabilities;
-import io.appium.java_client.AppiumDriver;
-import io.appium.java_client.ios.IOSDriver;
-import io.appium.java_client.MobileElement;
-import java.net.URL;
-
-...
-File app = new File("The absolute or relative path to an *.app, *.zip or ipa file");
-DesiredCapabilities capabilities = new DesiredCapabilities();
-capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "iPhone Simulator");
-capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "The_target_version");
-//The_target_version is the supported iOS version, e.g. 8.1, 8.2, 9.2 etc
-capabilities.setCapability(MobileCapabilityType.APP, app.getAbsolutePath());
-//you are free to set additional capabilities
-AppiumDriver driver = new IOSDriver<>(
-new URL("http://target_ip:used_port/wd/hub"), //if it needs to use locally started server
-//then the target_ip is 127.0.0.1 or 0.0.0.0
-//the default port is 4723
-capabilities);
-```
-
-## If it needs to start browser then
-
-```java
-capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, MobileBrowserType.SAFARI);
-```
-
-## There are two automation types
-
-Default iOS Automation (v < iOS 10.x) does not require any specific capability. However you can
-```java
-capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, AutomationName.APPIUM);
-```
-
-You have to define this automation type to be able to use XCUIT mode for new iOS versions (v > 10.x)
-```java
-capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, AutomationName.IOS_XCUI_TEST);
-```
-
-# Possible cases
-
-You can use ```io.appium.java_client.AppiumDriver``` and ```io.appium.java_client.ios.IOSDriver``` as well. The main difference
-is that ```IOSDriver``` implements all API that describes interaction with iOS native/hybrid app. ```AppiumDriver``` allows to
-use iOS-specific API eventually.
-
-_Samples of the searching by iOSNsPredicateString using_ ```io.appium.java_client.AppiumDriver```
-
-```java
-import io.appium.java_client.FindsByIosNSPredicate;
-import io.appium.java_client.ios.IOSElement;
-
-...
-
-FindsByIosNSPredicate findsByIosNSPredicate = new FindsByIosNSPredicate() {
- @Override
- public IOSElement findElement(String by, String using) {
- return driver.findElement(by, using);
- }
-
- @Override
- public List findElements(String by, String using) {
- return driver.findElements(by, using);
- }
-};
-
-findsByIosNSPredicate.findElementByIosNsPredicate("some predicate");
-```
-
-```java
-driver.findElement(MobileBy.iOSNsPredicateString("some predicate"));
-```
-
-All that ```IOSDriver``` can do by design.
diff --git a/docs/Touch-actions.md b/docs/Touch-actions.md
deleted file mode 100644
index 920a8d898..000000000
--- a/docs/Touch-actions.md
+++ /dev/null
@@ -1,44 +0,0 @@
-Appium server side provides abilities to emulate touch actions. It is possible construct single, complex and multiple touch actions.
-
-# How to use a single touch action
-
-```java
-import io.appium.java_client.TouchAction;
-
-...
-//tap
-new TouchAction(driver)
- .tap(driver
- .findElementById("io.appium.android.apis:id/start")).perform();
-```
-
-# How to construct complex actions
-
-```java
-import io.appium.java_client.TouchAction;
-
-...
-//swipe
-TouchAction swipe = new TouchAction(driver).press(images.get(2), -10, center.y - location.y)
- .waitAction(2000).moveTo(gallery, 10, center.y - location.y).release();
-swipe.perform();
-```
-
-# How to construct multiple touch action.
-
-```java
-import io.appium.java_client.TouchAction;
-import io.appium.java_client.MultiTouchAction;
-
-...
-//tap by few fingers
- MultiTouchAction multiTouch = new MultiTouchAction(driver);
-
-for (int i = 0; i < fingers; i++) {
- TouchAction tap = new TouchAction(driver);
- multiTouch.add(tap.press(element).waitAction(duration).release());
-}
-
-multiTouch.perform();
-```
-
diff --git a/docs/environment.md b/docs/environment.md
new file mode 100644
index 000000000..a08a6ea6e
--- /dev/null
+++ b/docs/environment.md
@@ -0,0 +1,35 @@
+# Appium Environment Troubleshooting
+
+Quite often there are questions about why Appium throws an error about missing environment variable, for example `ANDROID_HOME`, or about missing binaries, like `idevice_id`, `carthage` or `java`.
+This article explains what might be a cause of such problem and how to resolve it.
+
+## Prerequisites
+
+In order to understand this topic you should know concept of environment variables, how it works in your operating system and how you can change the system environment if needed.
+In particular, it is important to know the meaning of `PATH` environment variable. Read https://en.wikipedia.org/wiki/Environment_variable and https://en.wikipedia.org/wiki/PATH_(variable) for more details.
+
+## How To Verify What Is Missing
+
+Appium itself is a NodeJS application and uses the same environment as its host `node` process. If you experience an error related to local environment setup then verify the actual process environment first.
+In Mac OS, for example, it is possible to do this via `ps eww ` command, where `PID` is the process identifier of the running Appium's host Node process.
+In Windows the [ProcessExplorer](https://docs.microsoft.com/sysinternals/downloads/process-explorer) utility can be used for such purpose.
+Then make sure the corresponding variable is there and it is set to a proper value, or, in case there is an error finding some binary, make sure the parent folder of this binary is present in `PATH` list, the binary itself on the local file system and can be executed manually.
+
+## How To Fix Missing Environment Variables
+
+Usually, if one starts Appium from the command line, then it inherits all the environment variables from the parent process (`bash`/`cmd`, etc.).
+This means that if you start Appium manually or with a script then make sure its parent process has all the necessary environment variables set to proper values.
+Use `env` command to check the currently defined environment variables of your *nix shell interpreter or `set` for cmd.exe shell in Windows.
+
+On *nix system you could add/edit environment variables of your shell either by using the `export` command (only works in scope of the current shell session) or by editing the appropriate shell config if it is necessary to keep the changes.
+The path to this config depends on the currently selected interpreter. Use `echo $SHELL` to figure out what your current interpreter is.
+Bash, for example, loads the config from `$HOME/.bashrc` or `$HOME/.bash_profile` and ZSH from `$HOME/.zshrc`.
+Remember to reload the config after it has been changed either by sourcing it (e.g. `source ~/.zshrc`) or by restarting the terminal session.
+
+On Windows, you could use the `set` command to add/change environment variables in scope of the current shell session or edit them in [system settings](https://www.java.com/en/download/help/path.xml) to keep the changes.
+Remember to reload the config after it has been changed by restarting the command prompt session.
+
+Also, it is possible to set variables on [per-process](https://stackoverflow.com/questions/10856129/setting-an-environment-variable-before-a-command-in-bash-not-working-for-second) basis.
+This might be handy if Appium is set up to start automatically with the operating system, because on early stages of system initialization it is possible that the "usual" environment has not been loaded yet.
+
+In case the Appium process is started programmatically, for example with java client's `AppiumDriverLocalService` helper class, then it might be necessary to setup the environment [in the client code](https://github.com/appium/java-client/pull/753), because prior to version 6.0 the client does not inherit it from the parent process by default.
diff --git a/docs/release.md b/docs/release.md
new file mode 100644
index 000000000..9a84ee016
--- /dev/null
+++ b/docs/release.md
@@ -0,0 +1,25 @@
+# Appium Java Client Release Procedure
+
+This document describes the process of releasing this client to the Maven repository.
+Its target auditory is project maintainers.
+
+## Release Steps
+
+1. Update the [Changelog](../CHANGELOG.md) for the given version based on previous commits.
+1. Bump the `appiumClient.version` number in [gradle.properties](../gradle.properties).
+1. Create a pull request to approve the changelog and version bump.
+1. Merge the pull request after it is approved.
+1. Create and push a new repository tag. The tag name should look like
+ `v..`.
+1. Create a new [Release](https://github.com/appium/java-client/releases/new) in GitHub.
+ Paste the above changelist into the release notes. Make sure the name of the new release
+ matches to the name of the above tag.
+1. Open [Maven Central Repository](https://central.sonatype.com/) in your browser.
+1. Log in to the `Maven Central Repository` using the credentials stored in 1Password. If you need access to the team's 1Password vault, contact the Appium maintainers.
+1. Navigate to the `Publish` section.
+1. Under `Deployments`, you will see the latest deployment being published. Note: Sometimes the status may remain in the `publishing` state for an extended period, but it will eventually complete.
+1. After the new release is published, it becomes available in
+ [Maven Central](https://repo1.maven.org/maven2/io/appium/java-client/)
+ within 30 minutes. Once artifacts are in Maven Central, it normally
+ takes 1-2 hours before they appear in
+ [search results](https://central.sonatype.com/artifact/io.appium/java-client).
diff --git a/docs/transitive-dependencies-management.md b/docs/transitive-dependencies-management.md
new file mode 100644
index 000000000..dc148d816
--- /dev/null
+++ b/docs/transitive-dependencies-management.md
@@ -0,0 +1,68 @@
+# Maven
+
+Maven downloads dependency of [the latest version](https://cwiki.apache.org/confluence/display/MAVENOLD/Dependency+Mediation+and+Conflict+Resolution#DependencyMediationandConflictResolution-DependencyVersionRanges)
+matching the declared range by default, in other words whenever new versions of Selenium 4 libraries are published
+they are pulled transitively as Appium Java Client dependencies at the first project (re)build automatically.
+
+In order to pin Selenium dependencies they should be declared in `pom.xml` in the following way:
+
+```xml
+
+
+ io.appium
+ java-client
+ X.Y.Z
+
+
+ org.seleniumhq.selenium
+ selenium-api
+
+
+ org.seleniumhq.selenium
+ selenium-remote-driver
+
+
+ org.seleniumhq.selenium
+ selenium-support
+
+
+
+
+ org.seleniumhq.selenium
+ selenium-api
+ A.B.C
+
+
+ org.seleniumhq.selenium
+ selenium-remote-driver
+ A.B.C
+
+
+ org.seleniumhq.selenium
+ selenium-support
+ A.B.C
+
+
+```
+
+# Gradle
+
+Gradle uses [Module Metadata](https://docs.gradle.org/current/userguide/publishing_gradle_module_metadata.html)
+to perform improved dependency resolution whenever it is available. Gradle Module Metadata for Appium Java Client is
+published automatically with every release and is available on Maven Central.
+
+Appium Java Client declares [preferred](https://docs.gradle.org/current/userguide/rich_versions.html#rich-version-constraints)
+Selenium dependencies version which is equal to the lowest boundary in the version range, i.e. the lowest compatible
+Selenium dependencies are pulled by Gradle by default. It's strictly recommended to do not use versions lower than the
+range boundary, because unresolvable compilation and runtime errors may occur.
+
+In order to use newer Selenium dependencies they should be explicitly added to Gradle build script (`build.gradle`):
+
+```gradle
+dependencies {
+ implementation('io.appium:java-client:X.Y.Z')
+ implementation('org.seleniumhq.selenium:selenium-api:A.B.C')
+ implementation('org.seleniumhq.selenium:selenium-remote-driver:A.B.C')
+ implementation('org.seleniumhq.selenium:selenium-support:A.B.C')
+}
+```
diff --git a/docs/v7-to-v8-migration-guide.md b/docs/v7-to-v8-migration-guide.md
new file mode 100644
index 000000000..b3be7def0
--- /dev/null
+++ b/docs/v7-to-v8-migration-guide.md
@@ -0,0 +1,129 @@
+This is the list of main changes between major versions 7 and 8 of Appium
+java client. This list should help you to successfully migrate your
+existing automated tests codebase.
+
+
+## Strict W3C specification compatibility
+
+- Java client now supports Selenium 4, which also means it is
+*strictly* W3C compliant. Old JWP-based servers are not supported
+anymore, and it won't be possible to use the new client version
+with them. Capabilities that enforce the usage of JWP protocol
+on Appium drivers don't have any effect anymore.
+- The recommended way to provide capabilities for driver creation is
+to use specific option builders inherited from
+[BaseOptions class](https://github.com/appium/java-client/blob/master/src/main/java/io/appium/java_client/remote/options/BaseOptions.java).
+For example
+[XCUITestOptions](https://github.com/appium/java-client/blob/master/src/main/java/io/appium/java_client/ios/options/XCUITestOptions.java)
+to create a XCUITest driver instance or
+[UiAutomator2Options](https://github.com/appium/java-client/blob/master/src/main/java/io/appium/java_client/android/options/UiAutomator2Options.java)
+to create an UiAutomator2 driver instance.
+If there is no driver-specific options class for your driver then either use
+`BaseOptions` builder as the base class to define your capabilities or request
+driver developers to add one. _Do not_ use `DesiredCapabilities` class for this purpose in W3C context.
+Check [unit tests](https://github.com/appium/java-client/blob/master/src/test/java/io/appium/java_client/drivers/options/OptionsBuildingTest.java)
+for more examples on how to build driver options.
+
+## Elements lookup
+
+- All `findBy*` shortcut methods were removed. Consider using
+`findElement[s](By. or AppiumBy.)` instead.
+- `MobileBy` class has been deprecated. Consider using
+[AppiumBy](https://github.com/appium/java-client/blob/master/src/main/java/io/appium/java_client/AppiumBy.java)
+instead.
+- All locator names in `AppiumBy` have been aligned to follow the common
+(camelCase) naming strategy, e.g. `MobileBy.AccessibilityId` was changed
+to `AppiumBy.accessibilityId`.
+- The changes made in Selenium 4 broke `class name` selector strategy in Appium.
+`AppiumBy.className` should be used instead of Selenium's `By.className` now.
+
+## Time
+
+- All methods that use TimeUnit class or where the time is passed as
+a simple numeric value were replaced with their alternatives using
+[java.time.Duration](https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html)
+class.
+
+## Events
+
+- The current event firing mechanism that Appium java client uses
+has been deprecated in favour of the one that Selenium 4 provides
+natively. Read [The-event_firing.md](The-event_firing.md) for more
+details on how to use it.
+
+## AppiumDriver
+
+- All `AppiumDriver` descendants and the base class itself are not generic
+anymore and work with `WebElement` interface only.
+- The base Appium driver does not extend `ContextAware`, `Rotatable` and other
+mobile-specific interfaces. Instead, it only has the very basic set of methods.
+Mobile specific extensions have been respectively moved to `IOSDriver` and
+`AndroidDriver`.
+- Removed the obsolete `HasSessionDetails` extensions as it was using legacy
+JWP calls to retrieve session details.
+- `DefaultGenericMobileDriver` class has been removed. Now `AppiumDriver` is
+inherited directly from Selenium's `RemoteWebDriver`.
+
+## MobileElement
+
+- `DefaultGenericMobileElement` class has been removed completely together
+with its descendants (`MobileElement`, `IOSElement`, `AndroidElement` etc.).
+Use `WebElement` instead.
+- Due to the above change the page factory is now only creating elements
+that are instantiated from `RemoteWebElement` and implement `WebElement` interface.
+- If you used some special methods that `MobileElement` or its descendants provided
+then change these:
+ - `replaceValue` has been moved to the corresponding `AndroidDriver`
+ instance and is called now `replaceElementValue`
+ - use `sendKeys` method of `WebElement` interface instead of `setValue`.
+
+## Touch Actions
+
+- The `TouchAction` and `MultiTouchAction` classes have been deprecated.
+The support of these actions will be removed from future Appium versions.
+Please use [W3C Actions](https://w3c.github.io/webdriver/#actions) instead
+or the corresponding extension methods for the driver (if available).
+Check
+ - https://www.youtube.com/watch?v=oAJ7jwMNFVU
+ - https://appiumpro.com/editions/30-ios-specific-touch-action-methods
+ - Android gesture shortcuts:
+ * [mobile: longClickGesture](https://github.com/appium/appium-uiautomator2-driver/blob/master/docs/android-mobile-gestures.md#mobile-longclickgesture)
+ * [mobile: doubleClickGesture](https://github.com/appium/appium-uiautomator2-driver/blob/master/docs/android-mobile-gestures.md#mobile-doubleclickgesture)
+ * [mobile: clickGesture](https://github.com/appium/appium-uiautomator2-driver/blob/master/docs/android-mobile-gestures.md#mobile-clickgesture)
+ * [mobile: dragGesture](https://github.com/appium/appium-uiautomator2-driver/blob/master/docs/android-mobile-gestures.md#mobile-draggesture)
+ * [mobile: flingGesture](https://github.com/appium/appium-uiautomator2-driver/blob/master/docs/android-mobile-gestures.md#mobile-flinggesture)
+ * [mobile: pinchOpenGesture](https://github.com/appium/appium-uiautomator2-driver/blob/master/docs/android-mobile-gestures.md#mobile-pinchopengesture)
+ * [mobile: pinchCloseGesture](https://github.com/appium/appium-uiautomator2-driver/blob/master/docs/android-mobile-gestures.md#mobile-pinchclosegesture)
+ * [mobile: swipeGesture](https://github.com/appium/appium-uiautomator2-driver/blob/master/docs/android-mobile-gestures.md#mobile-swipegesture)
+ * [mobile: scrollGesture](https://github.com/appium/appium-uiautomator2-driver/blob/master/docs/android-mobile-gestures.md#mobile-scrollgesture)
+ - iOS gesture shortcuts:
+ * [mobile: swipe](https://github.com/appium/appium-xcuitest-driver/blob/master/docs/execute-methods.md#mobile-swipe)
+ * [mobile: scroll](https://github.com/appium/appium-xcuitest-driver/blob/master/docs/execute-methods.md#mobile-scroll)
+ * [mobile: pinch](https://github.com/appium/appium-xcuitest-driver/blob/master/docs/execute-methods.md#mobile-pinch)
+ * [mobile: doubleTap](https://github.com/appium/appium-xcuitest-driver/blob/master/docs/execute-methods.md#mobile-doubletap)
+ * [mobile: touchAndHold](https://github.com/appium/appium-xcuitest-driver/blob/master/docs/execute-methods.md#mobile-touchandhold)
+ * [mobile: twoFingerTap](https://github.com/appium/appium-xcuitest-driver/blob/master/docs/execute-methods.md#mobile-twofingertap)
+ * [mobile: tap](https://github.com/appium/appium-xcuitest-driver/blob/master/docs/execute-methods.md#mobile-tap)
+ * [mobile: dragFromToForDuration](https://github.com/appium/appium-xcuitest-driver/blob/master/docs/execute-methods.md#mobile-dragfromtoforduration)
+ * [mobile: dragFromToWithVelocity](https://github.com/appium/appium-xcuitest-driver/blob/master/docs/execute-methods.md#mobile-dragfromtowithvelocity)
+ * [mobile: scrollToElement](https://github.com/appium/appium-xcuitest-driver/blob/master/docs/execute-methods.md#mobile-scrolltoelement)
+ - https://appiumpro.com/editions/29-automating-complex-gestures-with-the-w3c-actions-api
+for more details on how to properly apply W3C Actions to your automation context.
+
+## resetApp/launchApp/closeApp
+
+- AppiumDriver methods `resetApp`, `launchApp` and `closeApp` have been deprecated as
+they are going to be removed from future Appium versions. Check
+https://github.com/appium/appium/issues/15807 for more details.
+
+## AppiumDriverLocalService
+
+- The default URL the server is listening on has been changed, and it
+does not contain the `/wd/hub` suffix anymore (e.g. `http://0.0.0.0:4723/wd/hub`
+became `http://0.0.0.0:4723/`). This has been done in order
+to align the actual behavior with Appium v2. If you still would like to use
+v8 of the Java client with Appium v1.2x, where the server URL contains the `/wd/hub` suffix
+by default, then consider providing `--base-path` setting explicitly while
+building `AppiumServiceBuilder` instance (e.g. `.withArgument(GeneralServerFlag.BASEPATH, "/wd/hub/")`).
+Older versions of Appium server (v1.19 and older) won't work with `AppiumDriverLocalService`,
+because they don't allow provisioning of base path in form of a command line argument.
diff --git a/docs/v8-to-v9-migration-guide.md b/docs/v8-to-v9-migration-guide.md
new file mode 100644
index 000000000..a0b57cd35
--- /dev/null
+++ b/docs/v8-to-v9-migration-guide.md
@@ -0,0 +1,46 @@
+This is the list of main changes between major versions 8 and 9 of Appium
+java client. This list should help you to successfully migrate your
+existing automated tests codebase.
+
+
+## The support for Java compilers below version 11 has been dropped
+
+- The minimum supported Java version is now 11. The library won't work
+with Java compilers below this version.
+
+## The minimum supported Selenium version is set to 4.14.1
+
+- Selenium versions below 4.14.1 won't work with Appium java client 9+.
+Check the [Compatibility Matrix](../README.md#compatibility-matrix) for more
+details about versions compatibility.
+
+## Removed previously deprecated items
+
+- `MobileBy` class has been removed. Use
+[AppiumBy](../src/main/java/io/appium/java_client/AppiumBy.java) instead
+- `launchApp`, `resetApp` and `closeApp` methods along with their
+`SupportsLegacyAppManagement` container.
+Use [the corresponding extension methods](https://github.com/appium/appium/issues/15807) instead.
+- `WindowsBy` class and related location strategies.
+- `ByAll` class has been removed in favour of the same class from Selenium lib.
+- `AndroidMobileCapabilityType` interface. Use
+[UIAutomator2 driver options](../src/main/java/io/appium/java_client/android/options/UiAutomator2Options.java)
+or [Espresso driver options](../src/main/java/io/appium/java_client/android/options/EspressoOptions.java) instead.
+- `IOSMobileCapabilityType` interface. Use
+[XCUITest driver options](../src/main/java/io/appium/java_client/ios/options/XCUITestOptions.java) instead.
+- `MobileCapabilityType` interface. Use
+[driver options](../src/main/java/io/appium/java_client/remote/options/BaseOptions.java) instead.
+- `MobileOptions` class. Use
+[driver options](../src/main/java/io/appium/java_client/remote/options/BaseOptions.java) instead.
+- `YouiEngineCapabilityType` interface. Use
+[driver options](../src/main/java/io/appium/java_client/remote/options/BaseOptions.java) instead.
+- Several misspelled methods. Use properly spelled alternatives instead.
+- `startActivity` method from AndroidDriver. Use
+[mobile: startActivity](https://github.com/appium/appium-uiautomator2-driver#mobile-startactivity)
+extension method instead.
+- `APPIUM` constant from the AutomationName interface. It is not needed anymore.
+- `PRE_LAUNCH` value from the GeneralServerFlag enum. It is not needed anymore.
+
+## Moved items
+
+- `AppiumUserAgentFilter` class to `io.appium.java_client.internal.filters` package.
diff --git a/docs/v9-to-v10-migration-guide.md b/docs/v9-to-v10-migration-guide.md
new file mode 100644
index 000000000..40f7e89fe
--- /dev/null
+++ b/docs/v9-to-v10-migration-guide.md
@@ -0,0 +1,17 @@
+This is the list of main changes between major versions 9 and 10 of Appium
+java client. This list should help you to successfully migrate your
+existing automated tests codebase.
+
+
+## The minimum supported Selenium version is set to 4.35.0
+
+- Selenium versions below 4.35.0 won't work with Appium java client 10+.
+Check the [Compatibility Matrix](../README.md#compatibility-matrix) for more
+details about versions compatibility.
+
+## Removed previously deprecated items
+
+- `org.openqa.selenium.remote.html5.RemoteLocationContext`, `org.openqa.selenium.html5.Location` and
+ `org.openqa.selenium.html5.LocationContext` imports have been removed since they don't exist
+ in Selenium lib anymore. Use appropriate replacements from this library instead for APIs and
+ interfaces that were using deprecated classes, like `io.appium.java_client.Location`.
diff --git a/gradle.properties b/gradle.properties
index 34d114d1c..19ebf202f 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,8 +1,5 @@
org.gradle.daemon=true
-signing.keyId=YourKeyId
-signing.password=YourPublicKeyPassword
-signing.secretKeyRingFile=PathToYourKeyRingFile
-
-ossrhUsername=your-jira-id
-ossrhPassword=your-jira-password
+selenium.version=4.36.0
+# Please increment the value in a release
+appiumClient.version=10.0.0
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index d3b83982b..8bdaf60c7 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 13c1c1002..a35649f5f 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,7 @@
-#Sat Jul 23 20:09:50 IST 2016
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-all.zip
+networkTimeout=10000
+validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-bin.zip
diff --git a/gradlew b/gradlew
index 27309d923..ef07e0162 100755
--- a/gradlew
+++ b/gradlew
@@ -1,78 +1,129 @@
-#!/usr/bin/env bash
+#!/bin/sh
+
+#
+# Copyright © 2015 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+#
##############################################################################
-##
-## Gradle start up script for UN*X
-##
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
##############################################################################
# Attempt to set APP_HOME
+
# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
+APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
+MAX_FD=maximum
-warn ( ) {
+warn () {
echo "$*"
-}
+} >&2
-die ( ) {
+die () {
echo
echo "$*"
echo
exit 1
-}
+} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
- NONSTOP* )
- nonstop=true
- ;;
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
esac
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+CLASSPATH="\\\"\\\""
+
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
+ JAVACMD=$JAVA_HOME/jre/sh/java
else
- JAVACMD="$JAVA_HOME/bin/java"
+ JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -81,84 +132,120 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
- JAVACMD="java"
- which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+ JAVACMD=java
+ if ! command -v java >/dev/null 2>&1
+ then
+ die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
+ fi
fi
# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
+ esac
fi
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
- JAVACMD=`cygpath --unix "$JAVACMD"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
fi
- i=$((i+1))
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
done
- case $i in
- (0) set -- ;;
- (1) set -- "$args0" ;;
- (2) set -- "$args0" "$args1" ;;
- (3) set -- "$args0" "$args1" "$args2" ;;
- (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
- esac
fi
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
- JVM_OPTS=("$@")
-}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Collect all arguments for the java command:
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
+# and any embedded shellness will be escaped.
+# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
+# treated as '${Hostname}' itself on the command line.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
+ "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+ die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
index f6d5974e7..5eed7ee84 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -1,4 +1,22 @@
-@if "%DEBUG%" == "" @echo off
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+@rem SPDX-License-Identifier: Apache-2.0
+@rem
+
+@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@@ -9,25 +27,29 @@
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
+if %ERRORLEVEL% equ 0 goto execute
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
goto fail
@@ -35,54 +57,36 @@ goto fail
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-if exist "%JAVA_EXE%" goto init
+if exist "%JAVA_EXE%" goto execute
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
goto fail
-:init
-@rem Get command-line arguments, handling Windows variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
-
:execute
@rem Setup the command line
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+set CLASSPATH=
+
@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
:end
@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
+if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
diff --git a/jitpack.yml b/jitpack.yml
new file mode 100644
index 000000000..e5b145a9d
--- /dev/null
+++ b/jitpack.yml
@@ -0,0 +1,4 @@
+jdk:
+ - openjdk11
+install:
+ - ./gradlew clean build publishToMavenLocal -PsigningDisabled=true
diff --git a/src/test/java/io/appium/java_client/android/AndroidAppStringsTest.java b/src/e2eAndroidTest/java/io/appium/java_client/android/AndroidAppStringsTest.java
similarity index 91%
rename from src/test/java/io/appium/java_client/android/AndroidAppStringsTest.java
rename to src/e2eAndroidTest/java/io/appium/java_client/android/AndroidAppStringsTest.java
index 87eafb978..e3fefd9b0 100644
--- a/src/test/java/io/appium/java_client/android/AndroidAppStringsTest.java
+++ b/src/e2eAndroidTest/java/io/appium/java_client/android/AndroidAppStringsTest.java
@@ -16,9 +16,9 @@
package io.appium.java_client.android;
-import static org.junit.Assert.assertNotEquals;
+import org.junit.jupiter.api.Test;
-import org.junit.Test;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
public class AndroidAppStringsTest extends BaseAndroidTest {
diff --git a/src/e2eAndroidTest/java/io/appium/java_client/android/AndroidBiDiTest.java b/src/e2eAndroidTest/java/io/appium/java_client/android/AndroidBiDiTest.java
new file mode 100644
index 000000000..9901b50d6
--- /dev/null
+++ b/src/e2eAndroidTest/java/io/appium/java_client/android/AndroidBiDiTest.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * See the NOTICE file distributed with this work for additional
+ * information regarding copyright ownership.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.appium.java_client.android;
+
+import org.junit.jupiter.api.Test;
+import org.openqa.selenium.bidi.Event;
+import org.openqa.selenium.bidi.log.LogEntry;
+import org.openqa.selenium.bidi.module.LogInspector;
+
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import static io.appium.java_client.HasBrowserCheck.NATIVE_CONTEXT;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+
+public class AndroidBiDiTest extends BaseAndroidTest {
+
+ @Test
+ public void listenForAndroidLogsGeneric() {
+ var logs = new CopyOnWriteArrayList<>();
+ var listenerId = driver.getBiDi().addListener(
+ NATIVE_CONTEXT,
+ new Event