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

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

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


person Blake Scholl    schedule 02.09.2011    source источник
comment
Также см. [Как проверить код состояния HTTP][1] [1]: stackoverflow.com/questions/4330274/   -  person Kurt Pattyn    schedule 05.11.2011


Ответы (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), чтобы реализовать ErrorExtension QTWebKit. Вот код, который вы можете добавить, который делает это:

    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 отправляет уведомление об отмене, но не сообщает никаких подробностей.

person Blake Scholl    schedule 09.09.2011