【问题标题】:How to fix 403 response when using HttpURLConnection in Selenium since the links are opening manually without any issue在 Selenium 中使用 HttpURLConnection 时如何修复 403 响应,因为链接是手动打开的,没有任何问题
【发布时间】:2019-06-19 13:26:10
【问题描述】:

我正在使用 selenium web 驱动程序和 java 检查网站中的活动链接。我已将链接传递给数组,并在验证时收到响应为 403 禁止站点中的所有链接。它只是一个任何人都可以访问的公共网站。手动单击时链接工作正常。我想知道为什么它没有显示 200 以及在这种情况下可以做些什么。

这是用于 Java 的 Selenium webdriver

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);}

我希望响应代码为 200,但实际输出为 403

【问题讨论】:

标签: selenium selenium-webdriver httpresponse httpconnection


【解决方案1】:

403 禁止

HTTP403 Forbidden客户端错误状态响应码表示服务器理解请求但拒绝授权。

此状态类似于401,但在这种情况下,重新认证不会有任何区别。该访问被永久禁止并与应用程序逻辑相关联,例如对资源的权限不足。


原因

我在您的代码块中没有看到任何此类问题。但是,有可能检测到 WebDriver 控制的 Browser Client 并因此后续请求被阻止,并且可能有很多因素如下:

  • User agent
  • Plugins
  • Languages
  • WebGL
  • Browser features
  • Missing image

您可以在以下位置找到一些详细的讨论:


解决方案

一般的解决方案是使用来自Free Proxy List代理轮换代理

您可以在Change proxy in chromedriver for scraping purposes找到详细讨论


结尾

您可以在以下位置进行一些相关讨论:

【讨论】:

  • 有没有办法处理这种情况
  • 更新了答案。如果您有任何疑问,请告诉我。
【解决方案2】:

我相信您需要将相关的Cookies 添加到 HTTPUrlConnection,或者更好地考虑切换到 OkHttp 库,它位于 Selenium Java Client 的底层

因此,您基本上需要使用driver.manage.getCookies() function 从浏览器中获取cookie,并为后续调用生成正确的Cookie request header

示例代码:

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);
}

如果您只需要响应代码,您可以考虑使用HEAD 方法来避免执行对完整 URL 的调用 - 这将允许您节省流量并且您的测试会更快。

【讨论】:

    【解决方案3】:

    遇到同样的问题,用户代理是我的问题(在此处阅读更多信息:https://www.javacodegeeks.com/2018/05/how-to-handle-http-403-forbidden-error-in-java.html)。

    还要检查您的网站上允许哪些请求方法,您可以通过查看 Chrome 中“网络”选项卡中的任何端点来做到这一点。它应该列出允许的请求方法,在我的情况下,我不能使用“HEAD”,但是“GET”可以解决问题。

    代码:

    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);
    
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      • 2014-04-24
      相关资源
      最近更新 更多