Webページのリンク切れを見つける話（Katalon Studioで）


この記事はQiita Advent Calendar 2020の Selenium/Chrome DevTools Protocol/Appium カレンダーの2日目の記事です。

# はじめに

わたしはWebアプリケーションのUIをテストする作業をソフトウェアで自動化する技術に関心があります。2018年1月以来わたしは [Katalon Studio](https://www.katalon.com/) というソフトウェアに注目しています。以前、Qiitaに[「Katalon Studioとはどんなソフトウエアか」](https://qiita.com/kazurayam/items/aece5d314f84893a0a14)を投稿して概要を紹介しました。

最近、Katalon Studioのユーザーforumを眺めていたら、**"How can i find broken links in web pages?"** （Webページのリンク切れを見つけるにはどうすればいいのか） という質問がふたつ三つ投稿されました。またか！と思いました。Finding broken links問題はWebUIテストに関するFAQのひとつです。私が2018年にKatalon Studioを触りはじめたとき最初に取り組んだのもリンク切れ検査でした。いまなら前より上手に解決できるだろうと思い、やってみました。Katalon Studioを役立てるサンプルとして紹介します。

# サンプルのありか

GitHubにレポジトリを作り公開しました。

- [Finding Broken Links with Katalon Studio](https://github.com/kazurayam/FindingBrokenLinksWithKatalonStudio)

このレポジトリの[Releases](https://github.com/kazurayam/FindingBrokenLinksWithKatalonStudio/releases)ページからプロジェクト一式をまとめたZIPファイルをダウンロードすることができます。

# サンプルの説明

## 動作環境

わたしは下記の環境でサンプルを開発しました。

- Katalon Studio version 7.2.2
- macOS Catalina 10.15.7

Katalon StudioはJavaVMベースのソフトウェアでWindowsでもLinuxでも動きます。今回のサンプルコードはKatalon Studioの基本的なAPIだけを使っているので古いversion7.0.xでも動くはずです。

## 動かしてみよう

あなたがKatalon Studioを自分のPCにインストール済みであると前提します（インストール方法については後述）。

[Releases](https://github.com/kazurayam/FindingBrokenLinksWithKatalonStudio/releases)ページからZIPファイルをダウンロードしましょう。ZIPを展開して`FindingBrokenLinksWithKatalonStudio`フォルダを任意の場所に位置付けます。Katalon Studioをstartしてプロジェクトをopenしましょう。

Katalon Studioのウインドウの左がわに `Tests Explorer` とラベルされた四角い面があってその中をマウスでいじると `Test Cases/main` を選択することができます。

![main](https://github.com/kazurayam/FindingBrokenLinksWithKatalonStudio/blob/master/docs/images/Test%20Cases_main.png?raw=true)


`Test Cases/main`をマウスで選択したあと、GUIの右上の方にある緑色の三角形のボタン ![GreenArrowButton.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52995/6607f64a-1a77-c360-d046-81ed1d6c6b62.png) 
をクリックすると`main`が実行されます。

## mainは何をするか

- [`main`](https://github.com/kazurayam/FindingBrokenLinksWithKatalonStudio/blob/master/Scripts/main/Script1605930113008.groovy) はブラウザを起動し、指定されたURLのWebページを開いて、ページの中にある`<a href="url">`タグをすべて選び出します。そして`href="url"`の部分に書かれたURLが実際にアクセス可能かどうかを検査します。
- アクセス可能かどうかを検査するために`main`はリンク先URLにたいしてHTTP GETリクエストを投げます。レスポンスが返されるのを待ってHTTPステータスコードとURL文字列の組を記録します。
- `main`はレスポンスのステータスコードを識別します。ステータスコードが 200, 301, 302 ならばOK、それ以外なら当該URLはリンク切れしていると判定します。
- `main`は Google検索の応答ページ( https://www.google.com/search?q=katalon )を検査する例を示していますが、任意のURL（複数）を列挙すればそれらを一度に検査することができます。
- `main`は切れているリンク先URLの数を数えます。
- もしもリンク切れがひとつ以上見つかったら`main`はテスト失敗を告げるメッセージを赤文字で表示して注意喚起します。もしもリンク切れが無ければ静かに終わります。
- `main`はできるだけ早く動けるように設計されています。とはいってもリンク先URLひとつ一つにHTTP GETリクエストを実際に投げて検査するのでそのぶんの時間はどうしてもかかります。

## 所要時間

たとえば https://www.google.com/search?q=katalon は106個の `<a href="...">` タグを含んでいるのですが、このページを `main` が検査するのにわたしの環境では103秒かかりました。まあ、人手で調べるのに比べればよほど早いと思います。

## mainからの出力

https://www.google.com/search?q=katalon を指定して`main`を実行したら下記の診断レポートが出力されました。

```
*** All <a> elements in https://www.google.com/search?q=katalon ***
200 <a href=https://support.google.com/websearch/answer/181196?hl=ja>
301 <a href=https://www.google.co.jp/intl/ja/about/products?tab=wh>
200 <a href=https://accounts.google.com/ServiceLogin?hl=ja&passive=true&continue=https://www.google.com/search%3Fq%3Dkatalon&ec=GAZAAQ>
200 <a href=https://www.google.com/webhp?hl=ja&sa=X&ved=0ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQPAgI>
200 <a href=https://www.google.com/search?q=katalon#>
200 <a href=https://www.google.com/search?q=katalon&source=lnms&tbm=vid&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ_AUoAXoECBoQAw>
200 <a href=https://www.google.com/search?q=katalon&source=lnms&tbm=isch&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ_AUoAnoECBoQBA>
200 <a href=https://www.google.com/search?q=katalon&source=lnms&tbm=nws&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ_AUoA3oECBoQBQ>
302 <a href=https://maps.google.com/maps?q=katalon&um=1&ie=UTF-8&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ_AUoBHoECBoQBg>
200 <a href=https://www.google.com/search?q=katalon&source=lnms&tbm=shop&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ_AUoAHoECBoQCg>
200 <a href=https://www.google.com/search?q=katalon&source=lnms&tbm=bks&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ_AUoAXoECBoQCw>
302 <a href=https://www.google.com/flights?q=katalon&source=lnms&tbm=flm&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ_AUoAnoECBoQDA>
200 <a href=https://www.google.com/search?q=katalon&source=lnms&tbm=fin&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ_AUoA3oECBoQDQ>
200 <a href=https://www.google.com/preferences>
200 <a href=https://www.google.com/preferences?hl=ja&prev=https://www.google.com/search?q%3Dkatalon>
200 <a href=https://www.google.com/preferences?hl=ja&prev=https://www.google.com/search?q%3Dkatalon#languages>
302 <a href=https://www.google.com/setprefs?safeui=on&sig=0_Np3kHRCrNprTVuwnrWalmoz3JRo%3D&prev=https://www.google.com/search?q%3Dkatalon>
200 <a href=https://www.google.com/advanced_search?q=katalon&hl=ja>
302 <a href=https://www.google.com/history/optout?hl=ja>
200 <a href=https://www.google.com/history/privacyadvisor/search/unauth?utm_source=googlemenu>
200 <a href=https://support.google.com/websearch/?source=g&hl=ja>
200 <a href=https://www.google.com/search?q=katalon&source=lnt&tbs=lr:lang_1ja&lr=lang_ja&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQpwV6BAgaEB8>
200 <a href=https://www.google.com/search?q=katalon&source=lnt&tbs=qdr:h&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQpwV6BAgaECQ>
200 <a href=https://www.google.com/search?q=katalon&source=lnt&tbs=qdr:d&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQpwV6BAgaECU>
200 <a href=https://www.google.com/search?q=katalon&source=lnt&tbs=qdr:w&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQpwV6BAgaECY>
200 <a href=https://www.google.com/search?q=katalon&source=lnt&tbs=qdr:m&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQpwV6BAgaECc>
200 <a href=https://www.google.com/search?q=katalon&source=lnt&tbs=qdr:y&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQpwV6BAgaECg>
200 <a href=https://www.google.com/search?q=katalon&source=lnt&tbs=li:1&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQpwV6BAgaEC8>
200 <a href=https://www.katalon.com/>
200 <a href=https://www.google.com/search?q=katalon#>
200 <a href=https://webcache.googleusercontent.com/search?q=cache:AY6Tl3FzBkMJ:https://www.katalon.com/+&cd=1&hl=ja&ct=clnk&gl=jp>
200 <a href=https://www.google.com/search?q=related:https://www.katalon.com/+katalon&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQHzAAegQIBhAG>
200 <a href=https://translate.google.com/translate?hl=ja&sl=en&u=https://www.katalon.com/&prev=search&pto=aue>
200 <a href=https://www.katalon.com/sign-up/>
200 <a href=https://www.katalon.com/pricing/>
200 <a href=https://www.katalon.com/katalon-studio/>
200 <a href=https://docs.katalon.com/katalon-studio/docs/index.html>
200 <a href=https://qiita.com/kazurayam/items/aece5d314f84893a0a14>
200 <a href=https://www.google.com/search?q=katalon#>
200 <a href=https://webcache.googleusercontent.com/search?q=cache:vHAftIdtb6EJ:https://qiita.com/kazurayam/items/aece5d314f84893a0a14+&cd=2&hl=ja&ct=clnk&gl=jp>
200 <a href=https://qiita.com/RyomaMaeda/items/0d02c1687e8bc4e57944>
200 <a href=https://www.google.com/search?q=katalon#>
200 <a href=https://webcache.googleusercontent.com/search?q=cache:RNVBRUJGoqYJ:https://qiita.com/RyomaMaeda/items/0d02c1687e8bc4e57944+&cd=3&hl=ja&ct=clnk&gl=jp>
200 <a href=https://blog.engineer.adways.net/entry/advent_calendar_2018/07>
200 <a href=https://www.google.com/search?q=katalon#>
200 <a href=https://webcache.googleusercontent.com/search?q=cache:k2-k8oSBCXIJ:https://blog.engineer.adways.net/entry/advent_calendar_2018/07+&cd=4&hl=ja&ct=clnk&gl=jp>
200 <a href=https://chrome.google.com/webstore/detail/katalon-recorder-selenium/ljdobmomdgdljniojadhoplhkpialdid?hl=ja>
200 <a href=https://www.itreview.jp/products/katalon-studio/reviews>
200 <a href=https://www.google.com/search?q=katalon#>
200 <a href=https://webcache.googleusercontent.com/search?q=cache:3NPH48fjbtwJ:https://www.itreview.jp/products/katalon-studio/reviews+&cd=6&hl=ja&ct=clnk&gl=jp>
200 <a href=http://take-web.com/cad/2019/03/katalon02/>
200 <a href=https://www.google.com/search?q=katalon#>
200 <a href=http://webcache.googleusercontent.com/search?q=cache:J8Ty-CNXBqAJ:take-web.com/cad/2019/03/katalon02/+&cd=7&hl=ja&ct=clnk&gl=jp>
200 <a href=https://devtab.jp/entry/internal/103>
200 <a href=https://www.google.com/search?q=katalon#>
200 <a href=https://webcache.googleusercontent.com/search?q=cache:87OELWRWjQoJ:https://devtab.jp/entry/internal/103+&cd=8&hl=ja&ct=clnk&gl=jp>
200 <a href=https://www.sprasia.co.jp/blog/about-katalon-studio>
200 <a href=https://www.google.com/search?q=katalon#>
200 <a href=https://webcache.googleusercontent.com/search?q=cache:bItVmyO2LCcJ:https://www.sprasia.co.jp/blog/about-katalon-studio+&cd=9&hl=ja&ct=clnk&gl=jp>
200 <a href=https://okometsubulog.hatenablog.com/entry/computer/katalon-recorder-190826>
200 <a href=https://www.google.com/search?q=katalon#>
200 <a href=https://webcache.googleusercontent.com/search?q=cache:62oOYgH-tTkJ:https://okometsubulog.hatenablog.com/entry/computer/katalon-recorder-190826+&cd=10&hl=ja&ct=clnk&gl=jp>
200 <a href=https://www.google.com/search?q=katalon+studio+%E6%97%A5%E6%9C%AC%E8%AA%9E&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ1QIoAHoECBYQAQ>
200 <a href=https://www.google.com/search?q=Katalon+Chrome&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ1QIoAXoECBYQAg>
200 <a href=https://www.google.com/search?q=katalon+recorder+%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E4%B8%80%E8%A6%A7&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ1QIoAnoECBYQAw>
200 <a href=https://www.google.com/search?q=Katalon+Studio+%E7%84%A1%E6%96%99&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ1QIoA3oECBYQBA>
200 <a href=https://www.google.com/search?q=Katalon+user-agent&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ1QIoBHoECBYQBQ>
200 <a href=https://www.google.com/search?q=Katalon+Studio+Enterprise&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ1QIoBXoECBYQBg>
200 <a href=https://www.google.com/search?q=Katalon+Selenium&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ1QIoBnoECBYQBw>
200 <a href=https://www.google.com/search?q=Katalon+Studio+license&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ1QIoB3oECBYQCA>
200 <a href=https://www.google.com/search?q=katalon+recorder+%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ1QIoCHoECBYQCQ>
200 <a href=https://www.google.com/search?q=Katalon+Studio+%E6%9C%89%E5%84%9F&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ1QIoCXoECBYQCg>
200 <a href=https://www.google.com/search?q=katalon&ei=LOC5X770GIepoATj25GYCQ&start=10&sa=N&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ8tMDegQIGhA6>
200 <a href=https://www.google.com/search?q=katalon&ei=LOC5X770GIepoATj25GYCQ&start=20&sa=N&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ8tMDegQIGhA8>
200 <a href=https://www.google.com/search?q=katalon&ei=LOC5X770GIepoATj25GYCQ&start=30&sa=N&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ8tMDegQIGhA->
200 <a href=https://www.google.com/search?q=katalon&ei=LOC5X770GIepoATj25GYCQ&start=40&sa=N&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ8tMDegQIGhBA>
200 <a href=https://www.google.com/search?q=katalon&ei=LOC5X770GIepoATj25GYCQ&start=50&sa=N&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ8tMDegQIGhBC>
200 <a href=https://www.google.com/search?q=katalon&ei=LOC5X770GIepoATj25GYCQ&start=60&sa=N&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ8tMDegQIGhBE>
200 <a href=https://www.google.com/search?q=katalon&ei=LOC5X770GIepoATj25GYCQ&start=70&sa=N&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ8tMDegQIGhBG>
200 <a href=https://www.google.com/search?q=katalon&ei=LOC5X770GIepoATj25GYCQ&start=80&sa=N&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ8tMDegQIGhBI>
200 <a href=https://www.google.com/search?q=katalon&ei=LOC5X770GIepoATj25GYCQ&start=90&sa=N&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ8tMDegQIGhBK>
200 <a href=https://www.google.com/search?q=katalon&ei=LOC5X770GIepoATj25GYCQ&start=10&sa=N&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ8NMDegQIGhBM>
200 <a href=https://www.google.com/search?q=katalon&tbm=isch&source=iu&ictx=1&fir=agH-OHUAGpr6oM%252Cs1xcty8VPvH_DM%252C%252Fg%252F11g0gdvypx&vet=1&usg=AI4_-kSzcTzeJR8PP1TPHUSzRMD567VD2A&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ_B16BAgQEAM#imgrc=agH-OHUAGpr6oM>
200 <a href=https://www.google.com/search?q=katalon&tbm=isch&source=iu&ictx=1&fir=Pp6NM6wsYad_JM%252C2WIkL7xlWx0bNM%252C_&vet=1&usg=AI4_-kTyNReEfY30eUAwcMzIZ502DTioXw&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ_h16BAgQEAU#imgrc=Pp6NM6wsYad_JM>
200 <a href=https://www.google.com/search?q=katalon&tbm=isch&source=iu&ictx=1&fir=li-VPjPjbHhdiM%252C2WIkL7xlWx0bNM%252C_&vet=1&usg=AI4_-kRRiS5q1J0r1B46J3Gr41Q76zCrKA&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ_h16BAgQEAc#imgrc=li-VPjPjbHhdiM>
200 <a href=https://www.google.com/search?q=katalon&tbm=isch&source=iu&ictx=1&fir=Zz_El5lR0OzrFM%252C2WIkL7xlWx0bNM%252C_&vet=1&usg=AI4_-kQFsQF_ebSW53jA63T7ccD95KGECg&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ_h16BAgQEAk#imgrc=Zz_El5lR0OzrFM>
200 <a href=https://www.google.com/search?q=katalon&tbm=isch&source=iu&ictx=1&fir=pA44ogVw6OpwNM%252C2WIkL7xlWx0bNM%252C_&vet=1&usg=AI4_-kQ1cmGEuF8F5MaxhFZRNERpZLg-Ew&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ_h16BAgQEAs#imgrc=pA44ogVw6OpwNM>
200 <a href=https://www.google.com/search?source=univ&tbm=isch&q=katalon&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQiR56BAgQEAw>
200 <a href=https://en.wikipedia.org/wiki/Katalon_Studio>
200 <a href=https://en.wikipedia.org/wiki/Katalon_Studio>
200 <a href=https://www.google.com/search?q=katalon+studio+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E&stick=H4sIAAAAAAAAAOPgE-LVT9c3NEw3SE8pqyyo0NLJKLfST87PyUlNLsnMz9Mvzk8rKU8sSrUqKMpPL0rMzc3MS1fIScxLL01MT13EqpWdWJKYk5-nUFxSmpKZr_C4efrj5rWPmzY8bl75uHn-4-bNQPaLFQ0vVs0DAMc_iVRsAAAA&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQ6BMoADASegQICRAC>
200 <a href=https://www.google.com/search?q=Groovy&stick=H4sIAAAAAAAAAOPgE-LVT9c3NEw3SE8pqyyoUOLUz9U3MMoqtjDT0skot9JPzs_JSU0uyczP0y_OTyspTyxKtSooyk8vSszNzcxLV8hJzEsvTUxPXcTK5l6Un19WuYOVEQA2eCsDVgAAAA&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQmxMoATASegQICRAD>
200 <a href=https://www.google.com/search?q=Katalon+Studio&stick=H4sIAAAAAAAAAONgFuLVT9c3NEw3SE8pqyyoUELlaglnJ1vpJ-fn5ubnWRVnpqSWJ1YWL2Ll804sSczJz1MILilNyczfwcoIAAOBc2RJAAAA&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQMSgAMBN6BAgNEAE>
200 <a href=https://www.google.com/search?q=Katalon+Studio&stick=H4sIAAAAAAAAAONgFuLVT9c3NEw3SE8pqyyoUELlaglnJ1vpJ-fn5ubnWRVnpqSWJ1YWL2Ll804sSczJz1MILilNyczfwcoIAAOBc2RJAAAA&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQzTooATATegQIDRAC>
200 <a href=https://www.google.com/search?q=Selenium&stick=H4sIAAAAAAAAAONgFuLVT9c3NEw3SE8pqyyoUOLUz9U3SLYwsijT4nPOz83NzwvOTEktT6wsXsTKEZyak5qXWZq7g5URAM9rDMc6AAAA&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQxA0wE3oECA0QBQ>
200 <a href=https://www.google.com/search?q=appium&stick=H4sIAAAAAAAAAONgFuLVT9c3NEw3SE8pqyyoUIJwk00tTQyLqgy1-Jzzc3Pz84IzU1LLEyuLF7GyJRYUZJbm7mBlBACP5TAsPAAAAA&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQxA0wE3oECA0QBw>
200 <a href=https://www.google.com/search?q=testcomplete&stick=H4sIAAAAAAAAAONgFuLVT9c3NEw3SE8pqyyoUOLSz9U3MKlMKzBP0uJzzs_Nzc8LzkxJLU-sLF7EylOSWlySnJ9bkJNakrqDlREAq6gCxT8AAAA&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQxA0wE3oECA0QCQ>
200 <a href=https://www.google.com/search?q=ranorex&stick=H4sIAAAAAAAAAONgFuLVT9c3NEw3SE8pqyyoUOLSz9U3MDLPMbZI0eJzzs_Nzc8LzkxJLU-sLF7Eyl6UmJdflFqxg5URAG1WHk46AAAA&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQxA0wE3oECA0QCw>
200 <a href=https://www.google.com/search?q=JMeter&stick=H4sIAAAAAAAAAONgFuLVT9c3NEw3SE8pqyyoUOLUz9U3MKksSM7Q4nPOz83NzwvOTEktT6wsXsTK5uWbWpJatIOVEQDvJGOxOAAAAA&sa=X&ved=2ahUKEwi-uvbmn5XtAhWHFIgKHeNtBJMQxA0wE3oECA0QDQ>
200 <a href=https://www.google.com/search?q=katalon#>
200 <a href=https://www.google.com/search?q=katalon#>
301 <a href=https://support.google.com/websearch?p=ws_settings_location&hl=ja>
301 <a href=https://support.google.com/websearch/?p=ws_results_help&hl=ja&fg=1>
200 <a href=https://www.google.com/search?q=katalon#>
200 <a href=https://policies.google.com/privacy?hl=ja&fg=1>
200 <a href=https://policies.google.com/terms?hl=ja&fg=1>
Broken/All: 0/106
```

このWebページには`<a href="..">`が106個あってそのうちリンク切れは無いと診断されました。

いっぽうリンク切れを含む別のWebページを指定すると`main`は最後に下記のようなExceptionを投げて注意喚起をしてくれました。

```
2020-11-22 13:30:00.532 INFO  c.k.katalon.core.main.TestCaseExecutor   - START Test Cases/main
...
Broken/All: 6/167
2020-11-22 13:31:29.095 INFO  c.k.katalon.core.main.TestCaseExecutor   - END CALL Test Cases/findBrokenAnchorsInPage
2020-11-22 13:31:29.095 INFO  c.k.katalon.core.main.TestCaseExecutor   - --------------------
2020-11-22 13:31:29.108 ERROR com.kms.katalon.core.util.KeywordUtil    - ❌ one or more broken links are found
2020-11-22 13:31:29.118 ERROR c.k.katalon.core.main.TestCaseExecutor   - ❌ Test Cases/main FAILED.
Reason:
com.kms.katalon.core.exception.StepFailedException: one or more broken links are found
	at com.kms.katalon.core.util.KeywordUtil.markFailed(KeywordUtil.java:19)
	at com.kms.katalon.core.util.KeywordUtil$markFailed.call(Unknown Source)
	at main.run(main:21)
	at com.kms.katalon.core.main.ScriptEngine.run(ScriptEngine.java:194)
	at com.kms.katalon.core.main.ScriptEngine.runScriptAsRawText(ScriptEngine.java:119)
	at com.kms.katalon.core.main.TestCaseExecutor.runScript(TestCaseExecutor.java:339)
	at com.kms.katalon.core.main.TestCaseExecutor.doExecute(TestCaseExecutor.java:330)
	at com.kms.katalon.core.main.TestCaseExecutor.processExecutionPhase(TestCaseExecutor.java:309)
	at com.kms.katalon.core.main.TestCaseExecutor.accessMainPhase(TestCaseExecutor.java:301)
	at com.kms.katalon.core.main.TestCaseExecutor.execute(TestCaseExecutor.java:235)
	at com.kms.katalon.core.main.TestCaseMain.runTestCase(TestCaseMain.java:114)
	at com.kms.katalon.core.main.TestCaseMain.runTestCase(TestCaseMain.java:105)
	at com.kms.katalon.core.main.TestCaseMain$runTestCase$0.call(Unknown Source)
	at TempTestCase1606019395915.run(TempTestCase1606019395915.groovy:25)

2020-11-22 13:31:29.138 INFO  c.k.katalon.core.main.TestCaseExecutor   - END Test Cases/main

```

## コード

[FindingBrokenLinksWithKatalonStudio](https://github.com/kazurayam/FindingBrokenLinksWithKatalonStudio)プロジェクトは２つのGroovyスクリプトとGroovyクラス１個から構成されています。コードへのリンクを下記に列挙します。

- [Test Cases/main](https://github.com/kazurayam/FindingBrokenLinksWithKatalonStudio/blob/master/Scripts/main/Script1605930113008.groovy)
- [Test Cases/findBrokenAnchorsInPage](https://github.com/kazurayam/FindingBrokenLinksWithKatalonStudio/blob/master/Scripts/findBrokenAnchorsInPage/Script1605929957737.groovy)
- [Keywords/com/kazurayam/ksbackyard/LinkTestUtils.groovy](https://github.com/kazurayam/FindingBrokenLinksWithKatalonStudio/blob/master/Keywords/com/kazurayam/ksbackyard/LinkTestUtils.groovy)

これらソースの詳細をここで述べることはしません。これを読み解くにはJava/Groovy言語によるプログラミングのスキルが前提となります。サンプルコードはごく短い。JavaプログラミングはできるがKatalon Studioのことは未だご存知ない人が、Katalon Studioで自分に役立つテストツールをモノにする手本として手頃な難易度であろうと思います。









# 補足説明

## Katalon Studioのインストール、チュートリアル

Katalon Studioをどうやってインストールするか、最初の一歩を学ぶにはどこから行けばいいか？ 公式ドキュメントは下記にあります。

- [Documentations index](https://docs.katalon.com/katalon-studio/docs/index.html)

充実していますが全部英語です。ちょっと英語は...という方は下記の記事も参考にしてください。

- [Katalon Studioのダウンロードとインストール](https://yoshikiito.net/blog/archives/2000/) by Yoshiki Itoさん
- [Katalon StudioでRecordしてみた](https://qiita.com/kazurayam/items/433876c0b3bc7f33f019) by kazurayam
- [Katalon Studioでテストを自作した](https://qiita.com/kazurayam/items/bdf71ed70fdc32bb1758) by kazurayam
- [Katalon Studioでテストを自作した(2)](https://qiita.com/kazurayam/items/29282b749def80a806de) by kazurayam
- [Katalon Studio with aShotでスクリーンショットを取る](https://qiita.com/kazurayam/items/ec9015e781819a5734b1) by kazurayam
- [Katalon Studio+MaterialsでWebサイトのスクリーンショットを整然と保存する](https://qiita.com/kazurayam/items/6d76148fa866129696b7) by kazurayam
- [Katalon StudioでVisual Testingを実現した](https://qiita.com/kazurayam/items/bcf72a03f50fc5db4373) by kazurayam
- [あなたのWebサービスをVisual Testingする方法](https://qiita.com/kazurayam/items/7da4bd82b52fe18209db) by kazurayam

## Proxyのこと

Katalon Studio ver7.xはインターネット上のKatalon社のサーバと通信してライセンスを認証しようとします。もしもあなたが職場のイントラネット上にあるPCを使っていて会社のProxyサーバを経由してインターネットにアクセスする必要があるならば、Katalon StudioにProxyの設定をする必要があります。Proxyの設定ができていなくてライセンスの認証が失敗するとKatalon Studioを使い始めることすらできません。下記の公式ドキュメントの説明を参考にしてください。

- [Proxy preferences](https://docs.katalon.com/katalon-studio/docs/katalon-studio-preferences.html#proxy-preferences)