Selenium Javaを起動して Function Computeを開発する方法

このチュートリアルでは、Selenium Javaを実行して関数計算を開発する方法を学びます。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/develop-function-compute-by-running-selenium-java_595255)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

#背景
まず、Alibaba Cloudの[Function Compute](https://www.alibabacloud.com/ja/products/function-compute)がありますが、これはイベント駆動型のサービスで、ユーザーはサーバーの健全性を管理したり、その他の要因を考慮することなく、コードを書いたりアップロードしたりすることができます。Function Computeは、ユーザーのコードを実行するために必要な適切な量のコンピューティングリソースを準備し、自動的にスケーリングします。ユーザーは自分のコードを実行するのに必要なリソースのみを支払います。

次に、サーバーレスアプリケーションのためのデプロイメントツールである[Fun](https://github.com/alibaba/funcraft/blob/master/README-en.md?spm=a2c65.11461447.0.0.1c162c25CtGClJ&file=README-en.md)があります。これは、Function Compute、[API Gateway](https://www.alibabacloud.com/ja/product/api-gateway)、[Log Service](https://www.alibabacloud.com/ja/product/log-service)などのリソースを管理するのに役立ちます。Funを使用して、`template.yml`ファイルに指定したリソースを記述することで、リソースの開発、ビルド、デプロイを行うことができます。

注: この記事で説明したテクニックは、Fun 2.10.2 以降に適用されます。

#ツール
このチュートリアルでは、Selenium Javaを実行して関数計算を開発する方法について説明します。このチュートリアルで概説されているプロジェクトはmacOS上で開発されていますが、プラットフォームに依存しないツールも含まれており、LinuxやWindowsとの互換性があります。この例に進む前に、[Docker](https://yq.aliyun.com/go/articleRenderRedirect?spm=a2c65.11461447.0.0.1c162c25CtGClJ&url=https://www.docker.com/)、[Fun](https://github.com/alibaba/funcraft/blob/master/README-en.md?spm=a2c65.11461447.0.0.1c162c25CtGClJ&file=README-en.md)、[Fcli](https://yq.aliyun.com/go/articleRenderRedirect?spm=a2c65.11461447.0.0.1c162c25CtGClJ&url=https://github.com/aliyun/fcli)が正しくインストールされ、最新バージョンにアップデートされ、適切に設定されていることを確認してください。これらのツールのダウンロード、アップデート、設定は、ここにリンクされているページの指示とリソースで行うことができます。

FunとFcliはローカル環境をシミュレートするためにDockerに依存しています。MacOSユーザーは、これらのツールをインストールするために[homebrew](https://yq.aliyun.com/go/articleRenderRedirect?spm=a2c65.11461447.0.0.1c162c25CtGClJ&url=https://brew.sh/)を使用することができます。

```
brew cask install docker
brew tap vangie/formula
brew install fun
brew install fcli
```

Windows と Linux ユーザーは、これらのツールのインストール方法については、[Installation](https://github.com/alibaba/funcraft/blob/master/docs/usage/installation.md?spm=a2c65.11461447.0.0.1c162c25CtGClJ&file=installation.md) を参照してください。インストール後、最初に `fun config` を実行して設定を初期化することを忘れないでください。

注: 既にFunをインストールしている場合は、バージョン2.10.1以上であることを確認してください。

```
$ fun --version
2.10.1
```

#Selenium Javaを実行する
`fun init`コマンドを使って、このテンプレートプロジェクトをローカル環境に簡単に初期化することができます。

```
fun init vangie/selenium-java-example
```

そして、`fun install`コマンドを使って依存関係をインストールします。

```
$ fun install
...
```

テキストを使用している場合は、ローカルテストを行うことができます。そのためには、セグメントの内容が以下のようになっている `ChromeDemo` のテストコードを使用することができます。

```
public class ChromeDemo implements StreamRequestHandler {


    public void handleRequest(InputStream inputStream,
                              OutputStream outputStream,
                              Context context) throws IOException {

        System.setProperty("webdriver.chrome.driver", "/code/chromedriver");

        ChromeOptions options = new ChromeOptions();
        options.setBinary("/code/headless-chromium");
        options.addArguments("--disable-extensions"); // disabling extensions
        options.addArguments("--disable-gpu"); // applicable to windows os only
        options.addArguments("--disable-dev-shm-usage"); // overcome limited resource problems
        options.addArguments("--no-sandbox"); // Bypass OS security model
        options.addArguments("--headless");

        WebDriver driver = new ChromeDriver(options);

        driver.get("https://ide.fc.aliyun.com");

        outputStream.write(("Page title is: " + driver.getTitle() + "\n").getBytes());

        driver.quit();

    }

}
```

次に、以下のコマンドを使用して、ローカルでコードをツリー化します。

```
$ mvn package && fun local invoke selenium
...
FC Invoke Start RequestId: 68c83b4c-b053-479c-9b0e-9503582ccb56
handle user request is com.aliyun.fc.selenium.ChromeDemo::handleRequest
cache is null!
Starting ChromeDriver 2.35.528139 (47ead77cb35ad2a9a83248b292151462a66cd881) on port 20652
Only local connections are allowed.
Mar 05, 2019 11:34:27 AM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: OSS
Page title is: Cloud-integrated development environment
FC Invoke End RequestId: 68c83b4c-b053-479c-9b0e-9503582ccb56


RequestId: 68c83b4c-b053-479c-9b0e-9503582ccb56          Billed Duration: 5265 ms        Memory Size: 1998 MB    Max Memory Used: 240 MB
```

そして、`fun deploy`コマンドを使ってデプロイします。

```
$ mvn package && fun deploy
```

最後に、実行してみてください。

```
$  fcli function invoke -s chrome -f selenium
  Page title is: 云端集成开发环境
```

#ファイルサイズ
圧縮後のchromedriverとheadless-chromiumのサイズが50MBと非常に近く、jarの空き容量が少ないため、高圧縮版も作成しています。圧縮率が高いのが特徴のBrotliアルゴリズムを使って圧縮後のファイルは32.7MBになります。プロジェクトを実行する際には、イニシャライザを使用して解凍を行いますが、これには約3.7秒かかります。

#参考文献
1、[AWS LambdaでのヘッドレスChrome + Seleniumウェブドライバー](https://github.com/smithclay/lambdium?spm=a2c65.11461447.0.0.1c162c25CtGClJ)
2、[AWS Lambda上でSeleniumとHeadless Chromeを実行する](https://medium.com/clog/running-selenium-and-headless-chrome-on-aws-lambda-fb350458e4df?spm=a2c65.11461447.0.0.1c162c25CtGClJ)


*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*