Je vérifiais les liens actifs dans un site Web avec un pilote Web sélénium et java. J'ai transmis les liens vers le tableau et tout en vérifiant, je reçois la réponse 403 interdite pour tous les liens du site. Il s'agit simplement d'un site Web public accessible à tous. Les liens fonctionnent correctement lorsque vous cliquez manuellement. Je voulais savoir pourquoi il ne montre pas 200 et ce qui peut être fait dans cette situation.
Ceci est pour Selenium webdriver avec Java
for(int j=0;j< activelinks.size();j++) { System.out.println("Active Link address and status >>> " + activelinks.get(j).getAttribute("href")); HttpURLConnection connection = (HttpURLConnection)new URL(activelinks.get(j).getAttribute("href")).openConnection(); connection.connect(); String response = connection.getResponseMessage(); int responsecode = connection.getResponseCode(); connection.disconnect(); System.out.println(activelinks.get(j).getAttribute("href")+ ">>"+ response+ " " + responsecode);}
J'attends le code de réponse comme 200, mais la sortie réelle est de 403
3 Réponses :
Je pense que vous devez ajouter les cookies à HTTPUrlConnection, ou mieux encore, envisagez de passer à la bibliothèque OkHttp qui se trouve sous le capot de Selenium Java Client
Vous devez donc récupérer les cookies du navigateur en utilisant driver.manage.getCookies () et générer une En-tête de demande de cookie pour les appels suivants.
Exemple de code:
driver.manage().getCookies() .forEach(cookie -> cookieBuilder .append(cookie.getName()) .append("=") .append(cookie.getValue()) .append(";")); OkHttpClient client = new OkHttpClient().newBuilder().build(); for (WebElement activelink : activelinks) { Request request = new Request.Builder() .url(activelink.getAttribute("href")) .addHeader("Cookie", cookieBuilder.toString()) .build(); Response urlResponse = client.newCall(request).execute(); String response = urlResponse.message(); int responsecode = urlResponse.code(); System.out.println(activelink.getAttribute("href") + ">>" + response + " " + responsecode); }
Si vous n'avez besoin de rien d'autre que du code de réponse, vous pouvez envisager d'utiliser HEAD pour éviter d'exécuter des appels pour les URL complètes - cela vous permettra d'économiser du trafic et votre test sera Plus vite.
Le 403 interdit < / code>
Le code de réponse sur l'état d'erreur du client indique que le serveur a compris la demande mais refuse de l'autoriser.
Cet état est similaire à 401
, mais dans ce cas, la ré-authentification ne fera aucune différence. L'accès est définitivement interdit et lié à la logique de l'application, comme des droits insuffisants sur une ressource.
Je ne vois aucun problème de ce type dans votre bloc de code. Cependant, il est possible que le client de navigateur contrôlé par WebDriver contrôlé soit détecté et que les demandes suivantes soient ainsi bloquées et il peut y avoir de nombreux facteurs. comme suit:
Agent utilisateur
Plugins
Langues
WebGL
Fonctionnalités du navigateur
Image manquante
Vous pouvez trouver quelques discussions détaillées dans:
Une solution générique sera d'utiliser un proxy ou des proxies rotatifs à partir du Liste de proxy gratuite .
Vous pouvez trouver une discussion détaillée dans Changer de proxy dans chromedriver à des fins de grattage
Vous pouvez faire quelques discussions pertinentes dans:
Existe-t-il une solution pour gérer cette situation
Mise à jour de la réponse. Faites-moi savoir si vous avez des questions.
A eu le même problème, agent utilisateur était le problème dans mon cas (en savoir plus ici: https://www.javacodegeeks.com/2018/05/how-to-handle-http-403-forbidden- error-in-java.html ).
Vérifiez également les méthodes de demande autorisées sur votre site Web, vous pouvez le faire en regardant n'importe quel point de terminaison dans l'onglet "Réseau" de Chrome. Il devrait lister les méthodes de requête autorisées, dans mon cas, je n'ai pas pu utiliser "HEAD", mais "GET" a fait l'affaire.
Code:
List<WebElement> links = driver.findElements(By.tagName("a")); boolean brokenLink = false; for (WebElement link : links) { String url = link.getAttribute("href"); HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); conn.setRequestMethod("GET"); conn.setRequestProperty("Content-Type", "application/json"); conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"); conn.connect(); int httpCode = conn.getResponseCode(); if (httpCode >= 400) { System.out.println("BROKEN LINK: " + url + " " + httpCode); brokenLink = true; Assert.assertFalse(brokenLink); } else { System.out.println("Working link: " + url + " " + httpCode); } }
Cela peut aider github.com/mwinteringham/selenium-to-restassured