「Webブラウザ操作って自動化できるの?自分もやってみたい。」
「Seleniumの始め方、使い方が知りたい。」
上記の疑問にお答えします。
PythonとSeleniumを使えば、日常業務で行っているデータ収集やWebブラウザ操作を自動化することができます。
この記事では、プログラミングに不慣れな方にも分かるように、Seleniumのインストールから実際の使い方について解説します。
具体的に次のことを解説します。
- Seleniumとは
- Python×Seleniumでできること
- Seleniumのインストール&環境構築
- Seleniumの基本的な使い方
- 【実践】Teamsでの定例報告を自動化
「偉そうに語るおまえは誰やねん。」と思われるので、私のことも少し紹介させてください。
たいらーのプロフィール
- 文系四大出身。ソフトウェア開発の経験はなしですが、IT業界に身を置いています。
- 開発者やユーザーとのパイプ役など、業務にプログラミングスキルを活かす。
- Pythonは独学で習得。スクレイピングや作業の自動化などに勤しんでいます。
日ごろの単純作業や定型的な業務は、プログラミングを活用すれば省力化することができます。
PythonとSeleniumの組み合わせは、プログラミング未経験の方でも比較的学びやすいテーマです。
プログラミングや業務の自動化に興味がある方は、この記事をきっかけにPython&Seleniumに挑戦してみましょう。
1.Seleniumとは
Seleniumは、Webアプリケーションを自動化するためのオープンソースのツールです。
Webブラウザを制御するためにWebDriverというAPIを使用し、Webブラウザを直接制御します。
WebDriverは、Webブラウザを開いたり、Webページをロードしたり、要素を検索したり、要素に対してアクションを実行したりすることができます。
要素とは、例えば次のようなWebページの構成物です。
Webページの構成物 | 説明 |
---|---|
ページ要素 | ページ要素は、Webページ上の各要素を表します。例えば、HTMLページのテキスト、画像、リンク、ボタン、テキストフィールド、チェックボックス、ラジオボタンなどがあります。 |
フレーム | Webページ内にフレームが含まれている場合、Seleniumはそれらのフレームを識別できます。これにより、フレーム内の要素にアクセスすることができます。 |
ウィンドウ | ウィンドウは、Webページ内の別のブラウザウィンドウを表します。Seleniumは、現在のウィンドウから別のウィンドウに切り替えたり、新しいウィンドウを開いたりすることができます。 |
アラート | アラートは、Webページ上の警告メッセージを表します。Seleniumは、アラートを取得したり、アラート内のテキストを取得したり、アラートを閉じたりすることができます。 |
Cookie | Cookieは、Webブラウザに保存される小さなデータファイルであり、Webアプリケーションによって使用されます。Seleniumは、Cookieを設定したり、Cookieを取得したりすることができます。 |
Seleniumを使って、これらの要素を操作することにより、Webアプリケーションの動作やUIの振る舞いを自動化することができます。
Seleniumを使用するメリットとデメリットにも触れておきます。
具体的には次のようなものがあります。
Seleniumを使うメリット
- クロスブラウザ対応性
- 多言語対応
- 広大なコミュニティ
Seleniumは、Firefox、Chrome、Safariなど、様々なブラウザに対応しています。
また、Windows、Mac OS X、LinuxなどのOSで使用できます。
対応するプログラミング言語も、Java、Python、C#、Ruby、JavaScriptなど、多様なプログラミング言語に対応しているため、自分の好きな言語でSeleniumを使用することができます。
Seleniumは、オープンソースプロジェクトなので、広大なコミュニティによって開発されています。
そのため、多くのサポートリソースがあり、問題に対して解決策を見つけることができます。
Seleniumを使うデメリット
- 実行環境のセットアップ
- 実行速度
Seleniumを使用するには、実行環境をセットアップする必要があります。
具体的には後述しますが、開発環境のほかにブラウザのWebDriverを準備しなければなりません。
また、このWebDriverは、ブラウザのアップデートに合わせて、入れ替える必要があります。
Seleniumは、ブラウザを制御するため、実行速度が遅い場合があります。
ブラウザの起動時間やレスポンス時間の影響を受けるため、、実行時間が長くなることがあります。
2.Python×Seleniumでできること
PythonとSeleniumを組み合わせることで、次のようなことができます。
- Webブラウザ操作の自動化
- Webスクレイピング
・Webブラウザ操作の自動化
「Seleniumとは」で説明したとおり、Webページ内の要素を操作することで、Webブラウザの操作を自動化することができます。
例えば、
- 会員サイトにログイン
- 問い合わせフォームの記入
- ファイルのダウンロード/アップロード
人が手動操作する内容は、そのほとんどを自動実行することが可能です。
そのため、Webアプリケーションのテストによく使われています。
参考:AWSで構築するSelenium自動テスト環境とその運用
・Webスクレイピング
Webスクレイピングとは、Webサイト上の情報を抽出・整形・解析する技術のことです。
AIの開発やビックデータ活用を支える技術の一つで、ビジネスでのデータ活用の高まりもあり、近年、注目されています。
Seleniumは、Webページ内の要素を頼りに、データを抽出することができます。
Webスクレイピングの方法はいくつかありますが、SeleniumでWebスクレイピングをする利点は、動的サイトからもデータ抽出できる点です。
ここでいう動的サイトとは、JavaScriptなどを使用して、時間経過と共にWebページが更新されるようなサイトを指しています。
この記事では、PythonとSeleniumを使ったWebブラウザ操作の自動化について深堀りしていきます。
PythonとSeleniumを使ったWebスクレイピングについて知りたい方は、『PythonとSeleniumを使ったWebスクレイピング【Beautifulsoupとの違いも解説】』をご覧ください。
3.Seleniumのインストール&環境構築
PythonでSeleniumを利用する場合、いくつかステップを踏む必要があります。
Pythonはインストール済みであることを前提に説明しますので、Pythonの準備がまだの方は、『Python3のインストール方法【導入は10分で完了!】』を参考に準備しましょう。
・Seleniumのインストール
Seleniumをインストールします。
Seleniumには、Selenium3、Selenium4といったバージョンがあり、バージョンの違いにより、コードの書き方が一部異なります。
Selenium3は、今も現役で使われていますが、Selenium4で機能やパフォーマンスが向上したということで、後学のためにも今回は最新のSelenium4を使用します。
インストールするには、コマンドプロンプト等で次のコマンドを入力してください。
pip install selenium
インストールが完了したら、念のためにインストール状況を確認しましょう。
次のコマンドを入力したら、「Selenium」を探してみてください。
pip list
Seleniumとともに、「4.x.x」のようにバージョンが表示されればインストールは成功です。
・WebDriverの準備
Seleniumでは、ブラウザを直接制御するためにWebDriverが必要です。
WebDriverの準備の流れは次のようになります。
- 現在使用中と同じバージョンのWebDriverをダウンロードする
- WebDriverを適切な場所に置く
1. 現在使用中と同じバージョンのWebDriverをダウンロードする
まず、Seleniumで操作予定のブラウザのバージョンを確認しましょう。
同じバージョンのWebDriverを以下のサイトからダウンロードしてください。
2. WebDriverを適切な場所に置く
WebDriverがダウンロードできたら解凍してください。
解凍したフォルダ一式は、適切な場所に置きましょう。
この時、できるだけ分かりやすい場所に置いておくとWebDriverの読み込みのときに便利です。
例えば、「C:¥WebDriver\chrome」など
・Pythonのコード上で読み込む
SeleniumとWebDriverの準備ができたら、Pythonのコード上で読み込みます。
まず、Seleniumをインポートしwebdriverを次のコマンドで読み込みます。
from selenium import webdriver
次に先ほど配置したWebDriverのディレクトリを指定し、ブラウザのWebDriverを読み込みます。
例としてChromeのWebDriverを「C:¥WebDriver\chrome」に配置したときの記述は、次の通りです。
driver = webdriver.Chrome('C:¥WebDriver\chrome\chromedriver.exe') #driver = webdriver.Chrome('WebDriverの実行ファイルのパス')
以上で環境構築は終了です。
4.Seleniumの基本的な使い方
準備ができたら、実際にSeleniumを使ってWebブラウザを操作してみましょう。
今回はGoogle検索を例に説明します。
作業の流れは次の通りです。
- サイト表示
- 要素の取得
- 検索ワード入力&検索実行
・サイト表示
前提として、Seleniumが使えるように次のコードが記述されている状態から始めるものとします。
操作対象のブラウザはChromeです。
from selenium import webdriver #webdriverを読み込み driver = webdriver.Chrome('C:¥WebDriver\chrome\chromedriver.exe') #Chromeのwebdriverを指定
サイト表示させるには、次のようにコードを記述します。
driver.get('URL')
今回はGoogleを表示させるので、次のようになります。
from selenium import webdriver driver = webdriver.Chrome('C:¥WebDriver\chrome\chromedriver.exe') driver.get('https://www.google.com/')
このままでも良いですが、実際にサイト表示させてみると、サイト表示は一瞬なので、分かりやすいように次のように記述します、
from selenium import webdriver import time driver = webdriver.Chrome('C:¥WebDriver\chrome\chromedriver.exe') driver.get('https://www.google.com/') time.sleep(3) #サイト表示後に3秒待機する
・要素の取得
ここからは少しHTMLやCSSなどWebの知識が必要になります。
とはいえ、今回やろうとしていることは、基礎知識があればできる内容です。
HTMLやCSSが分かる方は、このまま進んでもらって大丈夫です。
HTMLやCSSの知識に不安がある方は、次の『WebスクレイピングのためのHTML・CSS入門』を一読することをおすすめします。
SeleniumでWebブラウザを操作する場合、基本的に次の手順となります。
- 対象のサイト構造を調べる
- 操作したい部分の要素を取得する
- 操作したい内容を記述する
話をGoogle検索に戻すと、検索するには検索ワードの入力欄を指定する必要があるので、まずサイト構造を調べましょう。
「https://www.google.com/」にアクセスし、右クリックをしてみてください。
右クリックメニューから「検証」を選択するとディベロッパーツールが表示され、サイト構造を確認することができます。
次に検索ワードの入力欄を調べます。
ディベロッパーツール内の左上に矢印アイコンを選択し、検索ワードの入力欄を選択すると、ディベロパーツールが検索ワードの入力欄の要素にジャンプします。
ジャンプした箇所を確認します。
今回はCSSセレクターで要素を取得したいので、selectorをコピーします。
やり方は、「ジャンプした箇所を右クリック」→「コピー」→「selectorをコピー」です。
コピーした内容は、テキストエディタなどに貼り付けることで確認できます。
要素が取得できたので、コードを記述しましょう。
Seleniumは、要素を参照するメソッドがいくつか用意されています。
今回はCSSセレクターを使って要素を参照します。
主なメソッドは次の通りです。
種類 | コード |
---|---|
Name | driver.find_element(By.NAME,"name") |
ID | driver.find_element(By.ID,"id") |
Class | driver.find_elements(By.CLASS_NAME,"class_name") |
XPath | driver.find_element(By.XPATH,"xpath") |
CSS_selector | driver.find_element(By.CSS_SELECTOR,"css_selector") |
コードを記述すると次のようになります。
from selenium import webdriver from selenium.webdriver.common.by import By import time driver = webdriver.Chrome('C:¥WebDriver\chrome\chromedriver.exe') driver.get('https://www.google.com/') time.sleep(3) #サイト表示後に3秒待機する search_input = driver.find_element(By.CSS_SELECTOR,'body > div.L3eUgb > div.o3j99.ikrT4e.om7nvf > form > div:nth-child(1) > div.A8SBwf > div.RNNXgb > div > div.a4bIc > input')
・検索ワード入力&検索実行
検索ワードの入力欄は指定できたので、検索ワードの入力を行います。
今回は「selenium」のテキストを入力して検索してみたいと思います。
テキスト入力には、「send_keys」メソッドを使用します。
コードは次のようになります。
from selenium import webdriver from selenium.webdriver.common.by import By import time driver = webdriver.Chrome('C:\Python\chrome\chromedriver.exe') driver.get('https://www.google.com/') search_input = driver.find_element(By.CSS_SELECTOR,'body > div.L3eUgb > div.o3j99.ikrT4e.om7nvf > form > div:nth-child(1) > div.A8SBwf > div.RNNXgb > div > div.a4bIc > input') search_input.send_keys('selenium') time.sleep(3)
コードを実行すると、検索ワードが入力されていることが分かります。
検索を実行するには、次のコードを付け加えます。
search_input.submit()
最終的なコードは次のようになります。
実行すると「selenium」を条件に検索を行います。
from selenium import webdriver from selenium.webdriver.common.by import By import time driver = webdriver.Chrome('C:\Python\chrome\chromedriver.exe') driver.get('https://www.google.com/') #検索ワード入力欄に「selenium」を入力 search_input = driver.find_element(By.CSS_SELECTOR,'body > div.L3eUgb > div.o3j99.ikrT4e.om7nvf > form > div:nth-child(1) > div.A8SBwf > div.RNNXgb > div > div.a4bIc > input') search_input.send_keys('selenium') time.sleep(3) search_input.submit() time.sleep(3)
5.【実践】Teamsでの定例報告を自動化
基本が理解できたら、どんどん実務に活用しましょう。
ここではPython×Seleniumの実践と題して、Teamsの操作を自動化したいと思います。
プロジェクト単位で協業することが多い企業では、Teamsを活用されているところも多いと思います。
Teamsは、資料や情報共有がメインとなるツールですが、タイムカード代わりにTeamsで始業、終業報告を行っているところもあると思います。(私が関わっていたプロジェクトもそうでした。)
今回は、そのような簡単な定例報告を自動化してみます。
自動化する内容は次のとおりです。
- ログインする
- チャットを開く
- 報告内容を入力、送信する
先にコードの全文です。
コードの詳細はこのあと解説します。
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time driver = webdriver.Chrome('C:\Python\chrome\chromedriver.exe') driver.implicitly_wait(10) driver.get('https://teams.live.com/') #アカウント情報 mail_add = 'マイクロソフトのメールアドレス' password = 'パスワード' #アカウント入力 ms_id = driver.find_element(By.NAME, 'loginfmt') time.sleep(2) ms_id.send_keys(mail_add) time.sleep(2) next_button = driver.find_element(By.ID, 'idSIButton9') time.sleep(2) next_button.click() time.sleep(2) driver.implicitly_wait(10) ms_pw = driver.find_element(By.NAME, 'passwd') time.sleep(2) ms_pw.send_keys(password) time.sleep(2) signin_button = driver.find_element(By.ID, 'idSIButton9') time.sleep(2) signin_button.click() time.sleep(2) #サインインの状態を維持しない driver.implicitly_wait(10) no_button = driver.find_element(By.ID, 'idBtn_Back') time.sleep(2) no_button.click() time.sleep(2) #Webアプリを使用 driver.implicitly_wait(20) use_webapp = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CLASS_NAME, 'use-app-lnk'))) use_webapp.click() time.sleep(2) #チャットを選択 chat_button = driver.find_element(By.ID, 'app-bar-86fcd49b-61a2-4701-b771-54728cd291fb') chat_button.click() chatlist_01 = driver.find_element(By.XPATH, value='//*[@id="wrapper"]/div[1]/div/left-rail/div/div/div/div/chat-list-bridge/div[1]/div[1]/div/ul/li/div[2]/div/a') time.sleep(2) chatlist_01.click() time.sleep(2) #デスクトップ通知(オフのまま閉じる) driver.implicitly_wait(10) call_off = driver.find_element(By.XPATH, value='//*[@id="toast-container"]/div/div/div[2]/div/button[2]/div') call_off.click() time.sleep(2) #入力欄を選択 driver.switch_to.frame(0) #メッセージ入力 msg_input = driver.find_elements(By.CSS_SELECTOR, 'p') msg_count = len(msg_input) - 1 msg_input[msg_count].send_keys('おはようございます。始業します。') time.sleep(2) #メッセージ送信 msg_send = driver.find_element(By.NAME, 'send') msg_send.click() time.sleep(5) driver.quit()
Teamsにアクセスします。
driver = webdriver.Chrome('C:\Python\chrome\chromedriver.exe') driver.implicitly_wait(10) driver.get('https://teams.live.com/')
Teamsに必要なマイクロソフトのアカウント情報を変数に代入しておきます。
#アカウント情報 mail_add = 'マイクロソフトのメールアドレス' password = 'パスワード'
サインインの画面が表示されるので、マイクロソフトのメールアドレスを入力し、「次へ」ボタンを選択しています。
#アカウント入力 ms_id = driver.find_element(By.NAME, 'loginfmt') time.sleep(2) ms_id.send_keys(mail_add) time.sleep(2) next_button = driver.find_element(By.ID, 'idSIButton9') time.sleep(2) next_button.click() time.sleep(2)
パスワードを入力し、サインインしています。
driver.implicitly_wait(10) ms_pw = driver.find_element(By.NAME, 'passwd') time.sleep(2) ms_pw.send_keys(password) time.sleep(2) signin_button = driver.find_element(By.ID, 'idSIButton9') time.sleep(2) signin_button.click() time.sleep(2)
サインインの状態維持で「いいえ」を選択して進みます。
#サインインの状態を維持しない driver.implicitly_wait(10) no_button = driver.find_element(By.ID, 'idBtn_Back') time.sleep(2) no_button.click() time.sleep(2)
デスクトップアプリの利用を促されますが、「Webアプリを使用」を選択。
#Webアプリを使用 driver.implicitly_wait(20) use_webapp = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CLASS_NAME, 'use-app-lnk'))) use_webapp.click() time.sleep(2)
Teams画面が表示されたら、左側のメニューからチャットを選択し(①)
チャットのチャネルを選択します。(②)
#チャットを選択 chat_button = driver.find_element(By.ID, 'app-bar-86fcd49b-61a2-4701-b771-54728cd291fb') chat_button.click() chatlist_01 = driver.find_element(By.XPATH, value='//*[@id="wrapper"]/div[1]/div/left-rail/div/div/div/div/chat-list-bridge/div[1]/div[1]/div/ul/li/div[2]/div/a') time.sleep(2) chatlist_01.click() time.sleep(2)
デスクトップ通知は邪魔なので、オフのまま閉じておきます。
#デスクトップ通知(オフのまま閉じる) driver.implicitly_wait(10) call_off = driver.find_element(By.XPATH, value='//*[@id="toast-container"]/div/div/div[2]/div/button[2]/div') call_off.click() time.sleep(2)
メッセージ入力欄を選択後、報告内容を入力。(③)
メッセージ送信ボタンを選択すると、メッセージが送られます。(④)
#入力欄を選択 driver.switch_to.frame(0) #メッセージ入力 msg_input = driver.find_elements(By.CSS_SELECTOR, 'p') msg_count = len(msg_input) - 1 msg_input[msg_count].send_keys('おはようございます。始業します。') time.sleep(2) #メッセージ送信 msg_send = driver.find_element(By.NAME, 'send') msg_send.click() time.sleep(5)
実際にメッセージを送ることができたら成功です。
出退勤など簡単な連絡&報告なら十分対応できると思います。
6.まとめ
以上、「PythonとSeleniumを使ったWebブラウザ操作の自動化」について解説しました。
プログラミング未経験の方には、少しハードルが高く見えるところもあるかもしれませんが、分かりやすく解説したつもりなので、是非とも実践してみてください。
この記事をきっかけにPythonや業務効率化に興味を持たれた方は、次の記事が参考になると思います。
合わせてご覧ください。
ご清聴ありがとうございました。