面白そうなツールがあったので触ってみましたという話です。
読み方は「アルミニウム」でいいんでしょうか。
Alumniumとは
Aluminum is an experimental project that builds upon the existing test automation ecosystem, offering a higher-level abstraction for testing. It aims to simplify interactions with web pages and provide more robust mechanisms for verifying assertions.
【Geminiの翻訳】
Aluminumは、既存のテスト自動化エコシステムの上に構築された実験的なプロジェクトであり、より高レベルの抽象化をテストに提供します。 これは、Webページとの相互作用を簡素化し、アサーションを検証するためのより堅牢なメカニズムを提供することを目的としています。
これだけだといまいちわからないと思うので自分なりに説明すると、本記事のタイトルの通り「自然言語でブラウザ操作ができる」ツールです。
Seleniumでブラウザ操作を行う場合は、ロケータを使って要素を指定して命令を書きますが、Aluminiumでは自然言語で操作ができるようになっています。
サンプルコード見ていただいたほうが早そう。以下のコードが動きます。
import unittest
from alumnium import Alumni
from selenium.webdriver import Chrome
class TestGoogleSearch(unittest.TestCase):
def setUp(self):
self.driver = Chrome()
self.driver.get("https://yoshikiito.net")
self.al = Alumni(self.driver)
def test_search(self):
self.al.do("3ページ目を開く")
self.al.check("ページに「餃子」というキーワードがあることを確認")
こんな具合に、テスト対象のURL指定してブラウザを立ち上げたあとは、
- 3ページ目を開く
- ページに「餃子」というキーワードがあることを確認
など自然言語(日本語も)で操作やアサートができてしまいます。便利。
ちなみに結果も
AssertionError: The keyword '餃子' (gyoza) does not appear anywhere in the provided ARIA tree or in the title of the webpage.
このように表示されます。
※餃子、に意味はなくて、わざとページ中にないであろう単語を指定してみた結果です。
さてこのAluminium、公式サイトによると
Currently in the very early stages of development and not recommended for production use.
とのことで、実際に業務で使うにはまだまだ早い段階のようです。が、ちょっと触って遊ぶ分には非常に面白かったです。
用意するもの
- Python
- OpenAIのAPIキー
- Claude, Gemini, Llamaのモデルも使えるもののGPTがデフォルトなのでOpenAIがおすすめ
- いちおう公式的にはGeminiだと無料で使える枠があるのでそれで試すのもいいよと書いてある
私はOpenAIのAPIキーを使いました。
インストールしてブラウザを動かすまで
基本的には公式ドキュメントに書いてありますが、途中いくつか補足も要りそうだったので、そのあたりを補足していきます。
Alumniumのインストール
pip install alumnium
これだけです。
APIキー等の設定
環境変数にいくつか値を設定します。利用するモデルによって若干異なるようです。
OpenAIの場合は以下。
export ALUMNIUM_MODEL="openai"
export OPENAI_API_KEY="sk-proj-..."
なおしれっと書いてありますがWindowsの場合は上記だと動かないので、普通に設定の環境変数から上記設定しましょう。
ブラウザを動かす
公式の手順は
- Alumniumを使わずSeleniumだけでブラウザ起動することを確認
- Alumniumを組み合わせてブラウザ起動することを確認
- Alumniumを使って自然言語でブラウザ操作を行う
- Alumniumを使って自然言語でアサートを行う
- わざと失敗させる
- 成功させる
という流れで、一歩一歩進む形を取っています。
引っかかったポイント
テスト自体は問題なく動いていたのですが、3のブラウザ操作をさせた際に、以下のようなエラーが出ました。
実行したコード(サンプルのうち、search for ほげほげ の部分の検索キーワードを変更)
import unittest
from alumnium import Alumni
from selenium.webdriver import Chrome
class TestGoogleSearch(unittest.TestCase):
def setUp(self):
self.driver = Chrome()
self.driver.get("https://google.com")
self.al = Alumni(self.driver)
def test_search(self):
self.al.do("search for テストウフ")
エラー表示
[39056:10332:0127/154254.782:ERROR:command_buffer_proxy_impl.cc(331)] GPU state invalid after WaitForGetOffsetInRange.
少し検索してみると、StackOverflowなどがヒットしたのですが、「エラーを非表示にする」という対応が書かれたものがいくつもありました。 それはそれで問題だと思うので、Seleniumで操作するChromeのGPUハードウェアアクセラレーションをオフにする設定にして解消しました。
エラー解消後のコード
import unittest
from alumnium import Alumni
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
class TestGoogleSearch(unittest.TestCase):
def setUp(self):
options = Options()
options.add_argument("--disable-gpu")
self.driver = Chrome(options=options)
self.driver.get("https://google.com")
self.al = Alumni(self.driver)
def test_search(self):
self.al.do("search for テストウフ")
これでOKでした。
これで、冒頭のサンプルコード(にdisable-gpuオプションを追加したもの)が動くようになりました。 動作イメージは以下です。
面白い。
実行のたびにOpenAIのAPI利用料がかかるといえばそうなのですが、既存のAI自動テストツールにこの機能が追加された場合と比べるとだいぶ安価な予感がします。
今(2025年1月時点)だとまだ機能が少なく、逆に触ってみるにはミニマムで良い気がするので、興味ある方はぜひ。