 know and I got a total of seven years of experience in testing and around three plus years of experience it's in APM. So my colleague Jerry also will be taking presentation with me. So Jerry. Hello everyone. My name is Jerry. It's one of the Q engineer in Carousel. Yes. So first presentation is, Shyam will take this one and my wife is in the afternoon. So I will show you guys more details in afternoon. Yeah. So why don't you guys introduce yourself. You can start from here. Please tell your name and your organization and your expectation from this meeting. Hi everyone. This is Vara. I'm from Shopback. I maintain the entire QA there. So I'm with Shopback from almost two plus years. We have a very nice automation test tool called as everything set up there. APM is one of the tools. So I'm just here to learn new stuff. Yeah. Enjoy the session. Thanks. Thanks sir. This is Venkatesh. I'm also from Shopback. Recently came from India and joined in Shopback. Now I'm a web automation engineer there. So I didn't have any idea about this APM. So I just came here to know the basics and stuff and everything. Thanks. Thanks Venkatesh. Okay. Hi. I'm Ko Hing. I'm currently a student. So I'm just trying to learn what this is about. Okay. Thank you. Hi. Myself Moti. I'm working in Titan soft and years of experience in a software testing field. And most of my experiences in the web application. So this is APM is something first I want to try. So today I just want to see how is it goes. Welcome Moti. Okay. Hello everyone. My name is Praveem. So I'm an iOS developer at SP Digital. And for today I'm just like here to see what is APM and what you can offer. Yeah. Thank you. Hi. I'm Venkatesh. And I'm working in Standard Chat at Bank as an automation engineer. So I want to learn APM. I already have some POCs done in APM. But want to learn more about what is in APM. All the best. Hi. Good morning. My name is Biju. And I am from AIS Singapore. I'm totally new to mobile development or automation. But recently I got an opportunity to start a new development, new app development, which vendor will be doing. But by knowing this I can give you some tips to my management where we can also do some automations for mobile development. Okay. Hi Roy. I'm from NCS doing fine end development. So I'm here to just to know more about the tools that you all offer. Hi. I'm Shareen. I'm from Standard Chat at Bank. So same with you. Yeah. I'm a product owner and a user experience designer. So I work with testers to do a lot of testing. So I would like to understand more. Yeah. Thank you. Thanks everyone. So we split this session to two hubs. So during the first half I will talk about what's APM and the APM architecture and how you can start coding with APM. And afternoon session then Jerry will give you some tips on how you can develop the APM script effectively. And we will go through the fetch action class with APM, how you can do the swiping and every other stuff. Then we will discuss about the page object model pattern, how you can design your test cases using POM. Okay. So that's the agenda. So we can start. So before that, how many of you joined the Slack channel? Okay. So if you are not joined the Slack channel, could you please go to this URL and you can invite yourself to join the Slack channel. So I can share more details on the Slack channel. It's quite easy for me. When you click on this link, you will get this page. You can enter your personal email either. So you will get any invitation from me. So from where you can sign up for the Slack page. Everyone joined? If anyone got any problem for this one, just or any other question during the session, you can just raise your hand and I can come to your desk and help you guys. Yeah. So shall we start? So what's APM? So I hope if you are a tester, you might have already experienced with Selenium, right? So if Selenium is for web, then APM is for mobile automation. So what can do with APM? So you can automate the iOS and Android app. So whether it's a native or hybrid one, you can automate it with APM. So you can also automate the mobile browser. So if you have a mobile web application, you can automate it using APM. But there is a limitation. In Android, you can automate the default browser and Chrome. It won't support any other browser on Android. And on iOS, it supports only Safari. So now it supports the Windows application also. So if you have a native Windows application, you can automate using APM, using WinApp Driver. So the APM APIs are extension of Selenium. So it uses the WebDriver protocol along with the JSON protocol. So if you familiarize with APM, all the commands are almost the same, like click, enter text, and everything, and send keywords, almost all the same methods we are using in APM along with some extra methods. Then, which are programming languages to support? So you can see that it supported a number of programming languages, it has Java, Ruby, Python, PHP, JavaScript, and C-Sharp. And of course, Robot Framework also. So it's not stopping you to select your favorite programming language. So if your organization is Java-based organization, you can just choose Java. If it's not Python, just use Python. So it depends on whether your organization got the resource for that particular language. So whatever be the language you use, so the APM driver can understand what the action need to be done on the mobile device, that's how it works. The APM philosophy. So APM is built based on these four philosophies. The first one, you shouldn't have to recombine your app or modify it in a way in order to automate it. So what it means is that, for example, how many of you use Calabash, head of Calabash? Okay, so if you want to use Calabash, then you need to code in Ruby, and you need to come value your app with Calabash source code, right? So if you do it, it means that, let's say after the automation testing passed, you want to send this to production directly, okay? But since you already come value it with Calabash source code, you are not sending the same app that you really wanted to. You need to remove all these things, and you need to send your code, actually. So with APM, you don't need to recombine anything with any third party tool or anything like that. You just test the APK or IPFL what you wanted, you send it to production. Like I mentioned earlier, you can select your favorite programming language. So it's not tying up you to a specific programming language, or your team need to learn a new programming language, so it avoids all these issues. The third one, mobile automation framework shouldn't reinvent the wheel when it comes to automation APIs. So it's already reusing the Selenium APIs, so it's not something new that they built. So that's the third point. The last one, a mobile automation framework should be open source, in spirit and practice as well as its name. It's free, you can use it, you don't need to pay anything to use APM, so it's an open source project. Yeah, this is a quite outdated thing, but I can explain. This is how the APM architecture look like. So on the left side, you can see the APM scripts in Java. So for example, driver.findElement by id, app.id, radio.click. So this is a code for clicking on a radio button as a Java pipeline. So how APM understands that? I need to click on a radio button. So when you run this program, if it is an Android, Android is on the top, so what it do? If the Android version is greater than 2.3 and less than 4.2, then the Selenium will take care of this one. So what it do? It has a bootstrap.jar. So bootstrap.jar can understand the client language. So basically when you run .click, it will be converted to a JSON format. It's going to be a client-server architecture. So the JSON format will be sent to the bootstrap.jar and it can communicate with the Android phone using UA Automator. So internally, the APM uses UA Automator for the Android one. If it is less than 4.2, it uses the Selenium right. In iOS, it uses the XE-UATest for more than, if it is iOS, the version is 9.3 plus, it uses XE-UATest. And if it is less than 9.3, it uses the UA Automator. So there are, so let's imagine your application is purely iOS application. So if your development team writing the automation testing using UA Automator, they can do it. It's possible with them if it is only a single iOS application. So when Xcode 8.3 introduced, so Apple deprecated the UA Automator. So what it means that the entire test cases, you need to rewrite it on XE-UATest. So with APM, it's still, it's okay because the APM guys has built a wrapper around this. So all your existing tests will still passing on the iOS 9.3 plus. So instead of bootstrap.jar, bootstrap.js will be communicate with the UA Automator in iOS. So as an APM developer, you don't need to care about how the UA Automator works. You only work on the client side. So you just write the Java or Python or any other language. So APM will automatically take care of what action need to be performed. Any doubts? So far? No? Okay. Okay. Just like I mentioned earlier, if it is Android 4.2 plus, then APM uses Google's UA Automator and UA Automator 2. If it is between 2.3 plus and less than 4.2, then it uses the same Android. And for iOS, if it is, if the device platform is greater than 9.3, it uses XUATest. And less than that, it uses Apple's UA Automation. So these are the four basic APM concepts you need to understand. So what it is, the APM is going to be a client server architecture. So when you run the APM command, basically you are starting an APM server. So server will start on a port. So when you start your Java or any other programming language client, it will come through that APM server to the device. And if you perform an action, you will get a status, whether it's passed or not. And that how APM understands whether it's a pass or fail. Every, when you instantiate a driver, it will start a session also. So without session, you cannot work with APM. So the session contains all the details about the web elements, what action need to be performed, everything will be stored in the session. Once you install APM, you can run the APM server using the APM command. So you can select, by default, it's going to be 7-4-2-3 port. You can overwrite the port if you go for the parallel execution, or you can add the device name, so many things you can add. So all these things comes under decide capabilities. So let's say imagine you have two phones to test. Okay, both are iPhone, and iPhone 5s maybe. And once platform is 11.0, the second iPhone platform is 10.0. So how do you tell APM that I need to run on the iPhone 5s whose platform version is 11.0. So that's where we are using the decide capabilities. So you can send this using a just a notation, then you specify a platform name, platform version, device name, the automation name, the path to the APP file or APF file. So we are giving when you start a driver object, we are specifying this, then APM will understand A. I need to run the test on this particular phone. Cool? So you can just go to this link to understand more about caps after the session. Okay, so have you guys completed the installation? We can help you if you haven't done. So everyone set the Java 8 node and Rode Studio, APM command. Did you run APM doctor on your terminal? Everyone? If you run APM doctor, it will diagnosis the existing installation and it will give you the status on whether you are missing any necessary dependent software or not. So it's okay if you are running it on Windows. You want Windows machine, you cannot run the iOS test. So you need an Mac machine to run the iOS simulator and other stuff because you need to install the Xcode. So if you're running it on Mac, you will be getting a status like this. Okay, let me know if you are any of the, any of you are not getting any Indomark, which is a close sign? Yeah, okay. Oh, you need to set up the Java home, right? This is not your, yeah, it's okay if you are not able to install. So we will help you to install during the lunch time. So we can go ahead with the session. Yeah, so once you set up everything, we will try to automate a simple test case. So how do you find the elements on the web screen? I mean mobile, mobile phone screen. So if you are using Selenium, you already familiarized with the different identifier, XPath, CSS selector, etc, right? So, likewise, for IPM, you can use accessibility IDs and XPath, same class name, you have to matter to syntax, iOS and as predicates. Okay, so we will go through this. We will see how you can inspect the element. So on web it quite easy, right? So you just right click on the element, you just inspect the element and it will show the HTML DOM structure and you can easily identify whether it has an ID or not or you can go with any plugins you want. So for APM, there is a tool to inspect the element called APM Inspector. So what APM Inspector will do, it will open up the screenshot of the page and you can go through the elements there and you can identify whether it has an ID or not. So I can show you that. So this is how the UI look like. So this is the latest version of APM desktop. This is an electron app, basically. So you know what an electron is? Electron, have you heard about electron? Okay, so before the APM guys built this tool, there was two dedicated project for Mac and Windows machine. So using electron you can have the same source code for both Mac and Windows machines. So it's like something like React Native. You can just one code. You can build on both iOS and Android. So and the previous version was so buggy and it was not working well almost of the time. But this one is pretty cool and it worked like a charm. So we will start with the simple one. So when you click on the start server, if everything installed correctly then it will start the APM server. So I'm using version 1.7.1 and it began to listen at the port 4723. So the default port is 4723 if you are not specifying the port. Which means that when you start the client, you need to point to this URL. Then it will keep on listening. So you can see there are three buttons on the right side. First one is start inspection session, get raw logs and the last one stop server. So we're going to click on the start inspection session. So it will open me another page. So there are a few options. Automatic server, custom server or if you are using the party cloud like source lab or test object you can use that one. So we will go with the automatic one. So the automatic server will always point to your local host and the port is 4723. Okay. Then I have created a few decide capabilities for I will start with Android. So what I have given, you can just click on the plus button then it will ask you to start a new, new decide capabilities. So you just, you just add the decide capabilities according to which phone or simulator you want to start your session. So here I have given my Android virtual devices nexus for underscore a bd platform name Android automation name is ui automator 2. App is the path to the apk file and device name is emulator hyphen 5554. I will show you how did I create the emulator. So I'm going to start create a sample project. Just click and select the basic activity and keep all the different values. So we have started a sample project and if you click on this one, sorry, the manager can show you. So I already created a emulator here with the name nexus underscore four underscore a bd and which is apk 23 which is 6.0 equivalent. So you need to give, if you're running on emulator you need to give the avd name as nexus underscore four underscore avd. You can give your own name there but if you want to call this specific simulator you need to give this name. Just let me run this and see what happens. So just run this. I have this simulator with me. Okay, so I can see that the emulator name came on here which means that this is ready with all the USB debug connections so I can start using it. So if you are using the real device, so IPM support both emulator and the real device okay. So if you are using a real Android device what do you need to do? You need to do some extra steps like you need to enable the USB debugging mode and you should accept it and when you run the adb devices the udi of the phone should be coming here. If it is an unauthorized state so you cannot run it. Okay, so let me close it. Okay, I'm just starting the APM inspector again. You can just minimize it. So again it's start with the 4723 port. I'm inspecting it. Okay, so here is my capability that I already saved. You can also create something like this so you can just start the session. So what's the error shown? The APK file is now found right? Unknown server-side error. So probably this may be a wrong path. So I have the APK file with me. So build aws.apk. So I'm going to reuse this Amazon device form sample project. So I already built the APK for this one. And I'm going to edit this one and add aws.apk. And let me save it. And start session. So you can see that it's successfully running. So the APM will try to connect with the emulator. So you can see that all the log file there, what it tried to do. So if you closely watch it you can understand how the APM works. What are the actions that being carried out. Basically it interacts with the ADB and get the connected device and we'll check whether the device that we have given in the disabled capability is present or not. If it is then it will try to install the APK file on the emulator. So yeah, so it's 200 status. So yeah, that's it. So if you check the emulator, yeah, in emulator also the app has been started. This is the homepage of the app. So the same screen you should get in the APM inspector. See. Got it? So what I wanted to do is that there's a, you can see a menu there. So I'm going to click on the menu. So in order to click the menu I need the identifier for that particular menu. So how can I inspect that one? So here if you look at the app source you can see it's just like an xml dom. So you can see the relationship between all the elements here. So basically APM will render the ua element as an xml here. If you really want to see what's the idea of this one, we just select the select element tab here. Click here. So you can see that it will be highlighted. So this is an android widget image button with the content description reference app. Okay. So if you closely look at the right hand side. Sorry. Yeah. So this is more handy like it has an accessibility area order. So accessibility ID is reference app and it already give you the xpath expression. Then there are some other attributes like what's the index, the class name, package, the xy coordinates, so many other things. Okay. So my experience is that you shouldn't use the xpath expression. It's very expensive for IBM to find out the elements. Okay. So you need to do a lot of extra things. The good practices will be your development team should give you the accessibility ID for all the IDs. Okay. So if any of the element missing any ID you can request the dev team that I am missing this ID. So could you please give me an ID for that one? So you can always do that. So you also can do it if you are familiarized with the project. How to do the android development. So if you want to click on it, what you can do you can do something called drive. So how do you find out an element with ID in Selenium? Driver.findElementByID. Just pass the ID. Like this you can do something like accessibility ID. So you just write driver.findElementBy accessibilityID. Just pass this expression reference app. It's as simple as that. So you can click on it. Let's say you select it and you click the tab here. It will perform the operation. So it will try to click on the app. It will open again. Okay. So in the new page you can see that or you just refresh it if it's not coming up. So if you refresh it will be the new XML structure will be coming based on the menu or the current state of the page. Got it? Any doubt? Okay. Likewise tab you can type using the sent key commands. You just select in what the text field and send keys. So it will be typing over here. So I can do that example. So I think I should go to input control and tap on it. Then there is a text field. Okay. So I'm selecting the text field and I'm clicking the send keys and I click on type. So it's already there. I'm sorry the simulator is hidden. So we can see actually here it's been typing. So it just like the send keys command on Selenium. So you need to find out which element you want to play with and just send the send keys command. It's simple as that. And you can do record also with this APM inspector. But I suggest don't go for it because it's in people think that when hearing about automation testing the first question is always like can I do record and run and just use it. If you're an experienced tester then you would say no because the test is so flaky if you're using the script that you get from the record and run. So you need to have your own framework on the top of it and you need to have matured test scripts also. So you need to handle it properly. You cannot simply use the way you got it from the record and run. So I can show you an example how you can record it. Let me see. So again there is an option for record. So this button it will start recording everything. So you record it then I'm going to click on it. Tap. Then I'm going to click on input control. Again tap. Then I'm going to... Okay the same hello. So you can see it here. Okay it's there. So if you look at here so you can see that the code has been already generated here. So you can convert it to Python or Ruby framework. So if you select Ruby then it will give you the Ruby syntax for the recording. So the same for the JavaScript. So we will proceed with the Java client for the session. So you can see that this is my code. So here is what I have captured. So the APM inspector find out that the menu button has already has a reference, reference up as the accessibility ID. So it will always go for the accessibility IDs because it has the highest priority. The second one and it will try for clicking it. Then the input... In the menu we selected the input elements right. There is no dedicated ID for that one. So it went for the XPath. So the XPath for that particular expression is Android widget, text view, content description is equal to raw category name. Which is... Which will work but it is not good to use. So I will show you why. So if you closely examine this app, okay let me post the recording and tap on it. So here is the submenu rights. So the recorder gave me an expression like Android widget, text view and content description is raw category name. Okay. But if you look at this one, Input controls, it's here. Everything has the same thing as the resource ID here. Draw error, title, draw error. There is no specific unique ID for each and everything. So it's a generalized XPath expression, which is very flaky. So if you are using this kind of session, you may not get the consistent test result. So one option is you can request the dev team to add the accessibility for this element. Or what you can do, you can use the UA Automator expression. Or you can, if you really want to go ahead with XPath, you do the Relative XPath. Okay. So Jerry will be talking about how to use the Relative XPath in the afternoon session. Okay. So that's how you need to use with the... That's how you can use with the Android app. Any doubt on this? Identifier for? Only the identifier. You need to inspect each element and you'll be getting the ID. There is... Yes. Yeah, it's possible. So one thing you can do, like you can tell the developer that, hey, for this one I need this particular ID. So if it is there, then your test will be passing. Yeah. So once they check in the code and you get that new APK file, the new ID will be in the APK file. Yeah, that's what I'm telling. So let's say... Let's imagine you are using an ID X, Y, Z. And developer changed it to ABC. Okay. So are you asking whether this will fail or not? Since you're... It's... It's... You cannot do something like that. So it... IPM read the accessibility IDs from the APK file. So let's say the developer changed one ID. Okay. So in the next build, you will be getting a new APK file. Got it. So in the new APK file, you will be getting another ID for that one. So if you are still using the old ID, then it will fail. So it's always good that you just tell the developer, don't change the IDs unless it's due to some urgency or something like that. So the concept is quite different from the web application. So it's like... You need to... Web application is quite simple. You just go ahead and hit an URL and you can inspect the IDs, right? For web automation, if you are setting up your continuous integration server or any other continuous testing platforms, you need to generate the APK fails based on your daily bits. So every day, your team is adding new code, right? So if you're testing the old APK file or IPFL, which means that you are testing the old code. So if you are... If you are continuously testing it, then you need to get the new APK file every day. Okay. So... So any... Any other dots on this one? Okay. So we can go ahead with iOS simulator. Okay, let me close this one. And I already created another simulator for iOS. So I'm using the iPhone 6 simulator and I need to change the APK file. I already generate the APK files here. So... Okay. So you can see the logs. So if you compare the iOS simulator with Android, for APM, there is something extra needed to work with iOS simulator called WebDriverAgent. So you cannot simply interact with an Apple's device. So the Facebook has done this WebDriverAgent project. So APM uses the WebDriverAgent and using WebDriverAgent, APM interacts with the iOS devices. So APM will try to install the application first. Then it will install the WebDriverAgent. Using that WebDriverAgent, it's able to communicate with the APP file. So first it will install the AWS device sample app. Then it will install the WebDriverAgent. Yeah. So it's installing the WebDriverAgent. Then it will start the app. Yeah. This is how the application look in iOS. So the UI is not similar as Android. So you can see that the same page has been come up with the new XML syntax. So you can see that it's starting with XE UI element instead of the UI automator. Okay, because the iOS use the XE UI test. So we will try to see whether we can interact with the iOS. So I'm selecting Inboards. So the Inboard and I am tapping. Okay. So I'll go to the TextView. So just like Android, you can interact with iOS also. Got it? Any doubt on this? Okay, now we can just go to this repository. It's a GitHub repository and you can clone the project and set it up on your device. Your machines, we can help you on that. The emulator. So if you clone this one, I have already included the APK file in this one. You can find it in the build folder. What question? Is APK file always necessary to start an APM session? Yeah. If you want to start an application, do you need to pass the APK file as a desired capabilities with Android? How many say no? How many say yes? Everyone, just have everyone say yes. Okay, so regarding Android, right? So if the application is already installed on phone, you don't need to, if you want to start that app, you don't need to pass the APK file. Apart from, I mean, instead of the APK path, you need to pass two other parameters called package name and activity name. So, it will check whether any of the app has this package name and activity name and it will start that up. So it's quite useful when you want to continue your test. Let's say you are getting a build and you don't need to install it every time. So once you install it, you can go ahead with starting with the package name and activity name. So you know how to get the package name and activity name of any APK? Okay, I can share. If you are using this command, so if you go to the Android SDK and the AAPT command and you just dump barging aws.apk and grab package name, then it will print the package name of that particular APK file. If you want the activity name, then you just pass the activity name. So there are two dedicated desired capabilities for including this one called package name and activity name. So just like you pass the device name, you just pass the package name and activity name. But for iOS, it's not possible. So if you just want to start an iOS app which is already installed, it's not possible. So you should always add the IPA or APP file for the iOS device. Java home should be set properly. ADP should be existing Android home slash platform tools. Yeah, and the emulator also. Otherwise, it will throw an error. I will ping the desired capabilities which I used in the Slack channel. You can just copy from there. If you need any reference, you can have a look at the Slack channel. So how, which are the desired capabilities I just used. So if you're running with a real device, you need to pass the UDID of the device. So for example, if you want to run with a real device, real Android device, then you need to do ADB device trend command. So it will give you a unique identifier. So you can add one extra identifier like UDID and pass that particular statement. So it will run on the real phone instead of the simulator. What do you think? Where should your test run on real device or simulator? Why? Okay, got it. Any other thing? Okay. Yeah, another perspective will be like none of your real users are using simulator in production, right? So you should always statistic on the real device. So, and if you're, if you're using a simulator emulator, even though it mocked the OS, the hardware specification going to be vary from each device to device. So some issues cannot find using simulator. You can find using the real device. You started the PM inspector successfully. How many of you have done it? Please raise the hand. How are you able to run the APM inspector? Okay, go to this project to download the APM desktop if you haven't. So please go to release and you can download the DMG or EXE file. Just Google APM desktop and you can find out the download space. I have pasted in the Slack channel also if you're missing it. Setting up the bed driver agent properly then you may get some error. So in order to set it up, what do you need to go? You go to the node modules. So this is a path. You go to the node modules installed and APM node modules, APM XC UI test driver, web driver agent. I will ping this in the Slack. So if you're on Mac machine then if you go there you can see that there is an X code project called web driver agent. So you can open it and you can see the implementations. The Slack one. Okay, sorry. It's not going. Yes. Yeah, you see it. So if you visit this project you can see how you can set up the web driver agent. So what do you need to do? You go to the project folder and run scripts bootstrap.js. So it will download all the necessary components for the web driver. Then if you want to run your test on a real iOS device, you need to sign with your developer account for this project. So you can share your developer's Apple account also. So you need to sign in here and there are two things there. You need to sign in properly and the certificate also need to be installed. Then only the app will work on the real iOS device. Okay, I cannot do a demo on this because I don't want to share the share my Apple account details. So I can share the URL for setting up the real device. So if you go to this page you can see what are the steps you need to perform to run your test on the real iPhone device. So you need to install a few more dependencies like iOS deploy, live by iMobile device, iOS deploy extra. So once you have the developer account you can set it up in two ways. One is manual configuration or automated configuration. So you just give the development team ID and the code sign identity. You can get it from developer.apple.com. If you sign in with your Apple account you can get these details. So you need to mention these details in your Xcode project. Okay, then only the web driver agent will be trying to install the application on the real device. Why it's worked on simulator because you don't need any code sign in functionality for the simulator. But if you are running it on the real device you will get an exception saying that the code sign in an arrow. Okay, so in order to do that you need to do all these steps. So you don't need to do it now. This is, this will take time. I think this is a subject for taking another APM meet-up itself. So you can try it yourself or in the future maybe we can take another session for this. How to set up the APM on the real iOS devices. For the simulator you just run only this command dot script slash good strap dot SH once you go to the file path. I already shared in the Slack channel. You can just go to the node modules APM XE UI driver then go to the web driver agent project. Yeah, I can show you. So here there is a folder called scripts. So there is something called build dot SH and boot strap dot SH. You just run this one so it will download all the dependency for you. It's already part of a Facebook project web driver project. Okay, so we just have a look at it how the sample code look like. So if you open it up maybe you can you can set it up afternoon so we can just see what's inside this. So I have a very simple test. So the first one is android test. So this is that the test is JUnit basic JUnit test. So the before session will be running before we start the session test and I have one test here which is nothing but just like I showed you earlier. It will click on the menu and it will click on the input control and it will try to enter the key weight Singapore APM meetup. It's as simple as that. Then before we start you need to start the APM session. So the one way is that there is an APM service builder command class. So this service will automatically start the APM server on your machine if you're using this. So you just give something like this. If you're using Mac machine then you need to give the main.js path here like this. Then you can call APM driver local service dot start. It will start the APM automatically for you. So the okay so when you start it it will pick up the random port. It won't be seven four two three. It could be any random port it will check. Another way is that you start the APM command on your local on your terminal or command prompt and you just give a URL like this. Okay so I prefer this method because especially when you go for parallel execution right. You need to give multiple port. So it always good you use your own URL instead of the service command. So what I have done here is that I have created the desired capabilities. So you already done the desired capabilities on IPM desktop right. You have space where what's the device name, what's the platform name etc. So if you're doing it Java then you can create something like this. So desired capability set capability then for the device name I am adding as the emulator name as 5554. Then avd nexus for avd is something like if your simulator emulator is switched off. If you are adding this one it will restart it. So if you are not giving this one if your emulator is switched off it won't work. So this line of code is just for automatically invoking your simulator. Any question? No. Then you need to add the apk file path. So I already put the apk files in this build folder. So it will fetch to build aws.apk file. Then I am hitting android driver and I am passing the URL as 4723. Then I'm going to click on all these things. So this is just like we recorded earlier. So I'm going to run this one. So it's running and it's trying to enter Singapore IPM meetup. So test is passed. So I'm just asserting. Once I enter the Singapore IPM meetup I am asserting whether the current text value is Singapore IPM meetup. So you can just get the text attribute of that particular text element and you can get that what's the current text is there and you just assert it. So let me close the apm desktop. If you want to see the logs then you start the apm apm command again. Okay so it started on 4723 and I'm going to run the same test again. So you can have a look at the command. So we try to find out which test need to be done and it launches and it click on the menu and enter the text field. Cool. Okay so the same test we're going to do for the iOS one. So the difference is that instead of invoking the Android driver you need to call the iOS driver. Okay so here is an example. So my device name is iPhone 6 and the automation name is xcua test. I have given the path to the application and I have given the iOS driver as running 4723 and I do the same thing. So the IDs are different for Android and iOS. So I'm going to click on input and I'm going to enter some values on this text field. Okay so I'm going to run this one. So since I already started the apm session so it will reuse the existing session. So it will start a new session there with all the desired capabilities that are given. So it starts the simulator here. Yeah it's starting and it will open the app and click on the input and okay I have added some extra step here to clear the existing test field. So you can see that it will do a long press and it will click on the selector and it will click on the delete button to clear the password. So if you want to look at the code I can show you. So I have created some method called clear text field. So what it do, if it is an android, this is how we detect whether the current run is android or iOS. So you can check driver instance of android driver or if it is iOS driver, if it is android you just specify android driver. Then if I want to clear the text field then I just need to click on the element first right. Then the current version that we use is 5.0.4 okay. So the latest beta is 6.0 beta 2. So in 6.0 that attach action class deprecated a lot of method. So if you are running the same test on 6.0 beta it won't work. So this will work only with 5.0.4. I will share you how to do how we how you can migrate to 6.0 later. I can share the link for that. So I am instantiating the attach action class. Then I do a long press. Once you do it long press then it will give me the option to select all, copy, something like that. Then I am clicking on the select all element. Then I am clicking on the delete. So this way you can clear any text that present on a text field. So by default this will be the syntax for whatever be the iOS application native, iOS application. Using this one you can clear any text field. If it is android it quite straight forward you just call element.clear. Okay you don't need to call any touch action. So you just you just clear the text field. Got it? Okay so we have two tests for one each one test each for android test and iOS test. So can you tell me what could be the issues if we are writing test like this? So this is my ender string on text field that's my test case. Is it a good way to do the script? Any any pros and cons you can see in this approach. Because we are testing the same application. What you have done? You have written two tests for android and iOS for the same same test case. Do you think how you can how you can just write only single test case which will work on both android and iOS. So that you don't need to maintain multiple test cases. Okay. Okay. Okay got it. Any other way? Okay okay we will discuss about this afternoon. Okay time for lunch. Have food guys. Yeah. So we can run this on your machine after you finish the lunch. The lunch is here. Yeah looks like that. So okay let's start. So my name is Jerry. One of the QA engineer in carousel. So today I'm going to talk about the pain. So what's the pain? The pain is not physical pain. It's when you guys using APUME and when you guys using APUME to writing test script using APUME inspect and you guys will feel pain. Even sometimes you want to smash your laptop. So let's see some of the pain. So the first one is so the first pain is slow. So sometimes some of the engineer ask me or email me or select me just talk about APUME is very slow. APUME sucks. So let's see some example. So some of the person they will use this feature from APUME inspect because APUME inspect is just provide us a feature which is just copy the expires. So you guys already use the APUME desktop and to launch the APUME inspect before right in this morning. So there's a feature you can just copy the expires. It's like this you can see there's a lot of like element type application element type window element type others. Actually this is not good case I think. I believe you guys know this this case. So I'm going to use the relative expires. So like you can use double slash and you can just relative locate any element. Maybe this has a bad way but in the mobile application right relative expires is still not a good way because if we use expires to get element from the mobile side it's going to be very slow. But for now we need insert a small advertisement is if you're using Selenium to automate do the automation right there's a very good tool is called relative expires which is Chrome plugin. So you guys can just use that to get you just you can locate any element then you will get a relative expires. So this tool the creator of this tool is Sean he's just just now one of the speaker. Yeah I'm just talking about your tool. Okay let's back. So next one. So this picture is captured from the APM inspect. So I guess you guys already used the APM inspect and there's one um component it will show the all the attribute here you can see the type enable visible xy and but if you guys want to locate and find this element right so you can see there's result any id result name and result any other useful information for you to looking for this element. So this is not a good case. So how we improve this one is we need make your app testable. So how we make your app testable is basically is you can communicate with your team with your developer and to make sure they can add the accessibility id add the name or add id add add something so this is the accessibility id that we just talked about this one in the morning right so this is the ios locator strategy accessibility id is the fastest way to find your element. So after that you can use the predicate queries and you also can use class chain. Does anyone see the last one? Last one is the x path because it's very slow it's not suitable for mobile application. So I don't suggest you guys use x path. Yeah just ignore this. So if you guys want to know about more details ios locator strategy just can yeah access this url uh why we uh why I introduce these ios locator strategies because sometimes um your team didn't got the chance to add the accessibility id for you so you still can use the other way to find your element. So your second pain is unstable. So most of the time you find you your test case once you test around your test case your first time your test case is okay everything is passed but sometimes it failed and sometimes it passed so this is not a good case so how we solve this kind of problem uh let's see some of the bad case first this is uh sometimes you will see some of the uh test engineer they will write this kind of uh test script is the element one click and slip five second and element two click is slip three and send the key and for username and slip four so this is not a good way and let's see another one so element one click and I try to click again because sometimes I found this click doesn't work so I try to click again and slip five minute also five second and I will check the page exists or not if exists I click another one so this is also a bad case for us it's not a good way how we solve this kind of problem because um if we are you're always using the slip right you cannot make sure your app is let's say you're doing the logging and you type uh you type the username and you type password you tap the uh login button and sometimes uh because after you you tap the login button you need to wait sometimes to go to the login page or go to the main page yes so you need to wait the page loaded so this is your time you take time sometimes so um but if you slip like five second and sometimes it need to take like 10 seconds in your script or if you so you will find your script is not stable so how we solve this kind of problem so basically we will use the synchronization so apium support two kinds of synchronization the first one is implicit weight what is implicit weight so um it actually is easy for you guys just started using the apium is because implicit weight is a global timeout for when you uh finding the element so let's say uh you want to find the element which is a text box so um the page is is loading when the page is loading right uh and apium will wait for your element exist or visible then we will do something like input uh or send string or just click like that so if you put the implicit weight if you use this way it will just wait for your element exist but this is the global way so if all the element was when you find all the element right it will just wait like 20 second if you said 20 second so um next one is the explicit weight what's the difference between the previous one is um explicit weight is to wait for some specific condition happen when some specific condition happen and it will go to another way it will just go to another uh steps go to next steps so in this way right if you're already familiar with the implicit weight and explicit weight and you are doing a very large project I suggest you guys using this weight because uh using this weight um we you can integrate this inside the page object pattern so uh sharp is gonna uh introduce us uh how we use uh page object pattern it's better to integrate inside okay so even we solve the synchronization we use the uh locator but sometimes you still feel very slow um in this case we actually can speed up again because sometimes your test case is smooth very large is because we always add in test case inside our test automation pipeline so your your execution of the time is very it's gonna be very slow so we have to do that so the first one is deep link so sometimes you'll feel your test case is you always like um do the logging you always go to uh page a and go to page b and actually you just want to test the page c but the page if you want reach to page c you have to like go to the page a page two then after that you go to page c so if you are not gonna do the ui n2 and ui automation testing it's just a automation ui automation testing to test some specific feature feature so we actually can use the deep link inside the apm apm is supposed to add so basically it's when you get the driver object you can just call the gate method and to pass in the deep link then it will just jump to the specific page so this can be save you a lot of time so you don't need to wait a lot of time on the page jump to the specific page another way is use mock server because when we are running ui automation a lot of time is also based on the when you send some request and you um you finish some form request like when you log in you need to communicate with the server side at this side also sometimes you need to take some times so we actually can use the mock server to replace that server then can save you a lot of time because mock server is your look is set up on your local machine last week is parallel so you actually can sit like in a carousel we actually sit device farm so you can just hand your multiple device and connect your janking server so you actually can run a parallel way and to speed up your test case so i prepared a bonus demo it called the new workflow apium client you guys know the apium support any language here any language is because apium is a protocol it is a w3c web driver protocol server so any language can support this is because any language just called just send request to this server and you can do the test automation so let's see the demo does anyone know the workflow application on ios know why use that okay um sorry i need the ios cable lightening you have number right yeah lightening cable anyone has i got it okay okay okay this app is called workflow basically it's previously it's a small company and they create this app and after that apple they just bought this company and now this app is under the app apple so this tools is actually is a automation tool on the ios platform so you actually can automate a lot of things like you can find a lot of the automation steps like find the photos and choose from list and share something so now i'm going to use these tools to automate by apium let's let's see the demo first so i tap wrong so it just input to and try to compute the sum now the value is five thousand so uh basically is the script is here so you can see the first one is text field one is basically is uh accessibility id for the first control and i use comma and the second parameter is the two thousand which is the value i want to input inside this control and the signal is yeah which is the signal component and i'm trying to input three thousand and last one is i'm trying to get the button the compute compute some button and trying to click this one this uh if i doing some different things okay then let's see something different you will clear the first one and clear the second one and tap the button okay so this demo is is um so why i need to show this demo is because i want to um that you guys know apium is uh actually is a server so you can use any tool any language any other stuff just if you follow the w3c protocol then you can control anything from the apium side yeah there's one more thing is the apium pro so this is you guys can see the last line is the website so this website is very um good way to you guys to start learning the apium is because this website is created by the main architecture of apium the main is called the johnson lips yeah it's a master okay so my set is done so any question if no question uh then we can follow just next steps uh sham side you can take it oh yeah hello yep okay just states so uh what are the common just states uh you will perform when you do the mobile testing tap swipe etc right so uh we will see how we can do this with apm how we can swipe and how we can scroll etc so you can have a look at the code so if you go to the just states um folder then you can see there is a tech traction class so um what i'm going to do uh i'm gonna open up the app and if you look at the native components then there are um some fields you can play around with scrolling and swiping swiping actions so we will see how you can do it please note that all this code will work only with java client 5.0.4 if you are using the latest beta there is a lot of deprecated methods then it won't be working okay so the common uh approach behind uh the scrolling is that the entire screen we will be taking at x y axis the horizontal one is x axis the vertical one is y axis so it will start from zero zero position so if you want to swipe from swipe from right to left you input coordinates x one y two x two y two then what using the swipe um command what apm will do it will try to swipe from right to left so you can just mock the action like that okay so if you open the apm inspector we can still do wait i will show you how okay so let me let me kill the apm session starting it the android okay let me start this one so let me click here native components okay so from this page right uh yeah maybe input controls uh so you can see another components here check button so you can do a swipe here so if you do a right swipe then it will move to the next component so how can you do that with apm so let me refresh and go to the current screen if you look at there is a tower for swipe by coordinates as the second button so you select this first and click on the first coordinate so it is x 584 y 738 then click on the second one then it will swipe it so how it detects this is the zero zero position you can see the x y coordinates and this is this will be with the width of the screen this will be the height right so you can write a method which finds uh maybe 75 percentage of the width and 25 percentage of the width as the y axis if you take the x at center then your uh x coordinates going to be the same one right so what i have done i have if you look at the swipe from right to left i'm getting the device screen size so if you are running on a different simulator or emulator or any other device your resolution gonna vary right so you need to capture the device size runtime so what we can do we can do something like this so you take the first root element and you fetch element dot get size get width element dot get size get height so like this wise you can get the uh width height as an integer array then you get it in this variable okay so here what i have done i am going to define my start x as 90 percentage of the width start y as 20 percentage of height index as 10 percentage of width and end y as same as uh start y so let's imagine how it works so my y component is same which means that y is the vertical one which means it's 20 percentage of the y right so it will always the for the two coordinates the y component solenoid scheme means it is going to be a horizontal line same as x axis and just like we saw in the api understood we're going to give the first point and the second point so what api will do it will swipe from right to left so the screen will move here okay so the same principle you can apply for scrolling the only thing is that uh your x1 x2 y1 y2 component is going to be if i you need to define like it's going to be a vertical swipe so if you look at here so from top to bottom i have the same start x and end y as width by 2 the only thing that start y and end y going to vary so it's all about giving the correct coordinates to the ipm and it starts wiping but most of these uh methods are getting deprecated so if you want to have a look at it how six points or a point beta support all this function you can just go here okay so i will share this along the slide so if you look at how the new client handles it let's say horizontal swipe right so this one imagine that there will be a slider associate with the scope so we need to find the slider first then you need to call the touch action like this so you you are passing the slider element and height and height of the zero is the x1 size dot height divided by two is this y coordinate with respect to the slider so you can have a look at it once the workshop finishes you can try it using the new java client and see how it works so this repository is also a fine example how the word quade and the advanced apm session so there are some already there are some app file and apk files you can play around with this one so i suggest you also have a look at it this repository and practice your apm tutorials so i can share this here okay so i want to run this test okay so in my base test i am just calling android first so when i call the android capabilities i am just initiating the android emulator that i just created earlier and in the test text i am going to do a test where if it is an android then i go to the native components i cannot do a right swipe then i do a left swipe then i gonna swipe again do the same thing then i gonna swipe to the bottom and back okay so we will see how it looks starting it should fail most of the thing i mean i didn't start the apm server did i yeah i already started with here so it should be working yeah so if you look at here then it's swiping then it was left swipe then do it again then i swipe to the bottom i do it once more then i scroll back to the bottom again one more scroll back yeah that has passed okay so this is the same principle you need to do for the ios also so ios also the swipe using coordinate should work we will see how so i'm just commenting the android caps and enabling ios caps so here i am just starting iphone x iphone 6 sorry so i'm running the drone again i just ran the wrong test sorry i need to run this one second so it's starting okay here you don't need to this one will be working and it will try to install the app and the web driver agent so it's installing okay so try to click on the inboard and swipe okay swipe left again for the scrolling i need to navigate to another page so i will do that now yeah so scrolling i can scroll down scrolling yes so you can actually yes possible so what do you need to do here right so here you can add the in how many seconds you want to actually scroll so some waiting speed something like if you want to scroll in one second two second three second you can show i will show the example okay so let me open this one it has some nice example okay so if you look at the java uh six beta so you can add something with with duration okay with duration of seconds two which means that the scrolling will happen in two seconds so if you want to get a much delay you just change here so it will be working it's in seconds yeah and uh the scrolling with the coordinates actually uh it's getting deprecated i have seen there is a bug associated with so it it's being fixed in the latest beta so if you want to get a stable build you can go with 5.0.4 and the current build will when it's become stable you can go for the java six that's what i suggest yeah yes that's what that's what i explained earlier i will show you how so i have a gets device screen size okay so what you do let's say runtime it's finding out the x-way coordinates so if you look at the android and ios just now it's going to be weighted it's not going to the same so we're going to take like 25 percentage of the width or 80 percentage of the height something like that you go you can go for so you don't need your hard code your coordinates any other dots clear okay good so long press i already explained during the uh first session how we we cleared the text field right we just called the long press and press the button and it will work so it will work only most of the time you can play it with the text fields uh now i didn't prepare for the double tap actually there is function for double tap we just do it so it's same as tapping twice in a with much higher speed so there is a dedicated oh or would be using two fingers i know i didn't prepare it actually maybe um i just need to check that one i need to confirm that one okay so maybe you can go with the page object model so any of you has worked with page object model the same pattern before okay so can you explain uh what's that when i just it says two values of the okay the reliability of the same code in multiple cases yes so for example if you have an element like a login which is used across multiple tests so if you can write a method for that particular thing using the page object model yeah as a traditional model you will write driver dot find elements in each test but when you go for page object model you are going to just call the method of that particular uh element and you will be reusing it yeah so if there is a change in future in regards to the element also the values it can be changed at 21 places and it will be reflected in all your cases okay yeah exactly so uh the goal behind the page object model is that you can categorize your object repository in much cooler way so you can extract all your elements ID from your test we can keep it separately so you can manage it better way then in page object model we going to split your test cases into different pages like login page home page etc so you don't need to write everything in a single suit so you can split your test cases based on your functionality or your pages so if you are defining the log let's say you are defining a new class for login page so the component associated it will be most probably the username field the password and the login button right so all this all these things you can associate with that particular page so in the future if you want to change something it quite easy if it is associated with the login page we just go to the login page java class and just change it okay then write one test and run on multiple platform so it quite easy using annotations what you can do with page object model let's say you have an app which works on ios android and web okay so what we can do you can write a single test which will work across all the platforms for example the login page you have an app in your office and uh take the example of login so how do you write a script you are you have a test case like once you login with the already username and password you should see the home page that's your test case okay so how can you write only one test case and you can execute it on all the platforms so that's where the page object model will help us then if you are uh sorry so if you are designing like this it's quite easy to migrate to other other testing framework like let's say you have page object model and currently you are using j unit so you want to migrate to kocombar or test ng platforms so it's quite easy for you because you have extracted all your object repository and other steps to different packages the only thing you need to change is how the test ng test need to be implemented so it's quite easy for you to migrate okay let me show you so here i will take the sample example so i have a test here called ender text test so we're going to do the alial example like you're going to click on the input text wheel and you're going to end up something okay so here i have two packages extra one is called objects the second one pages so for this test case i'm going to deal with two pages the first one is input controls page the second one is home page okay so if you look at the home page in the constructor i have something called page factory initialize elements new apm field decorator i am passing the home page object so if you do it do like this if you instantiate the home page object all the elements will be initialized so where do you keep the home page object so i have created a another class called home page object here so if you look at this one i have written all the elements like that it's no more diver dot find element by unhardcoded or xpath or id it's something like this so what i do that using android find by and ios find by annotations i have done something like this so it means that for this menu button if i am running an android test so it will try to find the element using this one so it automatically finds out the element based on the thing that you have given here okay so let's say imagine you want to run both android and ios so you can have multiple annotations here for android and ios so the only thing gonna vary is on which which is the syntax you're gonna use you're gonna use which chain of elements like id or xpath or accessibility id you can give here if you have a web application again you can use something on the top of it something like find by that's it so if you use find by it's going to be id is equal to abc it's going to be for the web driver so you can use the same script as long as you are using this particular element for your test automation you can do it for web automation also got it so there are multiple annotations here and ios find by ios xcu ua test find by ios android ua automator so so this is something you can use across common like it isn't and ios then just use ios find by give which type of method you're gonna use and just enter your input here so if you do like this runtime this elements will be instantiated when you call the home page object and when when it called call the object this constructor will be executed and it will instantiate everything okay if you look i will show you how it works so in my test i have created the home page object okay so if when i create the home page object what it do i am passing the driver so where is my driver my driver is in the best test class so i have defined the driver like this so i am instantiating the driver one before suit so when i when i start the test i will get the value of driver here and i am passing it here home page so i have my android android driver ready at the time where which this line being executed so it will go here then it will initialize all the object associated with that particular page okay then what i do using home page i am calling click menu so i have a method in home page called click menu what it do i am waiting until i see the menu button okay so i have a i have clear i have generator method called wait for element visible so what it do it will create an explicit wait of 20 second and it will wait till that particular element is visible okay so before i do anything any action i just need to ensure that the particular element is visible on the page so i do a click so using menu button menu button already i defined in the home page so i can just do a click then you need to return the page object so this is the basic concept so let's say you are doing a login once you login successfully you need to see the home page right so if you are writing a login login method what you can do you can return the home page up from once once the test is done so since i clicked on the menu i am still in the menu page i can return the home page itself so using the home page again i click input control so the same thing happening here i waiting for input control i click on input i am returning the input control page here i am returning another page again the same thing will happen like when i if i using this object if i call input control then i can enter text the ender text method is part of input control page and you can just send any keys and it will return the input control so ladies and gentlemen sorry there is a fire drill so it will be for five minutes so other firefighting equipment in the building all of the lips will be grounded for 10 minutes please do not be alarmed thank you okay thanks okay ladies and gentlemen your attention please in a few minutes they will return the fire alarm and other firefighting equipment in the building all of the lips will be grounded for 10 minutes please do not be alarmed thank you another software not software engineering but it's again testing so i can just write the method just like a chain of methods and i can just do it instead of writing the typical way like driver dot find element something like that i don't need to hard code it anymore so if you look at the page object then i can see this is going to be your object repository you just extracted all your elements id to a single package and it's quite easy for you to handle okay yeah then you just asset it and see whether it's working or not so i'm going to run this method okay it clicks yeah that's it that's past so if you want to run it on ios then it quite easy the same thing you can use the only thing going to vary is that instead of calling the driver object you need to instantiate an ios object but here you are not touching anything which means that the same existing method you can just reuse for ios yeah so basically you are not changing anything in the test case related methods here you don't need to change as long as the page looks same if there is any issues for example on the ios app there is no menu button right we are directly clicking on the input text from the homepage so that kind of things you need to handle so we can do something like if driver instance of ios driver then skip this portion something like that you can write right so as long as both ios application and android application having the same ui you can go with this one yeah oh okay so if you're if you don't mind to use the page object right so i mean not splitting it into another package you can still use it so what you can what how you can do like so instead of defining the home page here you can do something like this okay but the thing is that you need to bring down all your elements into the home page class this will occur worse so it depends on you like either you want to keep everything on the home page or you can split all the repos all the elements to another class yeah okay yeah yes yes correct exactly so you can handle such kind of things in a utility method or something like that anything any other which i didn't hear sorry jerry can you give the mic i didn't hear sorry okay okay so uh android studio we are not using you need to use the indelijay or eclipse okay yeah so you can download the indelijay or eclipse or any other idea for development and you can write the inbound yeah so that purely depends on which idea you want to use so basically it's a maven project i set up so you can just use any idea which support the maven so it's quite easy so if you look at the poem what it do i am just using a few jr files one is java client that is 510.4 then i'm using the test nj and j unit yeah i'm just specifying 1.8 that's it so you can just do the same configuration with any other idea it will work personally i like to do it in indelijay any other doubts no doubts cool i think uh we can just rest of the time people try to set up the repository on your local and we will try to run it and before that i have a quiz time so i just want to know how much you know about ipf from this session so are you ready okay please go to this ur it's going to be fun it's uh kahoot how any of any of you played kahoot before okay cool you guys know the fun okay uh before we start the quiz i just want to run a sample quiz uh just to um make sure that you familiarize with kahoot how how you can play it after this so so uh if you go to kahoot.in you can enter this id to join and you can enter your username and it will be displayed over here please join one two three four five six seven eight everyone join hey we have seven people right no no eight people yeah okay okay let's start so i'm going to start the how it works like the costume will be displayed on here and it will show four options so what do you need to do you can click there will be different symbol for each option there will be four options to click so you can click the answer on your phone okay on your phone only uh only the different color will be displayed so you can just click on it but the question will be on here so you need to read here and answer on your phone okay okay start only two questions sir okay one plus one yeah okay so which is the answer so you can just click on your symbol so you got only 14 seconds 13 12 okay so it's not three i accidentally made it correct answer three it's okay but this is how it works then wow where i got the first so even though everyone make the right answer it will dictate the response ring so who clicked first based on that one will be it will be arranged the ranking order okay so you should in way to click you should if you know the answer you just click it first before anyone do it okay and the next question two by zero okay two by zero it's not zero cool so we will wow empty got fast who's empty huh nice one okay i just need to okay i'm just starting the real quiz classic so you can again go to kahoot dot dot it and enter the new pin so here is the new pin you can enter this pin okay ten step it's 1.7.2 okay next actually this is not a okay it's the wrong answer basically you can write with any programming language but i accidentally added this one okay cool wow empty in 196 billboard just just just below oh it says 9.3 plus gain empty first oh yeah there is no such capability as can already again wow what happened empty oh it belongs to us easy question everyone made it oh it's not google just want to see who clicked the last option nice okay okay the first price is going to be who's will who is will oh okay nice so guys you can continue with setting up the repository we will help you yeah you can just run it the existing script and i just suggest you to add one more test case and we can help it out so we can do something like go to any other page and just click on anything and just validate it we can help you that so if you guys haven't set up the repo on your machine please try to do that please at least try to run it and then maybe try to you know either change a test case or add a test case so that all of you at least have some hands-on and if you have any questions then shum and jerry will be around to help you get you're with it or if there's something that you or if you already know appium and there's something that you different that you want to try that you haven't tried before this is also the place to try then at least you know there's people who can help you if you get stuck as well all right