メインコンテンツへスキップ

Pythonとseleniumを使ったブラウザ操作自動化

·2605 文字·6 分
目次

はじめに
#

ウェブUIのテストツールであるseleniumを使った、ブラウザ操作の自動化についてまとめた。 seleniumはウェブUIのテストを自動化するためのツールである。これをPythonから呼び出すことで、ウェブ画面上の操作を自動化できる。

本記事では、環境構築 (seleniumとWebDriverの準備)と、ウェブページの自動操作について述べる。

環境は以下の通り。

バージョン
Python 3.7.3
selenium 3.141.0

また、OSはWindows 8.1である。

環境構築
#

seleniumのインストールと、WebDriverのダウンロードを行う。 conda環境では、seleniumを以下の通りインストールする。

conda install selenium

それ以外では、pipでインストールする。

conda install selenium

次にWebDriverをダウンロードする。WebDriverはブラウザごとに異なるものが必要になる。 2020年12月17日現在、ChromeのWebDriverは以下のページからダウンロードできる。

Downloads - ChromeDriver - WebDriver for Chrome

上記のページから、Chromeのバージョンや、OSが一致するWebDriverをダウンロードする。 ダウンロードしたzipファイルを展開するとchromedriver.exeという実行ファイルがあるので、適当なフォルダに置く。 本記事では、以下のパスに置くこととする。

C:\selenium\chromedriver.exe

chromedriver.exeにパスを通しておくと後々便利であるが、ここではパスを通さずに進める。

ただし、記事を読まれている時点では、WebDriverの情報は古くなっている可能性があるため、適宜最新の情報を参照されたい。最新の情報や、他のブラウザのダウンロード方法については、「selenium WebDriver (ブラウザ名)」で検索すると出てくる。

seleniumによるページ制御の基本
#

以下の手順により、Pythonでseleniumを使ったページ制御を行う。

  1. WebDriverでブラウザを起動
  2. get()メソッドでページを取得
  3. find_*メソッドでWebElementオブジェクト(ページの要素)を取得
  4. WebElementオブジェクトのメソッドを使ってページを操作する

ウェブページを開く
#

以下のスクリプトを実行すると、英語版Wikipediaのトップページが開く。

例1

from selenium import webdriver
driver = webdriver.Chrome(executable_path="C:\selenium\chromedriver.exe")
driver.get("https://en.wikipedia.org")

まず、webdriver.Chromeでブラウザを立ち上げ、WebDriverオブジェクトを取得する。使用するブラウザによって、Chromeの部分を適宜変更する。また、executable_pathでWebDriverを指定するが、chromedriver.exeにパスが通っている場合は指定する必要はない。

次に、WebDriverオブジェクトのget()メソッドに開きたいURLを渡すと、ページを開く。

wikipedia-top
wikipedia-top

なお、ブラウザを閉じるときは、WebDriverオブジェクトのquit()メソッドを実行する。

ウェブページの要素を探す
#

WebDriverのメソッドを使って、操作したい要素を探す。

メソッドは大きく分けて2種類あり、検索条件に一致する最初の要素をWebElementオブジェクトとして返すものと、検索条件に一致する全ての要素をWebElementオブジェクトのリストとして返すものがある。 前者はfind_element_から始まる名前のメソッドであり、後者は複数形のfind_elements_から始まる名前のメソッドである。

find_element_から始まる主なメソッドを以下に示す。

メソッド 内容
find_element_by_id id属性が一致する要素
find_element_by_name name属性が一致する要素
find_element_by_link_text 完全一致する<a>要素
find_element_by_partial_link_text 部分一致する<a>要素
find_element_by_tag_name タグ名と一致する要素
find_element_by_class_name CSSクラスと一致する要素
find_element_by_css_selector CSSセレクタに一致する要素

これらのelementelementsに置き換えると、全ての要素を検索できる。

例2 以下のHTMLがあったとする。

<a href="https://en.wikipedia.org">Wiki</a>

このHTMLをブラウザで開くと、https://en.wikipedia.orgへリンクを張った、Wikiという文字列が表示される。 また、上記の例では、HTMLの各構造は以下の名前で呼ばれる。

  • a: タグ名
  • href: 属性
  • Wiki: 内部テキスト

ここで、<a>の開始タグと終了タグで囲まれた全体を要素と呼ぶ。

この要素をSeleniumで探すには、

WebDriver.find_element_by_link_text("Wiki")

または、

WebDriver.find_element_by_tag_name("a")

のようにする。

要素の内容を取得する
#

WebElementオブジェクトには、要素の内容を取得するために、以下のような属性やメソッドがある。

属性・メソッド 内容
tag_name タグ名
text 要素の内部テキスト
get_attribute(name) name属性の値

ウェブページを操作する
#

クリックする
#

WebElementオブジェクトのclick()メソッドを実行すると、その要素上でマウスをクリックする。

例3 例1で開いたWikipediaの左カラム上部にある、“Contents"というリンクをクリックする動作を考える。 まず、内部テキストが"Contents"である要素を、find_element_by_link_textメソッドでWebElementとして取得する。次に、このWebElementのclick()メソッドを実行する。 例1のスクリプトと合わせると、以下のようになる。

from selenium import webdriver
driver = webdriver.Chrome(executable_path="C:\selenium\chromedriver.exe")
driver.get("https://en.wikipedia.org")

link_ele = driver.find_element_by_link_text("Contents")
link_ele.click()

上記を実行すると、以下のページが開く。 https://en.wikipedia.org/wiki/Wikipedia:Contents

テキストを入力・送信する
#

Wikipediaトップページの右上の検索窓に、単語を入力して検索することを考える。 この検索窓のHTML上の情報を調べるため、ブラウザの開発者ツールを用いる。Chromeの場合はF12キーを使用する。

wikipedia-developer-tool
wikipedia-developer-tool

画像右上のHTMLソースの背景が灰色になっている箇所より、検索窓のid属性はsearchInputであることが分かる。これをfind_element_by_idメソッドを使って、WebElementオブジェクトとして取得する。

次に、send_keysメソッドを使って、検索窓に渡したい文字列を指定する。最後にsubmitメソッドを実行すると、「送信」を押したことになり、検索結果のページが得られる。

例4 Wikipediaで"python"を検索する。

from selenium import webdriver
driver = webdriver.Chrome(executable_path="C:\selenium\chromedriver.exe")
driver.get("https://en.wikipedia.org")

search_ele = driver.find_element_by_id("searchInput")
search_ele.send_keys("python")
search_ele.submit()

実行結果 以下のページが表示される。

wikipedia-search-result
wikipedia-search-result

参考
#

PythonでSeleniumを操作する — Selenium Python Bindings 2 ドキュメント

Helve
著者
Helve
関西在住、電機メーカ勤務のエンジニア。X(旧Twitter)で新着記事を配信中です

関連記事

Pythonのreモジュールを使った正規表現の基本
·1821 文字·4 分
Pythonのreモジュールの基本的な使い方をまとめた。
Pythonの辞書内包表記
·761 文字·2 分
Pythonの辞書内包表記を使って、辞書(dict)型の変数を簡潔に作成する例を示す。
BaggingClassifierの使用例
·1426 文字·3 分
BaggingClassifierクラスの使用例を示す。
scikit-learnのBaggingClassifierでバギングする
·2756 文字·6 分
BaggingClassifierを用いた学習(バギング、ペースティング、ランダムサブスペース、ランダムパッチ)について解説する。
Scikit-learnの主成分分析 (PCA)
·1432 文字·3 分
Scikit-learnのPCAクラスのパラメータ、属性とメソッドについて解説する。
Scikit-learnの正則化付き重回帰モデル
·2498 文字·5 分
Scikit-learnに実装されている重回帰、Ridge回帰、Lasso回帰、Elastic Netのロジックと使用方法をまとめた。