Important: Please read the Qt Code of Conduct -

How to access dynamic HTML/DOM elements after executing javascript with QWebView

  • Hi

    I use Qt 5.3.2 on Windows platform. I modify the fancybrowser example in Qt5.3.2\Examples\Qt-5.3\webkitwidgets to open a web. The web is correct ok. I process the signal loadfinished() like this.

    //this line is in a .h file
    QWebView* m_pWebView;

    //this line is in a .cpp file
    m_pWebView = new QWebView(this);
    connect(m_pWebView, SIGNAL(loadFinished(bool)), SLOT(finishLoading(bool)));

    while the web opened, the finishLoading(bool) will be called.
    I use below code to manipulate the web elements.
    QWebFrame *pWebFrame =m_pWebView->page()->mainFrame();
    QWebElement singleFly = pWebFrame->findFirstElement("#returnF");

    QWebElement fromCity = pWebFrame->findFirstElement("#OriCity");
    QWebElement fromCityCode = pWebFrame->findFirstElement("#OriCode");

    There are some div is dynamic load and update with ajax in that opened page. I can't get the web element in this div in the finishLoading(bool) function. I even use a timer to reload current page and to get,but I still can't get the element in the dynamic load div .

    Anyone have an idea to access dynamic HTML/DOM elements after executing javascript(ajax)

    I'd appreciate any help someone can give.

  • Try create an Object like this:
    @class customJS : public QObject

    Q_INVOKABLE void customMethod();//called in evaluate

    void customSignal();//perfom always call customMethod

    #include "customjs.h"

    void customJS::customMethod () {
    emit customSignal();

    Add object in WebPage/WebFrame:
    @#include "customjs.h"

    JSext = new customJS();//JSext is declared in Main class (eg.: class MainWindow : QMainWindow ...)

    //Added to slot:
    QObject::connect( JSext, SIGNAL(customSignal()), this, SLOT(mySlot()) );

    applyJsToWebView(); //Apply your JS

    QObject::connect(MY_WEB_PAGE->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(applyJsToWebView())); //Apply if cleared js object

    void MainWindow::applyJsToWebView() {
    //customJScallback is the method name in "window object" (javascript object)
    MY_WEB_PAGE->mainFrame()->addToJavaScriptWindowObject(QString("customJScallback"), JSext);

    void MainWindow::mySlot() {
    qDebug() << "Slot called";


    @fromCityCode.evaluateJavaScript(“this.value=‘C’; window.customJScallback();”);@

    Whenever you call the "window.customJScallback", the "customJS::customSignal" signal will be emitted.

Log in to reply