cross platform appium tests: how to
DESCRIPTION
This is a presentation about mobile apps testing using Appium. The presentation conrtains tips on comprehensive testing of apps written for various devices and platforms. Presentation by Yaroslav Pernerovskyy (Lead Test Engineer, GlobalLogic, Kyiv), delivered at UA Mobile, November 22, 2014. More details - http://uamobile.orgTRANSCRIPT
![Page 1: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/1.jpg)
Cross platform Appium tests
How To
![Page 2: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/2.jpg)
Who?
Yaroslav Pernerovskyy
• Test Automation Lead in Global Logic
y.pernerovskyy
www.linkedin.com/pub/yaroslav-pernerovsky/1/9b5/55
![Page 3: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/3.jpg)
What?
![Page 4: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/4.jpg)
Why?
• Web application
• Selenium based test framework (Java)
• iOS and Android clients
• Reuse framework features for mobile
• Open Source (Free of charge)
• Easy setup and configuration
• Scalable and flexible
![Page 5: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/5.jpg)
Appium Rules
• Test the same app you submit to the marketplace
• Write your tests in any language, using any framework
• Use a standard automation specification and API
• Build a large and thriving open-source community effort
http://appium.io/slate/en/master/?ruby#appium-philosophy
![Page 6: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/6.jpg)
iOSAndroid
Firefox OSTest Script
JSON Wire protocol
How it works
Native automation instruments
Remote Web Driver
node.js
UiAutomator
Selendroid
Instruments
Marionette
![Page 7: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/7.jpg)
Features
• Native automation instruments – Android: UiAutomator (4.2), Selendroid (2.3)
– iOS: UIAutomation
– Firefox OS: Marionette
• Emulators/simulators and real devices
• Web Driver API
• Selenium Grid
• Ruby, Python, Java, JavaScript, PHP, C#...
• Documentation
• http://appium.io/
![Page 8: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/8.jpg)
Install
• npm install -g appium
• Appium.dmg
• Appium.exe• https://bitbucket.org/appium/appium.app/downloads/
![Page 9: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/9.jpg)
Appium GUI
![Page 10: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/10.jpg)
Command line
appium -a 192.168.10.11 -p 4723
--device-name "iPad Simulator" --force-ipad
--orientation LANDSCAPE --pre-launch
--app /products/testapp.app
--nodeconfig /appium/nodeconfig.json
![Page 11: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/11.jpg)
nodeconfig.json
![Page 12: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/12.jpg)
Issues
• Stability issues
• Actions depends on platform
• Problems with accessing some elements
• iOS specific issues
– Single app test
– Hardware keys support
– One emulator instance
– xpath
![Page 13: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/13.jpg)
Application types
Mobile Browser
Device APIs
Native App
0101010101010101010101010100010011110101001001110010100
00001
<html><body>
<input type="button" value=" + " onclick="plus()"><script language="JavaScript">unction plus()
{rezultat.value=znah_1.value-(-1)*znah_2.value;}
</body></html>
Device APIs
Native Container
<html><body>
<input type="button" value=" + " onclick="plus()"><script language="JavaScript">unction plus()
{rezultat.value=znah_1.value
![Page 14: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/14.jpg)
Web apps
• Similar layouts
• Same locators
• Absolutely the same tests can be executed
• Not require additional efforts
![Page 15: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/15.jpg)
Native apps
• Different layout
• Different locators
• Platform specific UI elements
• Test cases should be specially designed
• Require additional efforts
![Page 16: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/16.jpg)
Test environment
SVN
Jenkins
Web Firefox
Web Chrome
Mobile iOS
Mobile Android
……
Selenium Grid
Chrome, FF
IE
Safari
adb
iPad simulator
iPhone simulator
Nexus 7
Nexus 5
Ap
piu
mreports
![Page 17: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/17.jpg)
Sele
niu
m
Test framework overview
class Drivers
class Bindings
Page ObjectsPage Objects
Page ObjectsPage Objects
TestsTests
TestsTests
Global ConfigurationTest data
loggers/db tools/service tools etc.
![Page 18: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/18.jpg)
Tests
• Test steps should be similar for both platforms
@Test (dataProvider = "Logins")
@Features ("Login")
@Stories ("User should not be able to login with incorrect credentials")
public void verify_Incorrect_Login(Map<String, String> testData){
loginScreen.verifyScreenLoaded();
loginScreen.submitLogin(testData.get("User"),testData.get("Password"));
loginScreen.verifyAndCloseErrorMessage(testData.get("Message"));
loginScreen.verifyScreenLoaded();
}
![Page 19: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/19.jpg)
Page Objects
• Do not hardcode locators in Page objects
• Store it in external object
• Implement platform specific code
• Create bindings for platform specific actions
![Page 20: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/20.jpg)
Page Object
public class LoginScreen extends Bindings {
public LoginScreen(Instance instance) {super(instance);initLocators();
}
private static String LoginScreenUserField;private static String LoginScreenPasswordField;private static String LoginScreenSubmitLoginBtn;private static String LoginScreenErrorMsg;private static String LoginScreenErrorMsgCloseBtn;
private void initLocators() {
LoginScreenUserField = locators.get("LoginScreenUserField");LoginScreenPasswordField = locators.get("LoginScreenPasswordField");LoginScreenSubmitLoginButton = locators.get("LoginScreenSubmitLoginButton");LoginScreenErrorMsg = locators.get("LoginScreenErrorMsg");LoginScreenErrorMsgCloseBtn = locators.get("LoginScreenErrorMsgCloseBtn");
}... ...
![Page 21: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/21.jpg)
Page Object
@Steppublic void submitLogin(String login, String pass) {
typeKeys(LoginScreenUserField, login);typeKeys(LoginScreenPasswordField, pass);tap(LoginScreenSubmitLoginBtn);
}
@Steppublic void verifyAndCloseErrorMessage(String Message) {
verifyElementPresent(LoginScreenErrorMsg);assetEqual(getText(LoginScreenErrorMsg),Message);
if (instance.getPlatform().equals("ios"))tap(LoginScreenErrorMsgCloseBtn);elseclickBackBtn();
}
![Page 22: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/22.jpg)
Locators
<?xml version='1.0' encoding='UTF-8'?><dataset><LOCATORNAME="LoginScreenUserField" ANDROID="id=com.example.myapp:id/txtUser"IOS="xpath=//window[1]/textfield[1]"/>
<LOCATORNAME="LoginScreenPasswordField" ANDROID="id=com.example.myapp:id/txtPassword"IOS="xpath=//window[1]/textfield[2]"/>
<LOCATORNAME="LoginScreenSubmitLoginButton" ANDROID="name=Login " IOS="name=Login"/>
<LOCATORNAME="LoginScreenErrorMsg" ANDROID="id=com.example.myapp:id/errText" IOS="xpath=//*/UIAPopover[contains(@name,'ErrorText')]"/>
<LOCATORNAME="LoginScreenErrorMsgCloseBtn" IOS="name=Ok"/>
...
...
![Page 23: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/23.jpg)
Get locators for Android
![Page 24: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/24.jpg)
Get locators for iOS
![Page 25: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/25.jpg)
Summary
• WebDriver concept
• Cross platform
• Open Source
• Easy integration into Selenium based frameworks
• Supported by community
• One test for two platforms
![Page 26: Cross Platform Appium Tests: How To](https://reader034.vdocuments.us/reader034/viewer/2022052623/55996a1f1a28ab096a8b4710/html5/thumbnails/26.jpg)
KEEPCALM
AND
ASKQUESTIONS