N5ken's technical blog

Just another WordPress.com site

Category Archives: JRuby

IRB Trick

IRB subsessions let you try things without ending or affecting any of your existing subsessions. The commands to work with subsessions are:

irb start a new subsession
jobs list subsessions
fg # switch to a subsession
kill # kill a subsession

>> my_string = "foo"
=> "foo"
>> irb
>> my_string
NameError: undefined local variable or method `my_string' for main:Object
from (irb#1):1
>> jobs
=> #0->irb on main (#: stop)
#1->irb#1 on main (#: running)
>> fg 0
=> #, @signal_status=:IN_EVAL, @scanner=#>
>> my_string
=> "foo"

Using Selenium Android Driver in JRuby

Currently, in the official Selenium releases, the Android Driver only available in Java, not Ruby, so here is a test to use this driver in other language:

For the top, preparing the environment:

Follow the tutorial to complete: http://code.google.com/p/selenium/wiki/AndroidDriver setting up the Android Emulator

Install the SDK

Download the Android SDK, and unpack it in a directory, say ~/android_sdk/ .

Note 1: if your sdk is installed in a different folder, edit ./properties.yml to reflect that location. ./properties.yml also specifies the Android platform version to use – again update the value to the version of the sdk you want to use e.g. version 8 for Android 2.2

Note2: On Linux, android SDK is distributed for 32-bits machine. If you have a 64-bit machine you will need to install ia32-libs http://developer.android.com/sdk/installing.html#troubleshooting

Execute the following command to create a new Android Virtual Device (avd):

$cd ~/android_sdk/tools/
$./android create avd -n my_android -t 12 -c 100M

-n or naming your android virtual device.

-t for specifying the target. (“./android list targets” will give you a list of all available targets). Make sure the target level you selected corresponds to the latest API level.

-c option is for the SD card storage space.

When prompted “Do you wish to create a custom hardware profile no” enter “no”.

Note: an issue has been discovered with the Java-to-JavaScript bridge in version 2.3 of the emulator which causes problems for the Android Driver. Currently we recommend using version of the Android platform 2.2 for AVDs.

Start the Emulator

Start the emulator (this can take a while):

$./emulator -avd my_android &

Install the Application

Install Android WebDriver Application. Wait until the emulator has started and the home screen is ready. Install android-server.apk:

$./adb -e install -r android-server.apk

If you face an issue, make sure you are allowing installation of application not coming from Android Market (Android Emulator -> Settings -> Applications -> Unknown sources is checked)

Setup Port Forwarding

In a terminal type:

$~/android_sdk/adb forward tcp:8080 tcp:8080

This will make the android server available at http://localhost:8080/wd/hub

Start the WebDriver Server on the device or emulator

Start the WebDriver application just installed in the device or emulator.

Tips

  • Remember to set the following settings on your device: Settings -> Applications -> Development -> Check “USB debugging”, “Stay Awake” and “Allow mock locations”.
  • Restart adb if you have networking errors reported when your tests run. Sometimes there are issues connecting to the device / emulator after switching devices. run adb kill-server followed by adb start-server then setup port forwarding again for the device you want to use.

Run Your Tests

Run the JRuby codes bellow to launch the example test, you can also find out the missing apache and json library in http://www.findjar.com:

require 'java'
require 'guava-r09.jar'
require 'org/openqa/selenium/base.jar'
require 'org/openqa/selenium/android/android.jar'
require 'org/openqa/selenium/webdriver-api.jar'
require 'org/openqa/selenium/remote/remote.jar'
require 'org/openqa/selenium/remote/common.jar'
require 'org/openqa/selenium/net/net.jar'
require 'org/openqa/selenium/browserlaunchers/browserlaunchers.jar'
require 'org/openqa/selenium/browserlaunchers/launcher-utils.jar'
require 'org/openqa/selenium/browserlaunchers/locators/locators.jar'
require 'httpcomponents-client-4.1.1/lib/httpcore-4.1.jar'
require 'httpcomponents-client-4.1.1/lib/httpclient-4.1.1.jar'
require 'commons-logging-1.1.1/commons-logging-1.1.1.jar'
require 'json-jena-1.0.jar'

import 'org.openqa.selenium.By'
import 'org.openqa.selenium.WebElement'
import 'org.openqa.selenium.android.AndroidDriver'
import 'org.openqa.selenium.remote.SessionId'
import 'org.apache.http.HttpHost'
import 'org.apache.http.client.ClientProtocolException'

driver = AndroidDriver.new
driver.get "http://www.google.com.hk"

element = driver.find_element By.name("q")
element.send_keys "Cheese!"
element.submit

driver.quit

to be continued…

Follow

Get every new post delivered to your Inbox.