2. Ground Rules
• Post on FB and Tweet now
• Disturb Everyone during the
session
– Not by phone rings
– Not by local talks
– By more information and
questions
2@akshaymathu @sid_chilling @nikitascorner
3. Let’s Know Each Other
• Do you code?
• Do you test?
• OS?
• Programing Language?
• HTML DOM, CSS Selectors, JQuery ?
• Why are you attending?
3@akshaymathu @sid_chilling @nikitascorner
4. Akshay Mathur
• Managed development, testing and release
teams in last 14+ years
– Currently Principal Architect at ShopSocially
• Founding Team Member of
– ShopSocially (Enabling “social” for retailers)
– AirTight Neworks (Global leader of WIPS)
4@akshaymathu @sid_chilling @nikitascorner
5. Siddharth Saha
• CS graduate from NIT Rourkela
• 3+ years in Software Product industry
• Worked in Telecom (Drishti Soft) and Social
Shopping (ShopSocially) Domains
• Currently Junior Application Architect at
ShopSocially
5@akshaymathu @sid_chilling @nikitascorner
6. Nikita Mundhada
• CS graduate from PICT Pune
• 2 years in Software Product industry
• Worked
– at Amdocs as a Java Developer
– at ShopSocially as a Full Stack Developer
• Going back to college
– For MS at Georgia Institute of Technology
6@akshaymathu @sid_chilling @nikitascorner
7. Agenda
• Problem Statement
– What are single page apps and how are they different
– Why other tools fail testing dynamic DoM in browser
• Introduction to Server Side Javascript and Related
Technologies
– Headless Browser, NodeJS, PhantomJS, CasperJS, Splinter
• Demonstrations and Code Walkthroughs
– Invoking UI test suite, in the browser from Python console,
using Splinter
– Testing UI from command line, without opening the
browser, using CasperJS
7@akshaymathu @sid_chilling @nikitascorner
10. Traditional Apps
• Action items are implemented as hyperlinks to
URLs
• Different web page is requested from server
for next step of workflow
• Browser’s address bar is the only progress
indicator
• Tooltips are available for in-context help
10@akshaymathu @sid_chilling @nikitascorner
11. Page Construction
• On Server:
– Dynamic portion of the page executes and brings
the data
– HTML gets constructed using PHP, ASP, JSP etc.
• On Client:
– Browser renders the HTML DOM
– No major change happens in HTML DOM after
rendering
• Light use of Javascript
11@akshaymathu @sid_chilling @nikitascorner
12. Traditional Testing Tools Work Fine
• Get a copy of HTML DOM just before it is
being rendered by web browser
• Do not execute Javascript
• For recognizing DOM elements:
– Old: Use window coordinates
– New: Use Object’s xPath
• Use UI elements/Events for interactions
12@akshaymathu @sid_chilling @nikitascorner
14. Modern Apps
• Javascript event handlers are attached to on-
screen actions
• Only required portion of page gets updated as
needed
• Loading indicator appears whenever user
need to wait
• Rich in-context interaction, in form of light-
box popups
14@akshaymathu @sid_chilling @nikitascorner
15. Page Construction
• On Server:
– Minimal HTML rendering
– Typically no (or minimum) data-driven components
– Separate calls for data
• On Client:
– Data requested from Server using AJAX calls
– HTML DOM changes dynamically
– Workflow implemented in browser
• Heavy use of Javascript
– Jquery, BackboneJS etc.
15@akshaymathu @sid_chilling @nikitascorner
16. Traditional Testing Tools Fail
• Changed HTML DOM is not available to the
tool
• xPaths of existing elements change
16@akshaymathu @sid_chilling @nikitascorner
17. Requirements for New Age Tools
• Should have complete control over HTML
DOM and the Javascript on the page
– Should be able to fire DOM events as user does
– Should be able run Javascript on the page as it
happens in the browser on user’s action
– Should be able to get changed DOM as needed
• Should use selectors rather than xPaths
• Should not depend too much on screen
painting
17@akshaymathu @sid_chilling @nikitascorner
20. NodeJS
• Technology that allows to use Javascript on
server side or in command line environment
– A complete app-server and web-framework can
be written using NodeJS
• Even-driven and Asynchronous programming
– High performance
– Low response time
20@akshaymathu @sid_chilling @nikitascorner
21. Headless Browser
• Browser without Graphical User Interface
– Implements everything same as web browsers
• HTTP Request and Response handling
• Rendering Engine
• HTTP DOM and Events
• Javascript Runtime Environment
• Used for website testing, screen capture and
page automation from command line
21@akshaymathu @sid_chilling @nikitascorner
22. Headless Browsers
• Phantom JS
– Headless browser implementing Webkit
• Similar to Chrome, Safari
• Slimer JS
– Upcoming headless browser implementing Gecko
• Similar to Firefox
22@akshaymathu @sid_chilling @nikitascorner
24. Casper JS
• Tool built on top of Headless Browsers
– Same code works for PhantomJS and SlimerJS
• Eases the process of defining a full navigation
scenario
• Provides syntactic sugar for common tasks:
– Filling Forms
– Clicking and following links
– Logging events
– Finding DOM elements
– …
24@akshaymathu @sid_chilling @nikitascorner
25. Splinter
• Open source tool for testing web applications
using Python
• An abstraction layer on top of existing
browser automation tools:
– Selenium
– PhantomJS
– Zope
25@akshaymathu @sid_chilling @nikitascorner
27. Demonstrations
• Important points to note
– The UI under test is sensitive to screen size
– The test includes interacting with the elements in
an iFrame
– The DOM in the iFrame changes dynamically
without loading the complete page
27@akshaymathu @sid_chilling @nikitascorner
28. ShopSocially
• Provides social apps to online retailers
– Most of apps are embed-able on web pages
• Execute in iFrame
• Do not reload page for better user experience
28@akshaymathu @sid_chilling @nikitascorner
30. Splinter
• Open source tool for testing web applications
using Python
• An abstraction layer on top of existing
browser automation tools:
– Selenium
– PhantomJS
– Zope
30@akshaymathu @sid_chilling @nikitascorner
31. Splinter
• Simple Python APIs
• Multiple webdrivers
– Chrome, Firefox, PhatomJS, Zope
– One code to rule them all
• CSS and Xpath Selectors
• Support for iframe and alerts
• Executes JavaScript
31@akshaymathu @sid_chilling @nikitascorner
32. Do with Splinter
• Browser Navigation
• Finding elements
• Mouse interactions
• Interacting with elements and forms
• Cookies manipulation
• Execute JavaScript
• Deal with HTTP status codes
• Interact with iframes, alerts and prompts
32@akshaymathu @sid_chilling @nikitascorner
38. Interacting with Form Elements
browser.fill(„query‟,
„Siddharth‟)
browser.choose(„some-radio‟,
„radio-value‟)
browser.select(„my-dropdown‟,
„my-fav-value‟)
38@akshaymathu @sid_chilling @nikitascorner
43. Casper JS
• Tool built on top of Headless Browsers
– Same code works for PhantomJS and SlimerJS
• Eases the process of defining a full navigation
scenario
• Provides syntactic sugar for common tasks:
– Filling Forms
– Clicking and following links
– Logging events
– Finding DOM elements
– …
43@akshaymathu @sid_chilling @nikitascorner
44. Casper JS
• Code written in only JavaScript/CoffeeScript
• Casper JS and the javascript in the page
execute in their own sandboxes
– Specific call is available to communicate
• Tester module provides functions and
assertions for testing
• Utils module provide general utilities for I/O
44@akshaymathu @sid_chilling @nikitascorner
45. Skeleton of a CasperJS program
@akshaymathu @sid_chilling @nikitascorner 45
then()
run()
evaluate()
Passes
Function
Returns
Value
Page DOM SandboxCasperJS Sandbox
Executes
Function
55. Result Format
<testsuite>
<testcase classname="samples" name="Get-a-Fan App Sidebar loaded." time="39.647">
</testcase>
<testcase classname="samples" name="Found “Special-20” within the selector
coupon_area1 > span" time="0.013">
<failure type="assertSelectorHasText">Found "Special-20" within the selector
"#coupon_area1 > span“>
</failure>
</testcase>
</testsuite>
55@akshaymathu @sid_chilling @nikitascorner
56. Do with CasperJS
• Test webpages
– Report results in X-unit XML format
– Integrate with Continuous Integration tool like
Jenkins
• Take screenshots
• Fill forms
• Insert scripts into webpages
• Download links
56@akshaymathu @sid_chilling @nikitascorner
58. Summary
• Nature of web apps is changing
– Javascript is becoming more and more powerful
– Dynamism has come to browser
• Testing tools are also catching up
– Dependency on UI layout is decreasing
• Using newer tools and technologies, We can
save a lot
– Tests are faster as they need not wait for UI
– Multiple CasperJS tests can run on same machine
58@akshaymathu @sid_chilling @nikitascorner