【Selenium】文字入力中にカーソルが別のフォームに移動してしまう


背景

次のようにして、全画面コピーした内容をテキストエリアに入力する処理を作っていました。

js = "
  document.execCommand('SelectAll');
  return window.getSelection().toString();
"
str = driver.execute_script(js)
driver.find_element(:id, 'hoge').send_keys(str)

ところが、入力中に別のフォームに移ってしまい、入力がめちゃくちゃになってしまいました。

結論

send_keysで入力する前に、replace()関数を利用して\tを置き換える。

js = "
  document.execCommand('SelectAll');
  return window.getSelection().toString().replace(/\t/g, ' ');
"
str = driver.execute_script(js)
driver.find_element(:id, 'hoge').send_keys(str)

\tとは

バックスラッシュ記法で「タブ」を意味しています。
全画面コピーした際に紛れ込んでいた\tによって、カーソルが移動していたようです。

replace()関数

次のようにすることで、「str」中の「対象」を「置換後」に置き換えることができます。

str.replace('対象', '置換後')

このままでは1回しか置き換えられないので、置き換えたい対象が複数ある場合は正規表現のgフラグを使用する必要があります。

str = 'hogehogehoge';
str.replace('hoge', 'fuga');    // 'fugahogehoge'
str.replace('/hoge/g', 'fuga'); // 'fugafugafuga'

これを利用して文中含まれるすべての\tに置き換えました。

参考