QWebView check on valid load
-
Hello all, I have a trouble. In my app I use proxy, sometimes works completion signal to the load, but the page isn't fully loaded. How i can check it? Try to find "</html>"?
-
Hi bagipro:
if you have a Qwebview widget in your .ui, you can do it, or similar:
@ if(ui->qwebview->findText("</html>"))
.........
else
..............
}@good luck.
-
Hehe, i do it firstly)
QWebView automatically closes tags, but i did view.page()->mainFrame()->toHtml().contains("</html>"); -
ok, good input :p
-
Question is not solved ;p
-
I have this code in my project and it works fine. It isn't exactly the same case, but....
@ connect(ui->webLogoLaboratorio,SIGNAL(loadFinished(bool)),this, SLOT(cargaFinalizadaLogo(bool))); QUrl uUrl; QString cUrl = "http://xxxxxx.com/documentos/image/fotos/medicamento/"+e.text().trimmed()+"_1.jpg"; uUrl.setUrl(cUrl); ui->webLogoLaboratorio->load(uUrl);
void FrmInformacionFarmaco::cargaFinalizadaLogo(bool estado)
{if(ui->webLogoLaboratorio->findText("Not Found")) ui->webLogoLaboratorio->setVisible(false); else ui->webLogoLaboratorio->setVisible(true);
}@
this waits for completly loaded webpage. And when is completly loaded it run CargaFinalizadaLogo metod, and test if xxxx text is in qWebview. In my case if image is not in server, it return 404- not found, If this text is present I hide control, otherwise it shows image
I think is similar at your problem. good luck
-
Yes, but i have same code.
For example, full page:
@<html>
<title>Hello world<title>
<meta>some data</meta>
[removed]script[removed]
<table>
<tr>
<td>one</td>
<td>two</td>
<td>three</td>
</tr>
</table>
</html>@But sometimes i get (all times differently)
@<html>
<title>Hello world<title>
<meta>some data</meta>
[removed]script[removed]
</html>@ -
And if you open url in web browser like firefox it works fine all times?
Make sure your php or asp code for ensure problem is not in your server code.
Your example gives impresion that for some reason your server not have data to return.
-
Oh no, in browser all works correctly, it is not server's problem
-
Maybe, if you copy here your code, we will can find where is the problem
-
Hi,
You can check whether all data was loaded using @void QNetworkReply::downloadProgress ( qint64 bytesReceived, qint64 bytesTotal ) [signal]@ signal.
Hope it helps.
-
ArcNexus, I haven't server code, but i sure that is application bug.
This is app code
@QObject::connect(&view,SIGNAL(loadFinished(bool)),&loopLoad,SLOT(quit()));
QObject::connect(&timer,SIGNAL(timeout()),&loopLoad,SLOT(quit()));@@view.load(QUrl("https://www.site.com/"));
timer.start(SOCKS_TM);
loopLoad.exec();
if(!timer.isActive())
{
timer.stop();
view.stop();
}@MaximAlien, thanks, i will check
-
Can you comment timer lines? and test again, maybe the timer cause an exit before the html code has completly downloaded from server?. I think it is a possible cause.
-
No
@if(!timer.isActive())
{
timer.stop();
view.stop();
}@
It is check on timeout, if request takes longer than SOCKS_TM ms, then i do abort of an operation (i pasted not full code) -
I see you've connected view's loadFinished signal...
well you better connect view.page()->mainFrame() loadFinished
because if a view which is a webpage contains more frames/iframes you could possible receive loadFinished from each one of the frames
I guess you catch only the first loadFinished.There is no way to know when page finished loading...
the best approach perhaps is to wait for let's say 3-5 seconds without data transfer and its not 100% correct. loadFinished actually tells us that HTML i.e. the code of that page (frame) just loaded nothing more. After the HTML source code of the page loaded then browser (or QWebView in our case) starts interpreting and running that code so... in a few (milli)seconds without transfer some JavaScript could start loading something, or some json or whatever so if a page has javascript that constantly loading/refreshing data (e.g. stock exchange data) you will receive loadFinished only once (per i/frame) yet JavaScript or json could constantly refresh it in the background - so when should we consider such a page fully loaded?! -
ThatDude, likely! But i edited the code, but nothing has changed :( Often the page doesn't load until the end.
@QWebFrame* frame = view.page()->mainFrame();@
@QObject::connect(frame,SIGNAL(urlChanged(QUrl)),&loopUrlChanged,SLOT(quit()));
QObject::connect(frame,SIGNAL(loadFinished(bool)),&loopLoad,SLOT(quit()));
QObject::connect(&timer,SIGNAL(timeout()),&loopUrlChanged,SLOT(quit()));
QObject::connect(&timer,SIGNAL(timeout()),&loopLoad,SLOT(quit()));@ -
I'm sure that signal it is general trouble, something work wrong .
For example, @SIGNAL(loadFinished(bool))@ triggered, but url is NOT CHANGEDI use evaluateJavaScript method
@frame->evaluateJavaScript(QString("document.getElementById("login_email").value = "%1"").arg(email));
frame->evaluateJavaScript(QString("document.getElementById("login_password").value = "%1"").arg(pass));
frame->evaluateJavaScript("document.login_form.submit()");@And after
@timer.start(SOCKS_TM);
loopUrlChanged.exec();//отправка формы
if(!timer.isActive())
{
timer.stop();
view.stop();
break;
}timer.start(SOCKS_TM); loopLoad.exec(); if(!timer.isActive()) { timer.stop(); view.stop(); break; }@
By the end, the page is the same
What i doing wrong?
-
It will be eaiser to debug if you use QWebElement instead
@ void Form::submitInfo()
{
QWebFrame *frame = ui->webView->page()->mainFrame();QWebElement firstName = frame->findFirstElement("#firstname"); firstName.setAttribute("value","some text"); }
@
OR
@ QWebFrame *frame = ui->webView->page()->mainFrame();QWebElement firstName = frame->findFirstElement("#firstname"); firstName.evaluateJavaScript("this.value='some text' ").
@
You could even do this
@elem.setFocus()
elem.evaluateJavaScript("this.click()")
@ -
Yes, but trouble is not in evaluateJavaScript. I would like to say that it sometimes does not work, not all time. And the main problem in the wrong load. It does not load to the end
-
Well,
perhaps you should wait a bit longer... if you use QWebElement you could wait until that element shows on page.Are you sure that data really hits your browser - you could use some tools to check that - Fiddler (web debugging proxy) or Wireshark (network protocol analyzer)