壊れたリンクを見つける方法 Selenium

リンク切れとは?

壊れたリンクとは、到達できないリンクまたは URL です。 何らかのサーバーエラーが原因でダウンしているか機能していない可能性があります

URL のステータスは常に有効な 2xx になります。 異なる目的を持つさまざまな HTTP ステータス コードがあります。 無効なリクエストの場合、HTTP ステータスは 4xx および 5xx です。

4xx クラスのステータス コードは主にクライアント側のエラー、5xx クラスのステータス コードは主にサーバーの応答エラーです。

おそらく、リンクをクリックして確認するまで、そのリンクが機能しているかどうかを確認することはできません。

リンク切れをチェックする必要があるのはなぜですか?

ユーザーがエラー ページにアクセスしてはいけないため、サイト上に壊れたリンクがないことを常に確認する必要があります。

このエラーは、ルールが正しく更新されていないか、要求されたリソースがサーバーに存在しない場合に発生します。

各 Web ページには多数のリンクが含まれている可能性があり、すべてのページで手動プロセスを繰り返す必要があるため、リンクを手動でチェックするのは面倒な作業です。

を使用した自動化スクリプト Selenium プロセスを自動化する方が、より適切な解決策です。

リンク切れや画像を確認する方法 Selenium

壊れたリンクを確認するには、次の手順を実行する必要があります。

  1. タグに基づいて Web ページ内のすべてのリンクを収集します。
  2. リンクの HTTP リクエストを送信し、HTTP 応答コードを読み取ります。
  3. HTTP 応答コードに基づいて、リンクが有効か壊れているかを調べます。
  4. キャプチャされたすべてのリンクに対してこれを繰り返します。

Web ページ上の壊れたリンクを見つけるコード

以下は、ユースケースをテストする Web ドライバー コードです。

package automationPractice;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;
import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class BrokenLinks {
    
    private static WebDriver driver = null;

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        String homePage = "http://www.zlti.com";
        String url = "";
        HttpURLConnection huc = null;
        int respCode = 200;
        
        driver = new ChromeDriver();
        
        driver.manage().window().maximize();
        
        driver.get(homePage);
        
        List<WebElement> links = driver.findElements(By.tagName("a"));
        
        Iterator<WebElement> it = links.iterator();
        
        while(it.hasNext()){
            
            url = it.next().getAttribute("href");
            
            System.out.println(url);
        
            if(url == null || url.isEmpty()){
System.out.println("URL is either not configured for anchor tag or it is empty");
                continue;
            }
            
            if(!url.startsWith(homePage)){
                System.out.println("URL belongs to another domain, skipping it.");
                continue;
            }
            
            try {
                huc = (HttpURLConnection)(new URL(url).openConnection());
                
                huc.setRequestMethod("HEAD");
                
                huc.connect();
                
                respCode = huc.getResponseCode();
                
                if(respCode >= 400){
                    System.out.println(url+" is a broken link");
                }
                else{
                    System.out.println(url+" is a valid link");
                }
                    
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        driver.quit();

    }
}

リンク切れのコードの説明

ステップ 1: パッケージをインポートする

デフォルトのパッケージに加えて、以下のパッケージをインポートします。

import java.net.HttpURLConnection;

このパッケージのメソッドを使用すると、HTTP リクエストを送信し、その応答から HTTP 応答コードをキャプチャできます。

ステップ 2: Web ページ内のすべてのリンクを収集する

Web ページ内のすべてのリンクを識別し、リストに保存します。

List<WebElement> links = driver.findElements(By.tagName("a"));

リストを横断するための Iterator を取得します。

Iterator<WebElement> it = links.iterator();

ステップ 3: URL の識別と検証

このパートでは、URL がサードパーティのドメインに属しているかどうか、または URL が空/null であるかどうかを確認します。

アンカータグのhrefを取得し、url変数に格納します。

url = it.next().getAttribute("href");

URL が null または空かどうかを確認し、条件が満たされている場合は残りの手順をスキップします。

if(url == null || url.isEmpty()){
              System.out.println("URL is either not configured for anchor tag or it is empty");
              continue;
     }

URL がメイン ドメインまたはサードパーティに属しているかどうかを確認します。 サードパーティのドメインに属している場合は、残りの手順をスキップしてください。

 if(!url.startsWith(homePage)){
           System.out.println("URL belongs to another domain, skipping it.");
           continue;
   }

ステップ 4: http リクエストを送信する

HttpURLConnection クラスには、HTTP リクエストを送信し、HTTP 応答コードをキャプチャするメソッドがあります。 したがって、openConnection() メソッド (URLConnection) の出力は HttpURLConnection に型キャストされます。

huc = (HttpURLConnection)(new URL(url).openConnection());

リクエストタイプを「GET」の代わりに「HEAD」に設定できます。 そのため、ヘッダーのみが返され、ドキュメントの本文は返されません。

huc.setRequestMethod("HEAD");

connect() メソッドを呼び出すと、URL への実際の接続が確立され、リクエストが送信されます。

huc.connect();

ステップ 5: リンクの検証

getResponseCode() メソッドを使用すると、リクエストの応答コードを取得できます。

respCode = huc.getResponseCode();

応答コードに基づいて、リンクのステータスを確認しようとします。

if(respCode >= 400){
        System.out.println(url+" is a broken link");
}
else{
        System.out.println(url+" is a valid link");
}

したがって、Web ページからすべてのリンクを取得し、リンクが有効か壊れているかを出力できます。

このチュートリアルが、Selenium を使用して壊れたリンクをチェックする際に役立つことを願っています。

Web ページのすべてのリンクを取得する方法

Webでの一般的な手順のXNUMXつ テスト ページ内に存在するすべてのリンクが機能しているかどうかをテストすることです。 これは、次の組み合わせを使用すると便利です。 Java for-each ループ, findElements() & By.tagName(“a”) 方法。

findElements() メソッドは、タグ a を持つ Web 要素のリストを返します。 for-each ループを使用して、各要素にアクセスします。

Web ページのすべてのリンクを取得する

以下のWebDriverコードは、 Mercury ツアーのホームページで、現在稼働中のものとまだ建設中のものを確認します。

import org.openqa.selenium.By;		
import org.openqa.selenium.WebDriver;		
import org.openqa.selenium.chrome.ChromeDriver;		
import java.util.List;		
import java.util.concurrent.TimeUnit;		
import org.openqa.selenium.*;		

public class P1 {				
    		
    public static void main(String[] args) {									
        String baseUrl = "https://demo.guru99.com/test/newtours/";					
        System.setProperty("webdriver.chrome.driver","G:\\chromedriver.exe");					
        WebDriver driver = new ChromeDriver();					
        		
        String underConsTitle = "Under Construction: Mercury Tours";					
			driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);					

			driver.get(baseUrl);					
        List<WebElement> linkElements = driver.findElements(By.tagName("a"));							
        String[] linkTexts = new String[linkElements.size()];							
			int					i = 0;					

			//extract the link texts of each link element		
			for (WebElement e : linkElements) {							
			linkTexts[i] = e.getText();							
			i++;			
        }		

			//test each link		
			for (String t : linkTexts) {							
			driver.findElement(By.linkText(t)).click();					
			if (driver.getTitle().equals(underConsTitle)) {							
                System.out.println("\"" + t + "\""								
                        + " is under construction.");			
            } else {			
                System.out.println("\"" + t + "\""								
                        + " is working.");			
            }		
			driver.navigate().back();			
        }		
			driver.quit();			
    }		
}

出力は以下のようになります。

  • 画像リンクへのアクセスは、By.cssSelector() メソッドと By.xpath() メソッドを使用して行われます。

Web ページのすべてのリンクを取得する

トラブルシューティング

個別のケースでは、コードによってアクセスされる最初のリンクが「ホーム」リンクである可能性があります。 このような場合、driver.navigate.back() アクションは、最初のアクションがブラウザーを開いているため、空白のページを表示します。 ドライバーは、空のブラウザーでは他のすべてのリンクを見つけることができません。 そのため、IDE は例外をスローし、残りのコードは実行されません。 これは、If ループを使用して簡単に処理できます。