{"id":37016966,"url":"https://github.com/aquality-automation/aquality-appium-mobile-java","last_synced_at":"2026-01-14T01:56:26.906Z","repository":{"id":43842129,"uuid":"205185629","full_name":"aquality-automation/aquality-appium-mobile-java","owner":"aquality-automation","description":"Aquality Selenium is a library built over Appium tool that allows to automate work with mobile applications (as web as native)","archived":false,"fork":false,"pushed_at":"2025-09-06T19:24:25.000Z","size":3715,"stargazers_count":23,"open_issues_count":3,"forks_count":7,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-09-25T21:14:20.634Z","etag":null,"topics":["appium","aquality-mobile","automation","mobile-automation","qa"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aquality-automation.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-08-29T14:44:30.000Z","updated_at":"2025-09-06T19:24:08.000Z","dependencies_parsed_at":"2024-01-24T18:42:34.022Z","dependency_job_id":"c854ef7c-c8d7-4f73-83a2-b4eeb5450f38","html_url":"https://github.com/aquality-automation/aquality-appium-mobile-java","commit_stats":null,"previous_names":[],"tags_count":26,"template":false,"template_full_name":null,"purl":"pkg:github/aquality-automation/aquality-appium-mobile-java","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aquality-automation%2Faquality-appium-mobile-java","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aquality-automation%2Faquality-appium-mobile-java/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aquality-automation%2Faquality-appium-mobile-java/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aquality-automation%2Faquality-appium-mobile-java/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aquality-automation","download_url":"https://codeload.github.com/aquality-automation/aquality-appium-mobile-java/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aquality-automation%2Faquality-appium-mobile-java/sbom","scorecard":{"id":204616,"data":{"date":"2025-08-11","repo":{"name":"github.com/aquality-automation/aquality-appium-mobile-java","commit":"d5ef515268bd811a976163fefa24450a68924707"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.9,"checks":[{"name":"Code-Review","score":6,"reason":"Found 13/20 approved changesets -- score normalized to 6","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":5,"reason":"7 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/release-maven-central.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-maven-central.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/aquality-automation/aquality-appium-mobile-java/release-maven-central.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-maven-central.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/aquality-automation/aquality-appium-mobile-java/release-maven-central.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-maven-central.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/aquality-automation/aquality-appium-mobile-java/release-maven-central.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-maven-central.yml:36: update your workflow using https://app.stepsecurity.io/secureworkflow/aquality-automation/aquality-appium-mobile-java/release-maven-central.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-maven-central.yml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/aquality-automation/aquality-appium-mobile-java/release-maven-central.yml/master?enable=pin","Info:   0 out of   3 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/release-maven-central.yml:9"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":2,"reason":"SAST tool is not run on all commits -- score normalized to 2","details":["Warn: 6 commits out of 29 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-16T23:27:08.569Z","repository_id":43842129,"created_at":"2025-08-16T23:27:08.569Z","updated_at":"2025-08-16T23:27:08.569Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28408692,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T00:40:43.272Z","status":"ssl_error","status_checked_at":"2026-01-14T00:40:42.636Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["appium","aquality-mobile","automation","mobile-automation","qa"],"created_at":"2026-01-14T01:56:26.435Z","updated_at":"2026-01-14T01:56:26.901Z","avatar_url":"https://github.com/aquality-automation.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Aquality Appium Mobile for Java\n\n[![Build Status](https://dev.azure.com/aquality-automation/aquality-automation/_apis/build/status/aquality-automation.aquality-appium-mobile-java?branchName=master)](https://dev.azure.com/aquality-automation/aquality-automation/_build/latest?definitionId=6\u0026branchName=master)\n[![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project=aquality-automation_aquality-appium-mobile-java\u0026metric=alert_status)](https://sonarcloud.io/dashboard?id=aquality-automation_aquality-appium-mobile-java)\n[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.aquality-automation/aquality-appium-mobile/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.github.aquality-automation/aquality-appium-mobile)\n\n\n### Overview\n\nThis package is a library designed to simplify automation of Android and iOS mobile applications using Appium.\n\nYou've got to use this set of methods, related to most common actions performed with web elements.\n\nMost of performed methods are logged using LOG4J, so you can easily see a history of performed actions in your log.\n\nWe use interfaces where is possible, so you can implement your own version of target interface with no need to rewrite other classes. \n\n\u003e ### Breaking news!\n\u003e Starting from v5.0.0 onwards, this package requires Java 11 or higher, as Selenium and Appium have stopped support of Java 8.\n\u003e The last version available for Java 8 is [v4.1.1](https://github.com/aquality-automation/aquality-appium-mobile-java/releases/tag/v4.1.1)\n\n\n### Quick start\n\nTo start the project using aquality.appium.mobile framework, you can [download our template BDD project by this link.](https://github.com/aquality-automation/aquality-appium-mobile-java-template)\n\nAlternatively, you can follow the steps below:\n\n1. Add the dependency to your pom.xml:\n```\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.aquality-automation\u003c/groupId\u003e\n    \u003cartifactId\u003eaquality-appium-mobile\u003c/artifactId\u003e\n    \u003cversion\u003e5.0.x\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n2. Configure the path to your application at settings.json:\n - Copy [settings.json](./src/main/resources/settings.json) into the resources directory of your project. \n - Open settings.json and find `applicationPath` option under the `driverSettings` section of desired platform. Replace the value with full or relative path to your app, e.g. `./src/test/resources/apps/ApiDemos-debug.apk`.\n\n3. Ensure that [Appium server](https://appium.io) is set up at your machine where the code would be executed, and the address/port match to set in your `settings.json` in `remoteConnectionUrl` parameter.\nIf the parameter `isRemote` in your settings.json is set to `false`, this means that AppiumDriverLocalService would be used to set up Appium server using Node.js. This option requires specific version of node.js to be preinstalled on your machine (Please read more [here](http://appium.io/docs/en/contributing-to-appium/appium-from-source/#nodejs) )\n\n\u003e Note:\nAfter migration to Appium v.8, we started using Appium server v.2 in our [azure-pipelines](azure-pipelines.yml). \n\u003e It has some breaking changes, described [here](https://github.com/appium/java-client/blob/master/docs/v7-to-v8-migration-guide.md).\n\u003e In particular:\n\u003e 1. Please install required driver manually:\n\u003e ```yaml\n\u003e npm install -g appium@next\n\u003e appium driver install uiautomator2\n\u003e ```\n\u003e 2. As soon as we continue to use \"remoteConnectionUrl\": \"http://127.0.0.1:4723/wd/hub\" in our [settings.json](./src/main/resources/settings.json), we need to specify the `--base-path` when starting Appium server:\n\u003e ```yaml\n\u003e appium --allow-insecure chromedriver_autodownload --base-path /wd/hub \u0026\n\u003e ```\n\u003e\n\u003e 3. We also recommend disabling element caching and w3c in chromeOptions when you run Android Chrome session. Take a look at example here: [settings.androidwebsession.json](./src/test/resources/settings.androidwebsession.json).\n\n\n4. (optional) Launch an application directly by calling `AqualityServices.getApplication();`. \n\n\u003e Note: \nIf you don't start an Application directly, it would be started with the first call of any Aquality service or class requiring interacting with the Application.\n\n5. That's it! Now you are able to work with Application via AqualityServices or via element services.\nPlease take a look at our example tests [here](./src/test/java/samples/.).\n\n6. To interact with Application's forms and elements, we recommend following the Page/Screen Objects pattern. This approach is fully integrated into our package.\nTo start with that, you will need to create a separate class for each window/form of your application, and inherit this class from the [Screen](./src/main/java/aquality/appium/mobile/screens/Screen.java). \n\n\u003e We recommend to use separate Screen class for each form of your application. You can take advantage of inheritance and composition pattern. We also suggest not to mix app different platforms in single class: take advantage of interfaces instead, adding the default implementation to them if it is needed.\n\n7. From the Screen Object perspective, each Screen consists of elements on it (e.g. Buttons, TextBox, Labels and so on). \nTo interact with elements, on your form class create fields of type IButton, ITextBox, ILabel, and initialize them using the `getElementFactory()`. Created elements have a various methods to interact with them. We recommend combining actions into a business-level methods:\n\n```java\npackage samples.android.apidemos.screens;\n\nimport aquality.appium.mobile.elements.interfaces.IButton;\nimport aquality.appium.mobile.elements.interfaces.ILabel;\nimport aquality.appium.mobile.elements.interfaces.ITextBox;\nimport aquality.appium.mobile.screens.Screen;\nimport org.openqa.selenium.By;\n\npublic class InvokeSearchScreen extends Screen {\n\n    private final ITextBox txbSearch = getElementFactory().getTextBox(By.id(\"txt_query_prefill\"), \"Search\");\n    private final IButton btnStartSearch = getElementFactory().getButton(By.id(\"btn_start_search\"), \"Start search\");\n    private final ILabel lblSearchResult = getElementFactory().getLabel(By.id(\"android:id/search_src_text\"), \"Search results\");\n\n    public InvokeSearchScreen() {\n        super(By.xpath(\"//android.widget.TextView[@text='App/Search/Invoke Search']\"), \"Invoke Search\");\n    }\n\n    public void submitSearch(String query) {\n        txbSearch.clearAndType(query);\n        btnStartSearch.click();\n    }\n\n    public String getSearchResult() {\n        return lblSearchResult.getText();\n    }\n}\n```\n\n8. We use DI Guice to inject dependencies, so you can simply implement your MobileModule extended from [MobileModule](./src/main/java/aquality/appium/mobile/application/MobileModule.java) and inject it to `AqualityServices.initInjector(yourModule)`.\n\n### ScreenFactory\n\nWhen you automate tests for both iOS and Android platforms it is good to have only one set of tests and different implementations of screens. `ScreenFactory` allows to do this. You can define abstract classes for your screens and have different implementations for iOS and Android platforms. After that you can use `ScreenFactory` to resolve a necessary screen depending on the chosen platform.\n\n1. Set `screensLocation` property in `settings.json`. It is a name of package where you define screens.\n\n2. Define abstract classes for the screens:\n\n```java\npackage aquality.appium.mobile.template.screens.login;\n\nimport aquality.appium.mobile.elements.interfaces.IButton;\nimport aquality.appium.mobile.elements.interfaces.ITextBox;\nimport aquality.appium.mobile.screens.Screen;\nimport org.openqa.selenium.By;\n\npublic abstract class LoginScreen extends Screen {\n\n    private final ITextBox usernameTxb;\n    private final ITextBox passwordTxb;\n    private final IButton loginBtn;\n\n    protected LoginScreen(By locator) {\n        super(locator, \"Login\");\n        usernameTxb = getElementFactory().getTextBox(getUsernameTxbLoc(), \"Username\");\n        passwordTxb = getElementFactory().getTextBox(getPasswordTxbLoc(), \"Password\");\n        loginBtn = getElementFactory().getButton(getLoginBtnLoc(), \"Login\");\n    }\n\n    protected abstract By getUsernameTxbLoc();\n\n    protected abstract By getPasswordTxbLoc();\n\n    protected abstract By getLoginBtnLoc();\n\n    public LoginScreen setUsername(final String username) {\n        usernameTxb.sendKeys(username);\n        return this;\n    }\n\n    public LoginScreen setPassword(final String password) {\n        passwordTxb.typeSecret(password);\n        return this;\n    }\n\n    public void tapLogin() {\n        loginBtn.click();\n    }\n}\n```\n\n3. Implement interface (Android example):\n\n```java\npackage aquality.appium.mobile.template.screens.login;\n\nimport aquality.appium.mobile.application.PlatformName;\nimport aquality.appium.mobile.screens.screenfactory.ScreenType;\nimport org.openqa.selenium.By;\n\nimport static io.appium.java_client.AppiumBy.AccessibilityId;\nimport static org.openqa.selenium.By.xpath;\n\n@ScreenType(platform = PlatformName.ANDROID)\npublic class AndroidLoginScreen extends LoginScreen {\n\n    public AndroidLoginScreen() {\n        super(xpath(\"//android.widget.TextView[@text='Login']\"));\n    }\n\n    @Override\n    protected By getUsernameTxbLoc() {\n        return AccessibilityId(\"username\");\n    }\n\n    @Override\n    protected By getPasswordTxbLoc() {\n        return AccessibilityId(\"password\");\n    }\n\n    @Override\n    protected By getLoginBtnLoc() {\n        return AccessibilityId(\"loginBtn\");\n    }\n}\n```\n\n4. Resolve screen in test:\n\n```java\npublic class DemoTest {\n    @Test\n    public void testScreenFactory() {\n        LoginScreen loginScreen = AqualityServices.getScreenFactory().getScreen(LoginScreen.class);\n        Assert.assertNotNull(loginScreen, \"Screen must be resolved from factory\");\n    }\n}\n```\n\n### Devices\n\nOur library allows you to run tests on different devices and store their settings (like udid, name, etc.) in JSON files.\n\nYou have to add [devices.json](./src/test/resources/devices.json) file to resources where you can define a set of devices which you use for the test run.\n\nIt is possible to set default device for each platform in [settings.json](./src/test/resources/settings.json) by defining `deviceKey` property which is a key of device settings from `devices.json` file.\n\nYou can also create several profiles with devices by adding files with suffixes `devices.\u003cdevicesProfile\u003e.json` (like `devices.set1.json`) and then specify profile using maven args `-DdevicesProfile=set1`.\n\n### License\nLibrary's source code is made available under the [Apache 2.0 license](https://github.com/aquality-automation/aquality-winappdriver-dotnet/blob/master/LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faquality-automation%2Faquality-appium-mobile-java","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faquality-automation%2Faquality-appium-mobile-java","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faquality-automation%2Faquality-appium-mobile-java/lists"}