name: Functional Tests on: # Run by manual at this time workflow_dispatch: pull_request: branches: [ master ] concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true env: APPIUM_TEST_SERVER_PORT: '4723' APPIUM_TEST_SERVER_HOST: '127.0.0.1' PYTHONUNBUFFERED: 1 jobs: ios_test: strategy: fail-fast: false matrix: test_targets: - target: test/functional/ios/safari_tests.py name: func_test_ios1 runs-on: macos-15 # Please make sure the available Xcode versions and iOS versions # on the runner images. https://github.com/actions/runner-images env: XCODE_VERSION: '16.4' IOS_VERSION: '18.5' IPHONE_MODEL: 'iPhone 16 Plus' PREBUILT_WDA_PATH: ${{ github.workspace }}/wda/WebDriverAgentRunner-Runner.app steps: - uses: actions/checkout@v6 - name: Install Node.js uses: actions/setup-node@v6 with: node-version: 'lts/*' - name: Select Xcode uses: maxim-lobanov/setup-xcode@v1 with: xcode-version: ${{ env.XCODE_VERSION }} - name: Install Appium and drivers run: | npm install -g appium appium driver install xcuitest appium driver run xcuitest download-wda-sim --platform=ios --outdir=$(dirname "$PREBUILT_WDA_PATH") - name: Start Appium server uses: ./.github/actions/setup-appium-server with: port: ${{ env.APPIUM_TEST_SERVER_PORT }} host: ${{ env.APPIUM_TEST_SERVER_HOST }} server_args: '--relaxed-security' - name: Start iOS Simulator UI run: | defaults write com.apple.iphonesimulator PasteboardAutomaticSync -bool false open -Fn "$(xcode-select --print-path)/Applications/Simulator.app" - name: Prepare iOS simulator uses: futureware-tech/simulator-action@v5 with: model: ${{ env.IPHONE_MODEL }} os_version: ${{ env.IOS_VERSION }} wait_for_boot: true shutdown_after_job: false - name: Finalize iOS simulator boot run: xcrun --sdk iphonesimulator --show-sdk-version - name: Set up Python uses: actions/setup-python@v6 with: python-version: 3.14 - name: Cache uv modules uses: actions/cache@v5 with: path: | ~/.cache/uv .venv key: ${{ runner.os }}-uv-shared-${{ hashFiles('**/uv.lock') }} restore-keys: | ${{ runner.os }}-uv-shared- - name: Install uv run: make install-uv - name: Run Tests run: | uv run pytest -v ${{ matrix.test_targets.target}} \ --doctest-modules \ --junitxml=junit/test-results.xml \ --cov=com \ --cov-report=xml \ --cov-report=html env: LOCAL_PREBUILT_WDA: ${{ env.PREBUILT_WDA_PATH }} - name: Save server output if: ${{ always() }} uses: actions/upload-artifact@master with: name: appium-ios-${{matrix.test_targets.name}}.log path: appium.log android_test: strategy: fail-fast: false matrix: test_targets: - target: test/functional/android/appium_service_tests.py test/functional/android/chrome_tests.py test/functional/android/bidi_tests.py name: func_test_android1 runs-on: ubuntu-latest env: API_LEVEL: 29 ARCH: x86 steps: - uses: actions/checkout@v6 - uses: actions/setup-java@v5 with: distribution: 'temurin' java-version: '17' - name: Install ffmpeg run: | sudo apt-get update sudo apt-get install -y ffmpeg - name: Install Node.js uses: actions/setup-node@v6 with: node-version: 'lts/*' - name: Install Appium and drivers run: | npm install -g appium appium driver install uiautomator2 appium driver install espresso appium plugin install execute-driver - name: Start Appium server uses: ./.github/actions/setup-appium-server with: port: ${{ env.APPIUM_TEST_SERVER_PORT }} host: ${{ env.APPIUM_TEST_SERVER_HOST }} server_args: '--relaxed-security --use-plugins=execute-driver' - name: Enable KVM group perms 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: AVD cache uses: actions/cache@v5 id: avd-cache with: path: | ~/.android/avd/* ~/.android/adb* key: avd-${{ env.API_LEVEL }} - name: Create AVD and generate snapshot for caching if: steps.avd-cache.outputs.cache-hit != 'true' uses: reactivecircus/android-emulator-runner@v2 with: api-level: ${{ env.API_LEVEL }} arch: ${{ env.ARCH }} target: google_apis force-avd-creation: false emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none disable-animations: false script: echo "Generated AVD snapshot for caching." - name: Set up Python 3.14 uses: actions/setup-python@v6 with: python-version: 3.14 - name: Cache uv modules uses: actions/cache@v5 with: path: | ~/.cache/uv .venv key: ${{ runner.os }}-uv-shared-${{ hashFiles('**/uv.lock') }} restore-keys: | ${{ runner.os }}-uv-shared- - name: Run tests uses: reactivecircus/android-emulator-runner@v2 with: api-level: ${{ env.API_LEVEL }} arch: ${{ env.ARCH }} script: | make install-uv uv run pytest -v ${{ matrix.test_targets.target}} --doctest-modules --junitxml=junit/test-results.xml --cov=com --cov-report=xml --cov-report=html target: google_apis profile: Nexus 5X disable-spellchecker: true disable-animations: true env: ANDROID_SDK_VERSION: ${{ env.API_LEVEL }} APPIUM_DRIVER: ${{matrix.test_targets.automation_name}} IGNORE_VERSION_SKIP: true CI: true - name: Save server output if: ${{ always() }} uses: actions/upload-artifact@master with: name: appium-android-${{matrix.test_targets.name}}.log path: appium.log flutter_e2e_test: # These flutter integration driver tests are maintained by: MummanaSubramanya strategy: fail-fast: false matrix: include: - platform: macos-15 e2e-tests: flutter-ios - platform: ubuntu-latest e2e-tests: flutter-android runs-on: ${{ matrix.platform }} env: API_LEVEL: 28 ARCH: x86 CI: true XCODE_VERSION: 16.4 IOS_VERSION: 18.5 IPHONE_MODEL: iPhone 16 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 steps: - uses: actions/checkout@v6 - uses: actions/setup-java@v5 if: matrix.e2e-tests == 'flutter-android' with: distribution: 'zulu' java-version: '17' - name: Enable KVM group perms if: 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 Python 3.14 uses: actions/setup-python@v6 with: python-version: 3.14 - name: Install Node.js uses: actions/setup-node@v6 with: node-version: 'lts/*' - name: Select Xcode if: matrix.e2e-tests == 'flutter-ios' uses: maxim-lobanov/setup-xcode@v1 with: xcode-version: ${{ env.XCODE_VERSION }} - name: Install Appium and drivers if: matrix.e2e-tests == 'flutter-android' run: | npm install --location=global appium appium driver install uiautomator2 appium driver install appium-flutter-integration-driver --source npm - name: Install Appium and drivers if: matrix.e2e-tests == 'flutter-ios' run: | npm install --location=global appium appium driver install xcuitest appium driver run xcuitest download-wda-sim --platform=ios --outdir=$(dirname "$PREBUILT_WDA_PATH") appium driver install appium-flutter-integration-driver --source npm - name: Start Appium server uses: ./.github/actions/setup-appium-server with: port: ${{ env.APPIUM_TEST_SERVER_PORT }} host: ${{ env.APPIUM_TEST_SERVER_HOST }} server_args: '--relaxed-security' log_file: appium-${{ matrix.e2e-tests }}.log - name: Cache uv modules uses: actions/cache@v5 with: path: | ~/.cache/uv .venv key: ${{ runner.os }}-uv-shared-${{ hashFiles('**/uv.lock') }} restore-keys: | ${{ runner.os }}-uv-shared- - name: Run Android tests if: matrix.e2e-tests == 'flutter-android' uses: reactivecircus/android-emulator-runner@v2 with: api-level: ${{ env.API_LEVEL }} script: | make install-uv uv run pytest -v test/functional/flutter_integration/*_test.py --doctest-modules --junitxml=junit/test-results.xml --cov=com --cov-report=xml --cov-report=html target: default disable-spellchecker: true disable-animations: true - name: Start iOS Simulator UI if: matrix.e2e-tests == 'flutter-ios' run: | defaults write com.apple.iphonesimulator PasteboardAutomaticSync -bool false open -Fn "$(xcode-select --print-path)/Applications/Simulator.app" - uses: futureware-tech/simulator-action@v5 if: matrix.e2e-tests == 'flutter-ios' with: # https://github.com/actions/runner-images/blob/main/images/macos/macos-14-arm64-Readme.md model: ${{ env.IPHONE_MODEL }} os_version: ${{ env.IOS_VERSION }} wait_for_boot: true shutdown_after_job: false - name: Finalize iOS simulator boot if: matrix.e2e-tests == 'flutter-ios' run: xcrun --sdk iphonesimulator --show-sdk-version - name: Run IOS tests if: matrix.e2e-tests == 'flutter-ios' run: | make install-uv export PLATFORM=ios uv run pytest -v test/functional/flutter_integration/*_test.py \ --doctest-modules \ --junitxml=junit/test-results.xml \ --cov=com \ --cov-report=xml \ --cov-report=html env: LOCAL_PREBUILT_WDA: ${{ env.PREBUILT_WDA_PATH }} - name: Save server output if: ${{ always() }} uses: actions/upload-artifact@master with: name: appium-${{ matrix.e2e-tests }}.log path: appium-${{ matrix.e2e-tests }}.log