Important: Please read the Qt Code of Conduct -

Webelement click does not work

  • Hello,

    I have a HTML page (HTML/CSS/Javascript) with :

    [ HTML ]
    <li id="tool_open" >Open</li>

    [ Javascript ]

    It works !

    I try to do the same in Qt (WebEngine) :
    [ Qt ]
    QWebEngineView * view = new QWebEngineView;
    QWebPage * page;
    QWebView *view2;
    QWebFrame * frame;
    QWebElement document;
    QWebElementCollection elements;
    [ ... ]
    document = frame->documentElement();
    elements = document.findAll("li");

    foreach (QWebElement element, elements){
          if (element.attribute("id") == "tool_open")
           // test 1 : KO
           // test 2 : KO                    

    I can have all Webelements I want (have their name, attributes, etc.) but I can not interact with them, for example the click() function for my Webelement ("<li id="tool_open" >Open</li>") does not work whereas in Javascript it works...

    Any idea ?

  • Moderators

    Hi @fgdevel,
    Some confusion here. Why are you using QWebEngineView and QWebView ? They both are different. The former uses Qt WebEngine while latter uses Qt Webkit. And Qt WebEngine lacks some API's. QWebElement is one of them.
    Can you reframe your example considering only QWebView as it only provides QWebElement ?

  • Yes, but it does not work too.

    [ Qt ]
    webView = new QWebView;
    QVBoxLayout *layout = new QVBoxLayout;
    [ ... ]
    QWebElement el = webView->page()->mainFrame()->findFirstElement("#tool_open");

    the click() action doesn't work

    With an another Qt code, I can call a Javascript function, but all actions (click, mouse events...) don't work :
    [ Javascript ]
    function test()

    I have Js pop-up "clic" but the click() action on the webelement 'tool_source' doesn't work...

  • Moderators

    QWebElement el = webView->page()->mainFrame()->findFirstElement("#tool_open");

    Does this return the exact element that you wanted ?
    You can just do

    qDebug() << el.toPlainText(); //prints the button text

    If this works then evaluateJavaScript should work too.

  • yes, already tried qDebug() << el.toPlainText();
    and it works...

  • oh no it doesn't work !

  • [ Qt ]
    QWebElement el = webView->page()->mainFrame()->findFirstElement("#tool_open");
    qDebug() << "WebElement : " + el.attribute("type");

    it works, el.plainText does not work for this kind of webelement


    it does not work

  • Moderators


    el.plainText does not work for this kind of webelement

    It works too. It will print the list's text.
    Also for list click() works.
    What are you trying to do on click ? Can you post you HTML code which doesnot work ?

  • I try to simulate a webelement click thanks Qt.

    In a web navigator the 'tool_open' click() opens an another web page (with javascript code...). I would like to do the same (simulate mouse clic) with Qt.

    [ HTML ]
    [ ... ]
    <li id="tool_clear">
    Nouvelle Configuration
    <li id="tool_open" >
    <div id="fileinputs">
    Open Image
    [ ... ]

  • and yes the el.plainText works (I tried with an <input> HTML element instead of <li>...)

  • Moderators

    @fgdevel I dont see any code which gets invoked on click of tool_open. For eg . the following works i.e alert is called

    function click(){
    <li id="list" onclick="click()">Clickable list</li>

    and from Qt

    QWebElement b = ui->webView->page()->mainFrame()->findFirstElement("#list");

  • the action is realized by this function :
    [ JS ]
    var clickOpen = function() { [ ... ] }

    but I don't know how to call this function in HTML, just clickOpen() doesn't work, even if I include the JS file in the HTML (<script src="myfile.js"></script>)

  • Moderators

    @fgdevel Well then you need to first figure out how to call that function on click of li element in HTML.

  • evaluateJavaScript is your friend

    Exemple of code working with Jquery, replace with javascript code

                    QString jsToExecute += "$('#login-btn').click(); ";
                    ui->webView_login->page()->mainFrame()->documentElement().evaluateJavaScript(jsToExecute + "; null" );

Log in to reply