依存しているJSShでマルチバイト文字を扱えないことが原因で、FireWatirではテキストフィールドへ日本語を挿入すると文字化けを起こしてしまします。
# パッチ前 ff.text_field(:name, "q").value = "あ" ff.text_field(:name, "q").value == "あ" # => false
# パッチ前 ff.text_field(:name, "q").set("あ") ff.text_field(:name, "q").value == "あ" # => false
※クリップボードを介するなどの工夫をすることで文字化けを起こさず挿入することができるようです。
d:id:transparency1979:20081221
このパッチをあてると「value=」で値が挿入される際に、「rubyでURIエンコードしたデータをJavaScriptでデコードする」とよう処理を挟むようになります。これによりJSSh上を日本語が直接流れることがなくなるため、文字化けを起こさずに日本語を挿入することができるようになります。
# パッチ後 ff.text_field(:name, "q").value = "あ" ff.text_field(:name, "q").value == "あ".toutf8 # => true
またこの際、文字コードはFirefox側でドキュメントのものに合わせて自動で変換されるので、スクリプト側で文字コードを合わせる必要はありません。
※後述しますが、JavaScript的には一度UTF-8にする必要があるので、UTF-8以外の文字列が渡された場合は自動でUTF-8への変換を行います。
直接インストールすることもできます。
> gem install firewatir --source http://tec.toi-planning.net/ruby
※JSShのインストールなど、FireWatirが動作する基本的な環境は別途整える必要があります。
「value=」の場合はこのパッチで対応できたのですが「set」に関しては事情が異なり、一字ずつキーを押して入力していくような実装になっていて、日本語の入力をどのように対応させるべきかも難しいところなので、今回は対応をしていません。
# パッチ後 ff.text_field(:name, "q").set("あ") ff.text_field(:name, "q").value == "あ" # => false
このパッチではJavaScriptのdecodeURIComponentを利用しているのですが、decodeURIComponentはデコード対象となる文字列をUTF-8の文字列をURIエンコードされたものとして解釈します。また例えばShift_JISの文字列をURIエンコードして渡しても、文字化けではなく単に空文字列に変換されます。
ここから仕様として、「valueへはUTF-8を代入する必要があります」ということでもよいかもしれないのですが、
ff.text_field(:name, "q").value = str.toutf8 # 必ず UTF-8 の文字列を代入
Shift_JIS の文字列を入れて空白になるだけでは寂しいので、そのような場合は内部でUTF-8へと変換し、日本語として正しく解釈されるようにしています。
ff.text_field(:name, "q").value = str.tossjis # これでも動作して欲しい
前述の仕様を実現するためには「任意の文字コードからUTF-8への変換」をする必要があるのですが、現状では以下のような順序で変換方法を決めています。
当方の経験が浅いため、この流れが適切なのか確信のもてない部分があるのですが、このようなケースに関してはベストプラクティスのようなものはあったりするのでしょうか。もしよろしければコメントなどを頂けるとありがたいです。
※このパッチでは1.9以降の対応も視野に入れたいと考えているのですが、現状のFireWatirは1.9では動作しないようです
課題がクリアーでき、その他の動作にも問題がなければ開発元へも投げてみようと思っています。仕様についてなど、何かありましたらコメントなどを頂ければありがたいです。
JavaScriptのdecodeURIComponentに対応するrubyのencodeURIComponentを作成する際に参考にしました。
Oscar2012/10/25 15:48I really appreciate free, succinct, rleibale data like this.
imdkzaqdu2012/10/26 08:21IIZBbv <a href="http://lpeusrakrows.com/">lpeusrakrows</a>
bbctamxeu2012/10/27 04:07XFSYZj , [url=http://wpllzkofhplt.com/]wpllzkofhplt[/url], [link=http://lteviicnqjtg.com/]lteviicnqjtg[/link], http://sroilzjayoor.com/
gxhemzuiav2012/10/27 10:309BtY1I <a href="http://alyqesmhdlkm.com/">alyqesmhdlkm</a>