keypress が正しく生成されない件。
Wasavi.send("1G1|y3lp");
といったコードでテストすると、”G” 以降のストロークについて keydown イベントは発生するものの、keypress が一切発生しなくなる。chromedriver_win_23.0.1240.0 で確認した。
これを、
Wasavi.send("gg1|y3lp");
にすると、期待通りのイベントが発生する。となるとやはり “G” が悪いのか。”G” に付随して、shift キーのプレスとリリースもエミュレートされるのだが、この辺が怪しい……? しかし興味深いことに、”|” も shift キー押下イベントが生成されるのだが、それによって keypress が脱落することはない。そうすると関係ないか。
issues に似たバグがないこともないのだけど、解決している様子はない。
実際にストロークを送信する部分は
private void sendStrokes (CharSequence[] strokes) {
Actions act = new Actions(driver);
for (CharSequence s: strokes) {
act.sendKeys(s);
}
act.perform();
}
という感じ。もしかしてこの辺に問題があるのだろうか。もしかしたらまとめてじゃなく細切れで perform() すれば sendKeys() の内部状態(があるとして)がそのたび初期化されてうまく行くかも:
for (CharSequence s: strokes) {
for (int i = 0, goal = s.length(); i < goal; i++) {
Actions act = new Actions(driver);
act.sendKeys(s.subSequence(i, i + 1));
act.perform();
}
}
結果: 変わらず。Selenium 内の問題ではなく chromedriver.exe の中の問題なのか?
ちなみに Opera や Firefox ではどうなのかというと、Opera では textarea に対する sendKeys() 自体が変。"hello!" とかは自動入力できるのだが、Keys.CONTROL とか Keys.INSERT とかは無視される。つまり wasavi を起動させられない。Firefox は textarea に対しては sendKeys() は上手く動いて、wasavi を起動させられるのだが、起動した wasavi の iframe に対して sendKeys() が行われない。つまり wasavi を操作できない。
というわけで、結局まともにブラウザを操作できるのが、(うちの環境では)Chrome だけなのだ。うーん動かし方が悪いのか……?
とにかく Chrome が最後の砦なので、何とか正確にキーストロークを生成してもらわないと困る。