You are currently browsing the monthly archive for September 2009.
The output html of testng‘s reporter has the columns “Test method
” and “Instance
” that document each test run.
“Test method
” can be customized by defining public String getTestName()
method in the class providing the test method.
“Instance
” can be customized by defining public String toString()
method in the class providing the test method.
In this posting I document extending Selenium server with a custom javascript method, getAllRadios()
, to return all radio button elements in a page. It’s based on the getAllButtons()
that is stock in Selenium.
I will demonstrate two ways to add this custom method. The first strategy is to add the custom method to the native javascript files that ship with Selenium server. This is not the recommended way to extend Selenium but it is an almost guaranteed way to be sure the server picks up my new method and that frees me to focus on getting my client syntax right for calling the new method using the client’s doCommand()
method.
Method 1 – selenium-browserbot.js + selenium-api.js
Unpack the server jar into a temporary directory to get access to the selenium-browserbot.js
and selenium-api.js
files.
$ jar xf ../selenium-server.jar
The new custom method is added to core/scripts/selenium-browserbot.js
. It is a slightly modified version of getAllButtons()
which is defined in the same file.
BrowserBot.prototype.getAllRadios = function() {
var elements = this.getDocument().getElementsByTagName('input');
var result = [];
for (var i = 0; i < elements.length; i++) {
if (elements[i].type == 'radio') {
result.push(elements[i].id);
}
}
return result;
};
and then the new method is exposed to the Selenium API in core/scripts/selenium-api.js
, again modeling after getAllButtons()
in selenium-api.js
.
Selenium.prototype.getAllRadios = function() {
return this.browserbot.getAllButtons();
};
Now rebundle the updated javascript into a new server jar, replacing the original.
[21:01 20090906 crashing@server /selenium-server-1.0.1/temp]
$ jar cmf META-INF/MANIFEST.MF ../selenium-server.jar .
Method 2 – user-extension.js
The better way to extend Selenium is to add methods to the user-extensions.js
file. This avoids screwing around with the native server jar. I initiall had some trouble getting this working, hence the Method 1 approach, but after a bit of futzing I finally got this to work.
Selenium.prototype.getAllRadios = function() {
var elements = this.browserbot.getDocument().getElementsByTagName('input');
var result = [];
for (var i = 0; i < elements.length; i++) {
if (elements[i].type == 'radio') {
result.push(elements[i].id);
}
}
return result;
};
This is basically the same method used in selenium-browserbot.js
. The important changed bits are (1) the method is attached to the Selenium object instead of the BrowserBot (Selenium.prototype
rather than BrowserBot.prototype
) and (2) calling getDocument()
on the browserbot
instance.
I start the Selenium server with the -userExtensions
option pointing to the user-extensions.js
file.
/selenium-server-1.0.1/selenium-server.jar \
-userExtensions /user-extensions.js
Client Coding
For either of the above methods of extending the Selenium server, I call this new method in my client code with the doCommand()
.
proc = new HttpCommandProcessor(seleniumServerHost,
seleniumServerPort, brower, seleniumServerStartUrl);
selenium = new DefaultSelenium(proc);
selenium.open(url);
// radio buttons returned as comma-delimited strings
String allRadios = proc.doCommand("getAllRadios", null);
// alternatively, get radio buttons as a String array
String[] radios = proc.getStringArray("getAllRadios", null);
for (String radio : radios) {
System.out.println(radio);
}
To call custom doCommand()
‘s, it’s necessary to instantiate with DefaultSelenium(proc)
to inject the HttpCommandProcessor
into the DefaultSelenium
object.
Related:
Select the ids of radio buttons in a page using selenium
User-Extensions
Google has made its search input box bigger and its font size larger. Excuse me, they S-U-P-E-R-sized! it. It’s not a mistake, indeed Google actually seems proud of it.
Fortunately, Safari and Firefox empowers mere-mortal users to fix this eyesore with a custom stylesheet. Simply add the following to your userContent.css
and restart the web browser. Additional general information on userContent.css
, and all the spiffy things you can do with it, is available from the links below.
/* Google input text box */
.lst {
font-size:13px ! important;
}
/* Google search type-ahead drop down */
.gac_m td {
font-size:13px ! important;
line-height:120% ! important;
}
/* Google Search/I'm Feeling Lucky buttons */
.lsb {
font-size:11px ! important;
height:auto ! important;
}
/* Google Search/I'm Feeling Lucky buttons in type-ahead drop down*/
.gac_sb {
font-size:11px ! important;
height:auto ! important;
}
With the aforementioned CSS, the submit buttons will still appear in the type-ahead drop down menu. Add the following style to remove them all together.
.gac_sb {
display:none;
}
Power to the people.
Related Sites
Customizing Mozilla
Better Ad Blocking for Firefox, Mozilla, Camino, and Safari
Google Chrome Issue 2393: Support user stylesheet
This how I took an existing directory of files on my desktop and put it into a new git repository on a remote server. I found a number of how-tos online but none worked for me – certainly this was because I’m such a newbie with git that I wasn’t sufficiently understanding what I was being told to do. The following works for me; clearly this isn’t the only way or the best way to accomplish the task. This is mostly a note to self.
Create an empty directory on the remote server to hold the repository
$ mkdir -p /var/local/git/repos/CrashTesting
Intialize the empty repository
$ git --bare init
Initialized empty Git repository in /var/local/git/repos/CrashTesting/
Now I have the necessary repository components.
$ ls
branches config description HEAD hooks info objects refs
On my desktop, in the existing directory of files, init the directory
$ git init
Initialized empty Git repository in /Users/crashing/Desktop/testws/.git/
This created a .git
directory with git control files.
Next, I tell my local desktop repository about the remote repo. The remote repo is given the short name origin
.
$ git remote add origin ssh://server.crashingdaily.com/var/local/git/repos/CrashTesting
Then, I place my local files under version control.
$ git add .
Now I can commit the local files to the local repository.
$ git commit -a -m 'initialize repo'
[master (root-commit) 7871087] initialize repo
23 files changed, 500 insertions(+), 0 deletions(-)
create mode 100755 build.properties
create mode 100755 build.xml
Finally, push the master
branch to the remote repository named origin
.
$ git push origin master
Counting objects: 44, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (31/31), done.
Writing objects: 100% (44/44), 1.65 MiB, done.
Total 44 (delta 1), reused 0 (delta 0)
To ssh://server.crashingdaily.com/var/local/git/repos/CrashTesting
* [new branch] master -> master