弊社mori_goqの作成したVanJS Click Counterをやってみたところ、私では高橋名人を超えることができず、悔しくなったため技術力で攻略してやろうと思いました。
結果
結果からお伝えすると、大体730(73クリック/1秒)あたりに落ち着きました。
コード
from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
# VanJS Click Counterのページを開く
driver.get('https://vanjs-click-counter.vercel.app/')
# ゲームスタート!
xpath = '//button[contains(@class, "action-button")]'
start_button = driver.find_element(By.XPATH, xpath)
# 止まることなく連打
# for文で回してみても、大体730付近のスコアでした
while (True):
start_button.click()
start_button = driver.find_element(By.XPATH, xpath)
あまり大したコードは書いてませんが、つまづきポイントを。
# ゲームスタート!
xpath = '//button[contains(@class, "action-button")]'
start_button = driver.find_element(By.XPATH, xpath)
# 止まることなく連打
while (True):
start_button.click()
start_button = driver.find_element(By.XPATH, xpath)
スタートの時にstart_button
へDOM要素を変数として定義しているのに、一番下の行でわざわざstart_button
に変数に定義し直してる箇所ですが、これがないと下記エラーで処理が止まります。
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: stale element not found
調べてみるとこちらの記事に辿り着き、再度DOMを取得しなおす必要があるみたいでした。
また、完成系のコードだとボタンが押せなくなる(10秒経過する)と、同上のエラーが発生してブラウザが落ちます。(原因不明だが、たまに永遠にクリックし続けてくれます。)
なので、下記のようなコードでボタンがクリック可能かでループを停止させようとしましたが、明らかにパフォーマンスが落ちた(大体600クリック/1秒)ので、今回は見送りました。
start_button = driver.find_element(By.XPATH, xpath)
while (start_button.is_enabled()):
start_button.click()
start_button = driver.find_element(By.XPATH, xpath)
しかもループが早すぎるせいか、よく同様のエラーが発生してブラウザ落ちるので、あまり効果なし。
余談
以前アップした同じような記事の中で、まだ試していないこと
と書いていましたが、今回はそれを試してみました。
やったこととしては座標を決めてクリックすることですが、結果としては手動でクリックするよりも遅い結果となったため、今回は不採用としました。
座標クリックするためのコードはこちらを参考に。
最後に
GoQSystemでは一緒に働いてくれる仲間を募集中です!
ご興味がある方は以下リンクよりご確認ください。