Selenium for Python Elementにフォーカスを当てる


はじめに

Seleniumで要素をクリックするとフォーカスが移るものだと思っていました。
挙動を監視していると、どうもそうではないように思える事が多々あります。
そこで確実にフォーカスを移す方法を考えてみました。

実装

JavaScriptとPythonを使って実現します。

JavaScript

実際にファーカスを移す処理はJavaScriptで行います。
ここでは、以下のような記述にしてみました。

javascript
arguments[0].focus({"preventScroll": arguments[1]})

Python

上記のJavaScriptをSeleniumから呼び出します。

python
def focusToElement(driver, by, value, preventScroll):
  JavaScriptFocusToElement = "arguments[0].focus({'preventScroll': arguments[1]})"
  element = driver.find_element(by, value)
  driver.execute_script(JavaScriptFocusToElement, element, preventScroll)

実際に使う場合は、以下のようになります。

python
focusToElement(driver, By.XPATH, "//input[@name='cat']", True)

最後に

フォーカスを移す処理を入れてみたら既存のプログラムの安定性が上がりました。
また、スクロールの挙動がおかしかったのが治りました。
明示的にフォーカスを当てるのも考えて方が良いかもしれません。