Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Selenium中使用HttpURLConnection时如何修复403响应,因为链接是手动打开的,没有任何问题_Selenium_Selenium Webdriver_Httpresponse_Httpconnection - Fatal编程技术网

在Selenium中使用HttpURLConnection时如何修复403响应,因为链接是手动打开的,没有任何问题

在Selenium中使用HttpURLConnection时如何修复403响应,因为链接是手动打开的,没有任何问题,selenium,selenium-webdriver,httpresponse,httpconnection,Selenium,Selenium Webdriver,Httpresponse,Httpconnection,我正在用SeleniumWeb驱动程序和java检查网站中的活动链接。我已将链接传递到阵列,在验证时,我得到的响应为403禁止站点中的所有链接。这只是一个任何人都可以访问的公共网站。手动单击时,链接工作正常。我想知道为什么它没有显示200以及在这种情况下可以做些什么 这是针对使用Java的SeleniumWebDriver的 for(int j=0;j< activelinks.size();j++) { System.out.println("Active Link ad

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

这是针对使用Java的SeleniumWebDriver的

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);}
for(int j=0;j>>”+活动链接.get(j).getAttribute(“href”);
HttpURLConnection connection=(HttpURLConnection)新URL(activelinks.get(j).getAttribute(“href”)).openConnection();
connection.connect();
字符串响应=connection.getResponseMessage();
int responsecode=connection.getResponseCode();
连接断开();
System.out.println(activelinks.get(j).getAttribute(“href”)+“>>”+response+“”+responsecode);}

我希望响应代码为200,但实际输出为403</p>< p>我相信您需要添加相关的HTTPURLION,或者更好地考虑切换到

引擎盖下的库。 因此,您基本上需要使用从浏览器获取cookie,并为后续调用生成适当的cookie

示例代码:

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

如果您只需要响应代码,您可以考虑使用方法避免执行对完整URL的调用——这将允许您节省流量,并且测试将更快得多。p> 403禁止 HTTP客户端错误状态响应代码表示服务器理解该请求,但拒绝对其进行授权

此状态类似于,但在本例中,重新身份验证不会产生任何影响。访问被永久禁止,并与应用程序逻辑相关联,例如对资源的权限不足


理由 我在您的代码块中没有看到任何这样的问题。但是,有可能检测到WebDriver控制的浏览器客户端,因此后续请求被阻止,并且可能存在以下多种因素:

  • 用户代理
  • 插件
  • 语言
  • WebGL
  • 浏览器功能
  • 缺少图像
您可以在以下内容中找到一些详细的讨论:


解决方案 一般的解决方案是使用代理旋转代理

您可以在中找到详细的讨论


奥特罗 您可以在以下网站上进行一些相关讨论:


    • 也有同样的问题,用户代理是我的问题(请在此处阅读更多信息:)

      此外,还可以检查您的网站上允许哪些请求方法,您可以通过查看Chrome中“网络”选项卡中的任何端点来实现这一点。它应该列出允许的请求方法,在我的例子中,我不能使用“HEAD”,但使用了“GET”

      代码:

      List links=driver.findElements(按.tagName(“a”));
      布尔brokenLink=false;
      用于(WebElement链接:链接){
      字符串url=link.getAttribute(“href”);
      HttpURLConnection conn=(HttpURLConnection)新URL(URL).openConnection();
      conn.setRequestMethod(“GET”);
      conn.setRequestProperty(“内容类型”、“应用程序/json”);
      conn.setRequestProperty(“用户代理”,
      “Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/65.0.3325.181 Safari/537.36”);
      连接();
      int httpCode=conn.getResponseCode();
      如果(httpCode>=400){
      System.out.println(“断开的链接:+url+”+httpCode);
      brokenLink=true;
      Assert.assertFalse(brokenLink);
      }
      否则{
      System.out.println(“工作链接:+url+”+httpCode);
      }
      }
      
      是否有解决此问题的方法更新了答案。如果您有任何疑问,请告诉我。这可能会有所帮助
      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);
      
              }
      
          }