How to Automate Biometrics (Android edition)
GEORGIOS ROMANAS
Posted on May 12, 2020
Some sprints ago, me and my team, during the sprint planning event, we were discussing the implementation of touchID on login in our React Native App.
I have started the POC of Biometrics (as I have never done it in the past), so I could have a clear view if would be possible to automate on Android platform using an Android 9.0 emulator.
After a bit of research, I saw all solutions that I have found on the web (i don't know if I've missed any, sorry for that) are instructed how to add a fingerprint manually and then using an adb
command to pass it in the biometric alert and make the valid login.
Then I have checked if there are any adb
commands that will make my life easier and BOOM....
With the power of Appium and WebdriverIO!!!
I came to the following solution:
First of all, I took notes on how those actions can be done manually:
- Go to Android
Settings
. - Tap on
Security & Location
. - Add
Screen Lock
, there are several types such asPin
,Pattern
,Swipe
,Password
(I chosePin
). - You have to follow the wizard of your choice.
- Then you tap on
Fingerprint
. - There is again a wizard to follow
- Then I should open my app
- Go to Login screen and provide the fingerprint on Biometrics Alert
That's it! Now let's automate!
I have configured Appium with --relaxed-security
flag in wdio.conf.js
, so Appium can accept adb
commands
services: [
[
'appium',
{
args: {
'--relaxed-security': true
},
command: 'appium'
},
],
]
Next, the real fun starts!
The first 4 manual steps I found out that could be done like this:
browser.execute('mobile: shell', {
command: 'am start -a android.settings.SECURITY_SETTINGS && locksettings set-pin 1234'
});
After that, as I am still in Android Security Settings
I need to tap on Fingerprint
using Appium desktop I found the selector and click on it:
$('android=new UiSelector().text("Fingerprint")').click();
The Fingerprint wizard is open and there is a Next
button, using the same approach as above:
$('android=new UiSelector().resourceId("com.android.settings:id/fingerprint_next_button")').click();
I need to provide the pin I have setup on Screen Lock
and tap keyboard's Done
button:
browser.execute('mobile: shell', {
command: 'input text 1234 && input keyevent 66'
});
Then the wizard prompts the user to touch the sensor (this should be done 3 times), here Appium provides us the .fingerPrint(fingerprintId)
method, that actually executes an adb
command adb -e emu finger touch fingerprintId
:
for (let i = 1; i <= 3; i++) {
browser.pause(1500);
browser.fingerPrint(1);
}
The final step of the wizard is to tap on Done
button:
$('android=new UiSelector().resourceId("com.android.settings:id/next_button")').click();
After that, we should start our App. This is again provided by Appium using .startActivity("com.example", "ActivityName");
method. In my example is:
browser.startActivity('com.reactnativesampleapp', 'com.reactnativesampleapp.MainActivity');
What remains is to actually login into the app using biometrics:
For more info you can check here:
https://github.com/gromanas/ReactNativeSampleApp/blob/master/README.md
Posted on May 12, 2020
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.