Подтвердить что ты не робот

Как получить подробное сообщение об ошибке, когда QTWebKit не загружает страницу?

QtWebKit вызывает QWebPage::loadFinished ( false ), когда веб-страница не загружается, но не дает понять, почему она не удалась.

Как получить подробное сообщение об ошибке, например, код ответа HTTP или другое сообщение?

4b9b3361

Ответ 1

Оказывается, есть несколько способов получить более подробную информацию о сбоях:

  • Внедрите обратные вызовы onResourceRequested и onResourceReceived на странице:

    page.onResourceRequested = function (resource) {
        log('resource requested: ' + resource.url);
    }
    
    page.onResourceReceived = function (resource) {
        log('resource received: ' + resource.status + ' ' + resource.statusText + ' ' +
            resource.contentType + ' ' + resource.url);
    }
    
  • Если вы ищете еще больше деталей, вам необходимо исправить внутренние функции PhantomJS. Обновите свой объект CustomPage (в WebPage.cpp), чтобы реализовать QTWebKit ErrorExtension. Вот код, который вы можете добавить, который делает это:

    protected: 
      bool supportsExtension(Extension extension) const {
        if (extension == QWebPage::ErrorPageExtension)
        {
            return true;
        }
        return false;
    }
    
    bool extension(Extension extension, const ExtensionOption *option = 0, ExtensionReturn *output = 0)
    {
        if (extension != QWebPage::ErrorPageExtension)
            return false;
    
        ErrorPageExtensionOption *errorOption = (ErrorPageExtensionOption*) option;
        std::cerr << "Error loading " << qPrintable(errorOption->url.toString())  << std::endl;
        if(errorOption->domain == QWebPage::QtNetwork)
            std::cerr << "Network error (" << errorOption->error << "): ";
        else if(errorOption->domain == QWebPage::Http)
            std::cerr << "HTTP error (" << errorOption->error << "): ";
        else if(errorOption->domain == QWebPage::WebKit)
            std::cerr << "WebKit error (" << errorOption->error << "): ";
    
        std::cerr << qPrintable(errorOption->errorString) << std::endl;
    
        return false;
    }
    

Это даст вам большую часть информации об ошибках, но вы все равно можете получать события onLoadFinished(success=false), не получая больше деталей. Из моих исследований основная причина этого - отмененные запросы нагрузки. QTWebKit отправляет уведомление об отказе для отмены, но не сообщает никаких подробностей.