Как исправить ошибку 403 при использовании HttpURLConnection в Selenium, поскольку ссылки открываются вручную без каких-либо проблем - PullRequest
0 голосов
/ 19 июня 2019

Я проверял активные ссылки на веб-сайте с помощью веб-драйвера Selen и Java.Я передал ссылки на массив, и при проверке я получаю ответ, поскольку 403 запрещено для всех ссылок на сайте.Это просто общедоступный веб-сайт, доступ к которому может получить каждый.Ссылки работают правильно при нажатии вручную.Я хотел знать, почему он не показывает 200 и что можно сделать в этой ситуации.

Это для веб-драйвера Selenium с 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);}

Я ожидаю, что код ответа равен 200, нофактический выход составляет 403

Ответы [ 2 ]

1 голос
/ 19 июня 2019

Я считаю, что вам нужно добавить соответствующие Cookies в HTTPUrlConnection или, что еще лучше, перейти на библиотеку OkHttp , которая находится под капотом Selenium Java Client

Таким образом, вам, в основном, нужно извлечь файлы cookie из браузера с помощью функции driver.manage.getCookies () и сгенерировать правильный заголовок запроса 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);
}

Если вам ничего не нужно, кроме кода ответа, вы можете использовать метод HEAD , чтобы избежать выполнения вызовов для полных URL-адресов - это позволит вам сэкономить трафик, и ваш тест будет намного быстрее.

0 голосов
/ 19 июня 2019

403 Запрещено

HTTP 403 Forbidden код ответа о состоянии ошибки клиента указывает, что сервер понял запрос, но отказывается его авторизовать.

Этот статус аналогичен 401, но в этом случае повторная проверка подлинности не будет иметь значения. Доступ навсегда запрещен и связан с логикой приложения, такой как недостаточные права на ресурс.


Причина

Я не вижу такой проблемы в вашем блоке кода. Однако существует вероятность того, что WebDriver контролируемый Клиент браузера обнаруживается, и, следовательно, последующие запросы блокируются , и могут быть следующие факторы:

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

Вы можете найти пару подробных обсуждений в:


Решение

Универсальным решением будет использование прокси или вращающихся прокси из Free Proxy List .

Подробное обсуждение можно найти в Смена прокси в chromedriver для очистки


Outro

Вы можете провести пару соответствующих обсуждений в:

...