お金をかけずにサーバーの勉強をしよう

Seleniumインストール

2022年8月3日

メニューへ戻る

僕らが生まれてくるずっとずっと前にはもうアポロ11号は月に行ったって言うのと同じように、流行りの RPAツールが世に出てくるずっとずっと前にはもう SeleniumがWEBブラウザを自動運転していたのでした。

Seleniumはブラウザを自動化します。そうです!

Seleniumに初めて触れたのは、Ver.2の頃で、もうすぐ Ver.3が出るよ〜って頃でした。

いよいよ Ver.3が出て「これからは Seleniumで自動テストの時代じゃろ! 皆が寝ている夜にテストさせれば捗るわ〜。」と思っていた所、Firefoxの仕様が大幅に変わって Seleniumが動かなくなっちゃったのではなかったかと記憶しています。

当時すごくガッカリしたのを覚えています。

ただ、その後各社の WEBブラウザが同じ規格を取り始めたこと、問題児だった IEがサポート終了で消えたことで、改めて Seleniumに触れてみようと思った次第です。

2022年8月3日時点での最新バージョンは、Selenium4と呼ばれる 4.3.0です。

Selenium は各種開発言語を使って、各種 WEBブラウザでのブラウズ作業を自動実行するためのライブラリで、テストの目的が主ですが RPA的に使う人もいるようです。

開発言語は、Java・Python・C#・Ruby・JavaScript・Kotlinとなっており、これだけカバーすればだれでもどれか1つくらいはやってるだろという感じ。

対応WEBブラウザは、Chromium/Chrome・Firefox・Edge・IE・Safariとなっており、まぁ十分じゃないかなと思います。


では四の五の言わず、実際に動かしてみることにします。
サーバー環境の構築でも何でもないですが、まずはここから。

環境は Ubuntu Desktop 22.04で、開発言語は Python 3.10.4、自動実行対象の WEBブラウザに (snap版)Firefox 103.0.1を使います。

Ubuntu 22.04では、インストールするのは Pythonのモジュールだけです。

Python用の WebDriver(Pythonのモジュールとして提供されている)を入手しましょう。
このページの Pythonタブにある方法でやります。
Seleniumライブラリのインストール

subro@Ubuntu2204:~$ pip3 install selenium
Defaulting to user installation because normal site-packages is not writeable
Collecting selenium
  Using cached selenium-4.3.0-py3-none-any.whl (981 kB)
Collecting urllib3[secure,socks]~=1.26
  Downloading urllib3-1.26.11-py2.py3-none-any.whl (139 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 139.9/139.9 KB 2.8 MB/s eta 0:00:00
Collecting trio~=0.17
  Using cached trio-0.21.0-py3-none-any.whl (358 kB)
Collecting trio-websocket~=0.9
  Using cached trio_websocket-0.9.2-py3-none-any.whl (16 kB)
Collecting async-generator>=1.9
  Using cached async_generator-1.10-py3-none-any.whl (18 kB)
Collecting sniffio
  Using cached sniffio-1.2.0-py3-none-any.whl (10 kB)
Collecting outcome
  Using cached outcome-1.2.0-py2.py3-none-any.whl (9.7 kB)
Collecting idna
  Using cached idna-3.3-py3-none-any.whl (61 kB)
Collecting sortedcontainers
  Using cached sortedcontainers-2.4.0-py2.py3-none-any.whl (29 kB)
Collecting attrs>=19.2.0
  Downloading attrs-22.1.0-py2.py3-none-any.whl (58 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 58.8/58.8 KB 13.7 MB/s eta 0:00:00
Collecting wsproto>=0.14
  Using cached wsproto-1.1.0-py3-none-any.whl (24 kB)
Collecting pyOpenSSL>=0.14
  Using cached pyOpenSSL-22.0.0-py2.py3-none-any.whl (55 kB)
Requirement already satisfied: cryptography>=1.3.4 in /usr/lib/python3/dist-packages (from urllib3[secure,socks]~=1.26->selenium) (3.4.8)
Collecting certifi
  Using cached certifi-2022.6.15-py3-none-any.whl (160 kB)
Collecting PySocks!=1.5.7,<2.0,>=1.5.6
  Using cached PySocks-1.7.1-py3-none-any.whl (16 kB)
Collecting cryptography>=1.3.4
  Downloading cryptography-37.0.4-cp36-abi3-manylinux_2_24_x86_64.whl (4.1 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.1/4.1 MB 5.7 MB/s eta 0:00:00
Collecting cffi>=1.12
  Using cached cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (441 kB)
Collecting h11<1,>=0.9.0
  Using cached h11-0.13.0-py3-none-any.whl (58 kB)
Collecting pycparser
  Using cached pycparser-2.21-py2.py3-none-any.whl (118 kB)
Installing collected packages: sortedcontainers, urllib3, sniffio, PySocks, pycparser, idna, h11, certifi, attrs, async-generator, wsproto, outcome, cffi, trio, cryptography, trio-websocket, pyOpenSSL, selenium
Successfully installed PySocks-1.7.1 async-generator-1.10 attrs-22.1.0 certifi-2022.6.15 cffi-1.15.1 cryptography-37.0.4 h11-0.13.0 idna-3.3 outcome-1.2.0 pyOpenSSL-22.0.0 pycparser-2.21 selenium-4.3.0 sniffio-1.2.0 sortedcontainers-2.4.0 trio-0.21.0 trio-websocket-0.9.2 urllib3-1.26.11 wsproto-1.1.0

入りました。

実行環境構築としてはこれで終わりです。

実際に自動実行を何かやってみます。

このホームページのトップページにアクセスして、タイトルが「お金をかけずにサーバーの勉強をしよう」になってるか確認して、証跡としてトップページの絵を画像ファイル(png)として取得してみます。

コードはオフィシャルの例をコピペしてこんな感じに。

subro@Ubuntu2204:~/work/python/test1$ cat test.py
import unittest
from selenium import webdriver

class OkaneKakenai(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Firefox()

    def test_search_in_python_org(self):
        driver = self.driver
        driver.get("https://subro.mokuren.ne.jp")
        self.assertIn("お金をかけずにサーバーの勉強をしよう", driver.title, '---理由--- タイトルが間違っています。')
        driver.get_full_page_screenshot_as_file("screenshot.png")

    def tearDown(self):
        self.driver.close()

if __name__ == "__main__":
    unittest.main()

Pythonに慣れてる人であれば、Seleniumを知らなくても概ね何をしているか分かると思います。

ところで unittestってモジュールは、デフォルトで unittest.TestCase を継承しているクラス全てを実行するんでしょうか。
OkaneKakenaiクラスのメソッドをどうやって実行対象に指定しているのかよく分かりませんでした。

結果はテストOKでして、こんな出力と縦に長〜い pngファイルを得られました。

subro@Ubuntu2204:~/work/python/test1$ python3 test.py
.
----------------------------------------------------------------------
Ran 1 test in 8.249s

OK

テスト中にモニタを見ていると、自動で Firefoxが立ち上がって、このホームページが表示されていました。

それを観ているのは中々面白いもので、画面が勝手に動いていくのはスクリプトでAPIを叩いてるのとはまた違った趣があります。


WebDriverでは、画面にある要素を特定して、入力フィールドなら文字を打ち込み、ボタンがあれば押す、そんな動作を一通りできるようになっていますので、マクロを組む感じで自動化/テストスクリプトを書けると思います。
当HPはサーバー環境のネタを書くために作っているので、このネタはちょっとそこからは外れていますので、この辺で終わりにします。

Seleniumにはリモートノードにある WebDriverに仕事をさせるという機能がありますので、その環境を作るネタをいつか書きたいと思います。


日本で流通している Seleniumの本は少なくて、これが最後だったんじゃないかと思います。
2017年刊行ですから最新バージョンではかなり変わってしまっているはずで、あくまで Seleniumの考え方を捉えるくらいですね。
オライリーのもあるんですが、もっと古いです。

Selenium実践入門 自動化による継続的なブラウザテスト (WEB+DB press plusシリーズ) [ 伊藤望 ]

価格:3,630円
(2022/8/1 18:45時点)
感想(2件)