2012年6月24日日曜日

[Python 2.7]インストールメモ

業務系SIerを脱出してWeb系の世界に飛びこんで早1年半、仕事でのメイン言語はJava1.4(!)からPython2.7へと変わったのに、そういえばPythonネタまだ一つも書いてなかったなーってことでまずはインストールメモ。
つってもこの先別に大したネタなんてないですけど。

試した環境

3系はフレームワークとかの対応が芳しくないようなので(Djangoとか)、当ブログでは暫くの間2系でいきます。
ちなみにCentOSにはデフォルトでインストール済ですが(yumとかPython製なので)、2.4とか2.6とかバージョン古いです。
  • CentOS 5.6, 6.2
  • Python 2.7.3

Pythonインストール

事前準備
zlibはeasy_install使うのに必要。
# yum install gcc zlib zlib-devel
ダウンロード&configure
ダウンロードページは以下。
$ wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz
$ tar xvzf Python-2.7.3.tgz
$ cd Python-2.7.3
$ ./configure --with-threads --enable-shared
コンパイル&インストール
Modules/Setupの一部行をアンコメント(コメントアウトの対義語だよ知ってた?)。
$ vim Modules/Setup
zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz

そしてお馴染みのコマンド。
$ make
# make install
ライブラリ設定&動作確認
# vim /etc/ld.so.conf.d/python2.7.conf
/usr/local/lib
# /sbin/ldconfig
$ python -V
Python 2.7.3
動作確認で以下エラー発生したら
$ python -V
python: error while loading shared libraries: libpython2.7.so.1.0:
cannot open shared object file:

共有ライブラリ確認してみる。
$ ldd python
…
libpython2.7.so.1.0 => not found
…

上記の状態の場合、ライブラリへのシンボリックリンクを/lib配下に作成。
# ln -s {Pythonソースルート}/libpython2.7.so.1.0 /usr/local/lib/libpython2.7.so.1.0

pipインストール

いわゆるパッケージ管理システムです。Rubyで言うところのgem、PHPではpear。
まずはeasy_installのインストール
setuptoolsってのの中に入っている。ダウンロードページは以下。
$ wget http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg#md5=fe1f997bc722265116870bc7919059ea
# sh setuptools-0.6c11-py2.7.egg
easy_install使ってpipインストール
# easy_install pip
使い方
他人のふんどしをお借りします。

参考



2012年6月5日火曜日

[Selenium 2] Try & Error集 2

バージョン2.21で「Could not load native events component」例外が発生する

確認バージョン:Selenium 2.21
ブラウザ:Firefox 9, 12
対処法:バージョン上げる ※2.22検証済

以前書いたマウスホバー実現方法のエントリで、
「現時点のSelenium最新バージョン2.21はFirefox12に対応していないようで動かず…」
と書きましたが、あの後Firefox9で試してみたら9でも例外発生しました。
発生した例外は以下。

org.openqa.selenium.InvalidElementStateException: Cannot perform native interaction: Could not load native events component.

発生元は以下。

上記以外でも発生するかもしれません。

発生原因は不明。きっとSeleniumのデグレでしょう。バージョン2.22にしたら解決。

「MoveTargetOutOfBoundsException」例外の対処法

確認バージョン:Selenium 2.18
ブラウザ:Firefox 9
対処法:事前にターゲットが見えるように座標やウィンドウサイズ調整する

ただリンクやボタンをクリックするだけといった何てこと無い処理で、時々以下例外が発生することがありました。

org.openqa.selenium.interactions.MoveTargetOutOfBoundsException: Element cannot be scrolled into view

ターゲットがウィンドウ領域外にある場合、見える位置まで自動スクロールしてから処理が実行されるのですが、どうも時々スクロールがうまくいかない場合がある模様。
スクロールが原因なのであれば、JavaScriptで座標調整したり、ウィンドウ最大化するなどして、予めターゲットが見えるような状態にしておけばよい。

※サイト・ページによっては、上記コードが働かない場合がありました。原因不明。

FirefoxのJavaScriptを無効化できない!

確認バージョン:Selenium 2.18, 2.21
ブラウザ:Firefox 9
対処法:不明

それっぽいメソッドがあったので使ってみたのですが、falseセットしても無効化できず。

OSやブラウザバージョンとか他にいろいろ設定して試してみてもダメだった。

[Selenium 2] Firefox起動時のポートロック待ち時間変更方法

試した環境

  • ブラウザ:Firefox 9
  • JDK 6
  • Selenium 2.18, 2.21, 2.22
  • Windows 7 64bit

ある日のこと、Seleniumテストケースを並行して数十個同時にスタートした時、以下の例外が発生した。

org.openqa.selenium.WebDriverException: Unable to bind to locking port 7054 within 45000 ms
…

調べてみると、どうもSeleniumはブラウザプロセス起動する時にTCP7054番ポートをロックするらしく、このポートのロックを一定時間待っても獲得できない場合に上記例外が発生する模様。ちなみにロックはプロセス起動したら開放されるっぽい。

この値はFirefoxBinaryクラスのtimeoutプロパティの値で、デフォルトでは45秒。変更したい場合は以下のように、タイムアウト値を設定したFirefoxBinaryオブジェクトをコンストラクタに渡せばよい。

同時にCapabilitiesオブジェクトも使いたいんだけど…

例えばプロキシを使用する場合は、以下のようにCapabilitiesを使用する訳ですが…

FirefoxDriverのコンストラクタには、FirefoxBinaryとCapabilitiesをパラメータとするものが用意されていません。どうしたらいいんでしょう。Help me...的な事を当初書いていたら、hutyaoさんからコメント欄にてご教示いただけました。ありがとうございます!
CapabilitiesオブジェクトにFirefoxBinaryを入れる

それと、プロキシ設定はCapabilitiesオブジェクトではなくFirefoxProfileでも指定可能だよってことも教えていただきました。

<非推奨>
FirefoxDriverのソースからメソッドコピペするというダッサイ方法
僕の頭ではこんな方法しか思いつきませんでした…

以下のimport文とメソッドをコピーし、適当なクラスに貼り付けてください。アクセス修飾子はprivateなので、適宜変更してください。

そしてFirefox起動ロジックは以下のような感じで。

僕は上記コピペメソッドや一連の生成ロジックはFactoryクラスに持たせています。

コピペなんてDRYの原則に反してるじゃねぇか!って方はSeleniumのソース弄ってください。僕としては、コピペ元はjarの中のソースなんで別にいいかなって思いますけど。

※繰り返しますが当節の方法は非推奨です。