Selenium, der ruby-Debugger und OsX 0

Posted by fwoeck
on Tuesday, May 12

Die Kombination cucumber/webrat/Selenium macht mir viel Spaß! Es ist sogar möglich während einer Selenium-Sitzung den ruby-debugger zu starten und mit dem Browser zu interagieren. Auf einer Ubuntu-Maschine könnte man folgende Steps definieren:

Given I follow the link "id=vorgangslink" 
And I follow the link "id=p2show" 
And I follow the link "id=formlink_1" 
And I type "ein" into "id=answer_7" 
And I wait 1 second
And the debugger is started
Then I should see "ein String"

Wobei der Debugger dann so aufgerufen wird:

1
2
3
Given /^the debugger is started$/ do
  debugger 
end

Im konkreten Lauf klappt das prima. Wenn man das Gleiche unter OsX tut, wirft das System einem allerdings eine Fehlermeldung um die Ohren, wenn man das selenium-Objekt anspricht, um den Browser zu steuern:

    Given I follow the link "id=vorgangslink" 
    And I follow the link "id=p2show" 
    And I follow the link "id=formlink_1" 
    And I type "ein" into "id=answer_7" 
    And I wait 1 second
/opt/local/lib/ruby/gems/1.8/gems/cucumber-0.3.3/lib/cucumber/ast/step_invocation.rb:33
status!(:passed)

(rdb:1) selenium.type_keys("id=answer_7", "hey")
NameError Exception: undefined local variable or method `selenium' for #<Cucumber::Ast::StepInvocation:0x36c9f28>

(rdb:1) list
[28, 37] in /opt/local/lib/ruby/gems/1.8/gems/cucumber-0.3.3/bin/...
   28          unless @skip_invoke || options[:dry_run] || exception ...
   29            @skip_invoke = true
   30            begin
...

(rdb:1)

Der Grund liegt darin, dass der OsX-Debugger im Gegensatz zu Linux am Ende eines Blockes bereits in den umliegenden Kontext wechselt, und damit das selenium-Objekt vergisst. Sorgt man durch Anfügen eines nichtstuenden Ausdrucks (hier true) dafür, das das debugger-Kommando nicht das letztze im Block ist, ist alles gut:

1
2
3
4
Given /^the debugger is started$/ do
  debugger 
  true
end

Ports und Gems auf OsX Leopard installieren 0

Posted by fwoeck
on Wednesday, April 01

Port-Setup

Da man für die wichtigen Dinge auf dem Mac port benötigt, kommt vorab ein Installationshinweis. Die Pfade nach /opt sollten richtig eingebunden werden – das hilft! In der /etc/profile:

export PATH=/opt/local/bin:/opt/local/sbin:$PATH
export MANPATH=/opt/local/share/man:$MANPATH

Achtung: Wenn man gems mit dem gem installiert, das Leopard beiliegt, werden diese nicht von den port-Rubyversionen gefunden. Alternativ kann man die ports nutzen:

port install rb-rubygems rb-gem_plugin

- allerdings wird dann zusätzlich ruby 1.87 installiert, welches vermutlich die port-ruby-1.86-Version überschreibt. FIXME: Eine schlüssige Lösung für diese Diskrepanz steht noch aus.

MySql

Die Installation ist schmerzlos, und das launchctl fügt den Server in die boot-Reihenfolge ein:

port install mysql5 +server

/opt/local/lib/mysql5/bin/mysql_install_db --user=mysql

launchctl load -w /Library/LaunchDaemons/org.macports.mysql5.plist

gem install mysql -- --with-mysql-config=/opt/local/bin/mysql_config5

Zum Start und Stop können diese Aliase nützlich sein:

alias mysqlstart='sudo /opt/local/bin/mysqld_safe5 &'
alias mysqlstop='/opt/local/bin/mysqladmin5 -u root -p shutdown'

PostgreSQL

Auch hier geht’s recht einfach:

port install postgresql83 postgresql83-server pgAdmin3
export PATH=$PATH:/opt/local/lib/postgresql83/bin
env ARCHFLAGS="-arch i386" gem install pg

(Das postgres-gem scheint etwas outdated zu sein)

Tipps für andere gems

Einige gems zicken bei der Installation ohne richtige Instruktionen. Folgende Switches helfen i.d.R. bei MySql:

gem install slim-attributes -- --with-opt-dir=/opt/local 
            --with-mysql-config=/opt/local/bin/mysql_config5

Unter Umständen ist es nötig, explizit die Maschinenarchitektur vor einer gem-Installation anzugeben:

env ARCHFLAGS="-arch i386"

bash-Skripte

Insgesamt ist die Installation einiger Gems doch so fisselig, dass ich hier mal zwei bash-Skripte angelegt habe, die heute irgendwie funktioniert haben.

  1. gems.sh
  2. ports.sh