LoginSignup
22
24

More than 3 years have passed since last update.

Python+Seleniumで自動実行を行う時に並列で回すサンプル

Last updated at Posted at 2019-08-15

この記事は何?

Seleniumを使って並列でwebdriverをぶん回してやりたいと思った時のサンプルです。(例えば自社のサービスに手操作と同じルーチンで大量データを作成したい場合など)
巷のSeleniumHowtoは単一プロセスでwebdriverを利用するケースは多々あるのですが、並列で回す例はあまりなく、かつpythonで並列処理というサンプルもあまりなかったので、書き起こしました。

早速ですがサンプルです。

実行環境

Python 3.6.4
selenium (3.11.0)

以下の様な感じになります。

from selenium import webdriver
from selenium.webdriver import Chrome
import concurrent.futures

def driverfunc(order):
    drvpath="C:/mydriverpath/chromedriver.exe"
    driver = webdriver.Chrome(drvpath)
    # basic認証の場合はユーザー:パスワード@サイトURLでgetできる
    driver.get("http://basicuser:basicpass@example.com")
    # ==============================================
    # 以下seleniumでの自動処理を記述する。
    # ==============================================
    driver.close()

# 並列実行するテストケースの配列
# このサンプルはあくまでも書き方サンプルなのでデータは適当
testcase = [1,2,3,4,5]

# 並列実行するexecutorを用意する。
# max_workers が最大の並列実行数
executor = concurrent.futures.ThreadPoolExecutor(max_workers=2)
for t in testcase:
    executor.submit(driverfunc,t)

注意する点

  • concurrent.futures.ThreadPoolExecutormax_workersが同時実行数になる。
    • 当然僕らのChromeはじゃぶじゃぶメモリを食うの、で少ない数で試して閾値を決めよう。
    • 当然アクセスされるサイトも並列で処理されるので、スクレイピングなんかで使うと×××される可能性もあると思うので注意
  • executer.submit()executer.submit(func(arg))というような書き方をすると、シングルスレッドで実行されるだけで並列処理されない。ドキュメント記載の通り、executer.submit(func,arg)と書いて引数を渡そう。
  • このサンプルはheadlessで実行していないので、ブラウザがworkerの数立ち上がる。煩わしいったらないので、headless推奨。

参考サイト

concurrent.futures -- 並列タスク実行 — Python 3.7.4 ドキュメント
https://docs.python.org/ja/3/library/concurrent.futures.html#threadpoolexecutor
【Python】マルチスレッドでSeleniumのFirefoxを複数起動する方法 - あずみ.net
https://a-zumi.net/python-selenium-multithread/

22
24
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
22
24