Thursday, 9 May 2013

Calabash-IOS: Tips to search elements in View and webview

Calabash supports identification of view both using xpath & CSS

Its confirmed in in here https://groups.google.com/forum/#!msg/calabash-ios/nubfmY-6jbM/aSoYtW9mT8cJ

But this information is missing in wiki page

Usage :

Using CSS to identify elements : query("webView css:'#header'")
for xpath identification replace css by xpath and specify the path.

In Calabash-IOS there is no way to get source of HTML page, Getting elements from page

can be bit tricky, There are several possibilities to get past this 

check my video on this www.youtube.com/watch?v=w5rxvI3w2Ss

And also check below video






 

1) Use query("webView css:'*'") to get all associated elements on page then search for text you are looking at.
Index of results returned from query can be used to identify elements
Example:

res=query("webView css:'*'")
res[12] - could be the element you may want to verify

2) To verify if object is shown on screen .empty? can be very handy
 res=query("view text:'SomeText'").empty? # res is false if element is present
 use begin rescue block (in Ruby) to catch these exceptions and handle them


3) use regular expression 
query("view {text LIKE '*hello*'} ")

4) Using variables in search
text_to_check="hello"
query("view {text LIKE '*#{text_to_check}*'} ") 

5) Looping up and down until text found


while(true)
  begin 
    #check text found and click
  rescue
    #if there was any exception reported
    scroll("view",:down)
  end

end  

or 
wait_poll(:until_exists => "label text:'Cell 22'", :timeout => 20) do
  scroll("tableView", :down)
end
 
6)For converting case use upcase function
"hello".upcase

7) to check first & last result of array
arr=query("view {text LIKE '*#{text_to_check}*'} ")
arr.first 
arr.last  



Monday, 6 May 2013

Calabash-IOS helping tester to setup project - Not a guide for devs

This is a like a quick guide to help tester setup certificate and IOS project for calabash-ios

1) Create apple developer account
https://developer.apple.com/ then add your account to your company list for that you may need invitation from one of other team members who are already in that group

2) Go to https://developer.apple.com/devcenter/ios/index.action and log in with user name & pwd
  • Go to Certificates, Identifiers & Profiles
  • under Certificates, download certificate for ur name
  • Double click on and add it login key chain
3) Configuring IOS device
  • Connect device
  • Go to xcode -> window > organizer 
  • select device -> click on add portal
Now you device must be all set to be used for current project
Error & Solution:
to use dev certificate that was present on old machine on new machine export p12 certificate from previous machine and then use it here
This link will help in doing that - http://www.utexas.edu/its/help/user-certs/812

Setting folder name to show in mac terminal prompt

To set terminal prompt to show name of current folder use the below command

echo 'export PS1="\W \$: "' >> ~/.bash_profile 

PS1 can be configured to show the terminal prompt to show below options
  • \d – Current date
  • \t – Current time
  • \h – Host name
  • \# – Command number
  • \u – User name
  • \W – Current working directory (ie: Desktop/)
  • \w – Current working directory, full path (ie: /Users/Admin/Desktop)
 


Calabash-ios backdoor - A Magic way to set precondition in calabash - Be careful & choosy while using it

Lets looks at the Use of it

I had a test app for which i had to write tests but after each login, to logout I had to navigate 4-5 pages, This added extra overhead to my testing

Suppose i have 3 tests and second test fails without logging out I would never have starting point for my 3rd test and hence that would fail
I wanted a single start point from where I start my test each time. Thats when I decided to use calabash backdoor function.

Lets looks at changes first
  
1) Added below function delaration in app AppDelegate.m
This code will change for your application but the way of using it is similar.
In my case dev team member helped me with logout functionality

#pragma mark -
#pragma mark - Calabash Method
- (NSString *) calabashBackdoor:(NSString *)aIgnorable
{
    [[ONEApplication sharedInstance] logOut];
    AppDelegate* delegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
    [delegate showLoggedOutViewController];
   
    return aIgnorable;
}


2) Add declaration in AppDelegate.h
This can be kept as below or method name can be changed but method signature has to be maintained.
//Calabash Method
- (NSString *) calabashBackdoor:(NSString *)aIgnorable;

3) Now compile the Application
Time of verify changes are reflected or not



4) Deploy application , Launch calabash-ios console
run  'calabashBackdoor' command and this must be executed on the application

Simple steps to get ruby 1.9.3 for calabash on mac osx 10.7

I did face this problem of getting ruby 1.9.3 on mac osx 10.7
Then I realized I need rvm but before doing all this I did need xcode installed
this must be easy for mac experts not for me definitely

Here are simple steps for a mac beginner to get ruby 1.9.3

  • Download install xcode from appstore
  • Install command line tools from xcode - Go to xcode->preferences->downloads->components->commandline tools 
  • Install RVM
          \curl -#L https://get.rvm.io | bash -s stable --autolibs=3 --ruby
  • Install ruby using RVM - Install ruby 1.9.3 and use it
    rvm install 1.9.3
    rvm use 1.9.3
     

Errors & Solution

If there are error in RVM installation do this
Type following commands
~ $: source ~/.rvm/scripts/rvm
~ $: type rvm | head -n 1
rvm is a function
~ $: vi ~/.bash_profile add this line into bash_profile 
"source ~/.rvm/scripts/rvm"
Install ruby 1.9.3 and use it
 

Thursday, 11 April 2013

Adb command sequence to take picture and save it

there are list of ruby commands that can be used in calabash-android to get pciture from camera and save it

I had this problem running commands from calabash to take pciture, I was able to get past it using these 2 functions


def takePicFromCamera
   system('adb shell input keyevent 27') # click take picture button
end

  # save picture by clicking on save
  def savePicture
    system('adb shell input keyevent 21')
    Page.new.waitFor(2) # waitfor 2 second
    system('adb shell input keyevent 22') # select save
    Page.new.waitFor(2) # waitfor 2 second
    system('adb shell input keyevent 23') # Click save
    Page.new.waitFor(5) # waitfor 5 second
end

Sunday, 10 March 2013

Robotium testing webview example (test application and application) source download



Robotium test source code - https://github.com/tejasv02/Robotium4Webviewtest 
Webview sample test application - 
https://github.com/tejasv02/Androidwebviewsampleapp

 Robotium 4.0 has been released with webview support which enables testing of hybrid applications .
Some new functionalities have been added which enables testing of webpage embedded within native app also called as hybrid android application.
new functionalities inculde:
waitForWebElement(By by), clickOnWebElement(WebElement webElement), enterTextInWebElement(By by, String text), typeTextInWebElement(By by, String text), clearTextInWebElement(By by), getWebElement(By by, int index)

webview component is present in this file : https://github.com/tejasv02/Androidwebviewsampleapp/blob/master/src/com/myapp/WebViewActivity.java

customHtml  string is used to create a temporary html, which is used to fill 
webview and then this html is loaded into webview 

String customHtml = "<html><body><h1>Hello, WebView</h1></body></html>";
webView.loadData(customHtml, "text/html", "UTF-8"); // if this line is commented , 
// uncomment it for test purpose


Tests are located in - https://github.com/tejasv02/Robotium4Webviewtest/blob/master/Robotium4webviewtest/src/com/testcalc/Testcase1.java


package com.testcalc;
import java.io.IOException;
import java.util.ArrayList;
import com.jayway.android.robotium.solo.By;
import android.view.View;
public class Testcase1 extends Apptest{
public Testcase1() throws ClassNotFoundException {
super();
}
public void testDisplayBlackBox() throws IOException {
Commonval.log(this.getName().toString());
solo.clickOnText("Go to");
solo.waitForWebElement(By.textContent("Hello, WebView"), 10, false);
solo.sleep(5000);
}
}


This is not an exhaustive explanation for a starter but should suffice some one who knows a bit of robotium,
Please feel free to leave comments below




Steps 

Part1: running webview application
Steps
1) Go to github copy project link - https://github.com/tejasv02/Androidwebviewsampleapp.git
2) Import project into eclipse
3) Solve dependency errors
4) Run web view application test as Android application

Part2: Testing webview application
Steps:
1) Go to github and copy project link - https://github.com/tejasv02/Robotium4Webviewtest.git
2) Import project into eclipse
3) Solve dependency errors
4) Run web view application test as Android application

Dependency
    Git plugin to download project from github -     http://download.eclipse.org/egit/updates
  
  
Problems : The import android cannot be resolved
    Install plugin for android - https://dl-ssl.google.com/android/eclipse/
    set path for Android SDK - Windows -> preferences -> Android


Video