時々マウス操作をトレースし、ロボット判定しているサイトもあったりするので、マウスカーソル操作が出来るか調べてみました。Action系を使えばOKなようですが、思っていたのと違う・・・まぁ、マウスカーソル位置はOS側で制御する話だからSeleniumでやるのは厳しいのでしょうかね・・・(Docker Selenium Grid上の話でした)
ActionChainsでマウス移動、クリックなど操作
Actionメソッドを呼ぶとキューに格納されていき、最後にperform()でキュー実行。
webdriveerを作って、ActionChainsにdriverを渡し、クリッカブルな要素(clickable)まで移動、1秒ポーズ、クリック、1秒ポーズ、abcを入力 という操作。HTMLにID=”clickable”があるタグが存在するページだとして。
※\はバックスラッシュ
from selenium.webdriver.common.action_chains import ActionChains
clickable = driver.find_element(By.ID, "clickable")
ActionChains(driver)\
.move_to_element(clickable)\
.pause(1)\
.click()\
.pause(1)\
.send_keys("abc")\
.perform()
https://github.com/SeleniumHQ/seleniumhq.github.io/blob/trunk/examples/python/tests/actions_api/test_actions.py#L13-L20
マウス移動速度は効いている? VNC上ではカーソル移動していなかった
duration=250 が初期値。下記のように500としたり0としてみましたがマウスカーソルが目に見えて移動はしませんでした。dockerでselenium grid 2022-12バージョンで行っています。
act = ActionChains(driver)
act.w3c_actions.pointer_action._duration = 500
UltraVNCで画面遷移など見ていましたがカーソルはそもそも動かず
Docker Selenium Grid上のChromeだとmove_by_offset(x,y)で例外が発生する
カーソル移動はmove_by_offset(x,y)で出来るようです。現在位置からの相対位置。x=-100なら左に100移動、x=100なら右。y=100なら下に。
下記のようなメッセージが出て、カーソル位置の相対移動はできませんでした。
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.MoveTargetOutOfBoundsException: Message: move target out of bounds
参考
Mouse actions
A representation of any pointer device for interacting with a web page.
コメント