LoginSignup
1
0

【Python】SeleniumでVanJS Click Counterを攻略する

Posted at

弊社mori_goqの作成したVanJS Click Counterをやってみたところ、私では高橋名人を超えることができず、悔しくなったため技術力で攻略してやろうと思いました。

結果

結果からお伝えすると、大体730(73クリック/1秒)あたりに落ち着きました。
meijin.gif

コード

main.py
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では一緒に働いてくれる仲間を募集中です!

ご興味がある方は以下リンクよりご確認ください。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0