This repository was archived by the owner on Jul 29, 2024. It is now read-only.
Repository navigation
This repository was archived by the owner on Jul 29, 2024. It is now read-only.
provide the step by step procedure for Angular/Ionic Android App: Login Testing with Appium Inspector (Cypress or Protractor) #5569
Copy link
Copy link
Open
Description
This ticket outlines the creation of automated login tests for an Angular/Ionic Android application using Appium Inspector and either Cypress or Protractor.
provide the example test case for
Login -> Email Address -> password for below application

find the below ts file details
import { Component, Inject, NgZone, OnInit } from '@angular/core';
import { UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms';
import { Router } from '@angular/router';
import { AuthService } from 'src/app/services/auth.service';
import * as _ from 'lodash';
import { UserService } from 'src/app/services/user.service';
import { FingerprintAIO } from '@ionic-native/fingerprint-aio/ngx';
import { Platform } from '@ionic/angular';
import '@codetrix-studio/capacitor-google-auth';
import { Plugins } from '@capacitor/core';
import { AlertService } from 'src/app/services/alert.service';
import { AngularFireAuth } from '@angular/fire/compat/auth';
import { FacebookLogin } from '@capacitor-community/facebook-login';
import { SignInWithApple, AppleSignInResponse, AppleSignInErrorResponse, ASAuthorizationAppleIDRequest } from '@ionic-native/sign-in-with-apple/ngx';
import { FirebaseCrashlytics } from '@awesome-cordova-plugins/firebase-crashlytics/ngx';
import { debounceTime } from 'rxjs/operators';
import { ErrorService } from 'src/app/services/error.service';
import { AnalyticsService } from 'src/app/services/analytics.service';
@Component({
selector: 'app-login',
templateUrl: './login.page.html',
styleUrls: ['./login.page.scss'],
})
export class LoginPage implements OnInit {
passHide = true;
e_regex = '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$';
loginForm = new UntypedFormGroup({
username: new UntypedFormControl('', [Validators.required, Validators.pattern(this.e_regex)]),
password: new UntypedFormControl('', Validators.required)
});
color: string;
loginData: any = {};
userData: any;
userInfo: any;
googleData: any;
facebookData: any;
appleData: any;
isIphone = false;
appleLogo: string;
facebookLogo: string;
googleLogo: string;
headerLogo: string;
constructor(private router: Router, private authService: AuthService,
public firebaseCrashlytics: FirebaseCrashlytics,
private platform: Platform, public afAuth: AngularFireAuth,
private zone: NgZone, private faio: FingerprintAIO, private userService: UserService, private analyticsService: AnalyticsService,
private alertService: AlertService, private signInWithApple: SignInWithApple,
@Inject('LscLogoLocation') public LscLogoLocation: string, @Inject('LscAppleLogo') public LscAppleLogo: string,
@Inject('LscFacebookLogo') public LscFacebookLogo: string, @Inject('LscGoogleLogo') public LscGoogleLogo: string,
@Inject('LscHeaderLogo') public LscHeaderLogo: string,
private errorService: ErrorService) {
this.appleLogo = `${LscLogoLocation}` + '/' + `${LscAppleLogo}`;
this.facebookLogo = `${LscLogoLocation}` + '/' + `${LscFacebookLogo}`;
this.googleLogo = `${LscLogoLocation}` + '/' + `${LscGoogleLogo}`;
this.headerLogo = `${LscLogoLocation}` + '/' + `${LscHeaderLogo}`;
this.setRememberMe(true);
}
ngOnInit() {
if (this.platform.is('ios')) {
this.isIphone = true
}
try {
const crashlytics = this.firebaseCrashlytics.initialise();
crashlytics.logException('my caught exception');
} catch (error) {
console.log('error: 59', error);
}
this.userService.choosedColor$.subscribe((color: string) => {
this.color = color;
});
this.color = localStorage.getItem('choosedColor');
this.loginForm.get('username').valueChanges.pipe(
debounceTime(10)
).subscribe((inputValue) => {
if (inputValue) {
//To remove whitespace from both sides of a string
this.loginForm.get('username').setValue(inputValue.trim());
}
});
}
handleForgotPassword(): any {
this.router.navigate(['forgot-password']);
}
handleMemberPage(): any {
this.router.navigate(['memberpage']);
}
setRememberMeToggle(e): void {
this.setRememberMe(e.detail.checked);
}
setRememberMe(flag: boolean): void {
localStorage.setItem('rememberMeFlag', `${flag}`);
this.afAuth.setPersistence(flag ? 'local' : 'session');
}
emailSignin() {
this.authService.setLogoutFlag(false); // Update the logoutFlag in the service
const username = this.loginForm.controls['username'].value.trim();
if (this.notNull(username) && this.notNull(this.loginForm.controls['password'].value)) {
localStorage.setItem('pwd',this.loginForm.controls['password'].value);
this.authService.signInWithEmailAndPassword(username, this.loginForm.controls['password'].value);
this.afAuth.authState.subscribe((user) => {
if (user != null) {
if (user?.providerData.length > 0) {
this.loginForm.reset();
}
}
});
// Track Individual User for GA
this.analyticsService.sentEvent('Login', {
login_type: 'Username and Password',
});
}
else {
this.alertService.errorSnackbar('Please fill the all mandatory fields');
}
}
notNull(data: any): boolean {
return data !== undefined && data !== null && data !== "";
}
loginUser(email: string, password: string) {
this.authService.loginUser(email.toLowerCase(), password)
.then(response => this.afterLoginSuccess(response))
.catch(error => this.afterLoginError(error));
}
handleGoogleLogin() {
this.googleSignIn();
}
async googleSignIn() {
try {
const googleUser = await Plugins.GoogleAuth.signIn();
this.googleData = googleUser;
if (googleUser.authentication.idToken) {
this.authService.googleLogin(googleUser.authentication.idToken)
.then(response => this.afterGoogleLoginSuccess(response))
.catch(error => this.afterLoginError(error));
}
// Track Individual User for GA
this.analyticsService.sentEvent('Login', {
login_type: 'Google',
});
} catch (error) {
const err = 'GoogleSignIn' + ':' + error;
this.errorService.handleFirebaseCrashlytics(err);
this.alertService.errorSnackbar(error);
}
}
afterGoogleLoginSuccess(_response) {
this.userData = {
firstName: this.googleData.givenName || '',
lastName: this.googleData.familyName || '',
email: this.googleData.email,
name: this.googleData.displayName || '',
imageUrl: this.googleData.imageUrl || ''
};
this.authService.handleLoginSuccess();
}
afterLoginError(error: any) {
this.alertService.dismissLoader();
if (error.code === 'auth/account-exists-with-different-credential') {
this.alertService.errorSnackbar('This Account is already exist with different login method.');
} else {
this.alertService.errorSnackbar(error);
}
}
afterLoginSuccess(_response) {
this.authService.handleLoginSuccess();
}
handleFacebookLogin() {
this.facebookLogin();
}
async facebookLogin() {
try {
const FACEBOOK_PERMISSIONS = ['public_profile', 'email'];
const result = await FacebookLogin.login({ permissions: FACEBOOK_PERMISSIONS });
if (result && result.accessToken) {
const user = { token: result.accessToken.token, userId: result.accessToken.userId };
// eslint-disable-next-line max-len
const response = await fetch(`https://graph.facebook.com/${result.accessToken.userId}?fields=id,name,gender,link,picture&type=large&access_token=${result.accessToken.token}`);
this.facebookData = await response.json();
this.authService.facebookLogin(result.accessToken.token)
.then(res => this.afterFbLoginSuccess(res))
.catch(error => this.afterLoginError(error));
}
// Track Individual User for GA
this.analyticsService.sentEvent('Login', {
login_type: 'Facebook',
});
} catch (error) {
const err = 'FacebookSignIn' + ':' + error;
this.errorService.handleFirebaseCrashlytics(err);
this.alertService.errorSnackbar(error);
}
}
afterFbLoginSuccess(_response) {
var _firstName = '';
var _lastName = '';
var _displayName = this.facebookData.name;
if (_displayName) {
const displayNameParts = _displayName.split(' ');
_firstName = displayNameParts[0];
_lastName = displayNameParts.length > 1 ? displayNameParts[1] : '';
}
this.userData = {
firstName: _firstName,
lastName: _lastName,
imageUrl: this.facebookData.picture.data.url || '',
authId: this.facebookData.id
};
this.alertService.dismissLoader();
this.authService.handleLoginSuccess();
}
handleAppleLogin() {
this.appleLogin();
}
async appleLogin() {
try {
this.signInWithApple.signin({
requestedScopes: [
ASAuthorizationAppleIDRequest.ASAuthorizationScopeFullName,
ASAuthorizationAppleIDRequest.ASAuthorizationScopeEmail
]
})
.then((res: AppleSignInResponse) => {
this.appleData = res;
console.log("Apple response", res);
this.authService.signUpWithAppleLogin(res.identityToken)
.then(async _res => {
await this.afterAppleLoginSuccess(_res);
})
})
.catch((error: AppleSignInErrorResponse) => {
console.log("Apple error", error);
});
// Track Individual User for GA
this.analyticsService.sentEvent('Login', {
login_type: 'Apple Login',
});
} catch (error) {
const err = 'AppleSignIn' + ':' + error;
this.errorService.handleFirebaseCrashlytics(err);
this.alertService.errorSnackbar(error);
}
}
async afterAppleLoginSuccess(response) {
if (!this.notNull(response.user.email) || response.user.email.includes('privaterelay.appleid.com')) {
await this.authService.presentAppleEmailAlert();
} else {
this.authService.handleLoginSuccess();
}
}
signup() {
this.zone.run(() => {
this.router.navigate(['/signup']);
});
}
forgotPassword() {
this.zone.run(() => {
this.router.navigate(['/forgot-password']);
});
}
}
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
Activity
SathishkumarG3 commentedon Jun 12, 2024
Please prioritize this as we are still facing the same issue. If any channels are available, please provide updates