Russian Qt Forum
Ноябрь 24, 2024, 01:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QWebView и JavaScript  (Прочитано 19393 раз)
Bepec
Гость
« : Сентябрь 27, 2011, 15:31 »

Приветствую всех. Решил изучить JavaScript, в частности для заполнения многочисленных форм на многочисленных сайтах. Конечно же необходима авторизация.
Использую QWebView.

Попробовал сам - вроде получается, но есть 1 закавыка - никак не могу понять, как вызвать нажатие кнопки. Пробовал 3 варианта:

1) Вычислять координаты элемента и отправлять нажатие в форму.
2) Пытался вызвать скрипт, который уже есть на странице, который собственно проверяет и отправляет данные(пока безуспешно).
3) Пытался внедрить свой скрипт, который в свою очередь вызовет событие нажатия кнопки.
4) Нажать кнопку скриптом.
 
1 вариант не нравится - не элегантно, но работает.

Прошу помощи поправить - что у меня не так:

Основной код tst.cpp
Код:
/* 	tst.h
* QWebElement email;
* QWebElement pass;
* QWebElement button;
*/

tstt::tstt(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
ui.webView->load(QUrl("http://skyunicorn.ucoz.ru/index/0-2"));
ui.webView->settings()->setAttribute(QWebSettings::JavascriptEnabled,true);
}

tstt::~tstt()
{

}

// заполнение полей авторизации
void tstt::on_pushButton_clicked()
{
ui.webView->page()->setContentEditable(true);

email = ui.webView->page()->mainFrame()->findFirstElement("input[name=user]");
pass = ui.webView->page()->mainFrame()->findFirstElement("input[name=password]");

email.setAttribute("value","atatata");
pass.setAttribute("value","321345");
}

// ни 1 способ не дает результата =(

void tstt::on_pushButton_2_clicked()
{
// тут находятся нижеследующие ф-ции
}

Код:
	// пытаюсь нажать кнопку
button = ui.webView->page()->mainFrame()->findFirstElement("input[type=submit]");
button.evaluateJavaScript("submit()");  


Код:
	// пытаюсь вызвать функцию которую посылает форма (функция уже есть в странице)
ui.webView->page()->mainFrame()->evaluateJavaScript("sendFrm549707();return false;");


Код:
	// попытка вставить свой собственный скрипт ( автоматическая отправка формы через 5 секунд)
QString cod = ("<script type=\"text/javascript\">\
setTimeout(function(){document.getElementById('frmLg549707').submit()},5000)\
</script>");
ui.webView->page()->mainFrame()->evaluateJavaScript(cod);

Попытка найти саму форму тоже провалилась с треском. Подскажите хотя бы направление куда рыть.

PS сайт указанный в QWebView является моим. Собственно на нем и тренируюсь.

Появилась идея, что все вызовы должны происходить в другом Frame, а не в основном. Прав ли я? буду проверять.
« Последнее редактирование: Сентябрь 27, 2011, 15:39 от Bepec » Записан
SimpleSunny
Гость
« Ответ #1 : Сентябрь 27, 2011, 15:37 »

Что первично изучение JS или заполнение форм на сайтах?
Записан
Bepec
Гость
« Ответ #2 : Сентябрь 27, 2011, 15:46 »

Первично сначала решить данную задачу. Скажем так - дать толчок к последующему изучению.

Изучать весь язык в намерениях нет, есть только желание изучить его прикладуню часть, оформление, интерактивный интерфейс. Возможно последующая работа с БД.

А далее, уже в прикладных задачах и изучение всего языка подтянется.

PS да и порывшись на форуме, я нашел только 3-5 тем с таким вопросом, но блуждающими ответами Улыбающийся Хотелось бы еще и заваять эту тему для других, а так же впоследствии прикрепить сюда  свой примерчик с пояснениями.
Записан
SimpleSunny
Гость
« Ответ #3 : Сентябрь 28, 2011, 10:44 »

Просто задача заполнение формочек на разных сайтах решается проще, без привлечения QWebView и JavaScript.
Снифером смотрим, что отправляется на сервер, и такой же запрос отправляем руками через QNetworkAccessManager.
Записан
Bepec
Гость
« Ответ #4 : Сентябрь 28, 2011, 13:07 »

Проблема в том что сайты могут менятся, названия и прочие id тоже не останутся неизменными. Задача же стоит написать гибкую программу, а не с конкретными сайтами,
которую можно перенастроить при помощи пользовательского интерфейса.

С QNetworkAccessManager не работал, пара вопросов:
1) Запрос имеется в виду пакет данных?
2) Какой снифер посоветуете? (сотни скачать могу, но лучше проверенные и эргономичные программы)
3) Имеется ли возможность будет на лету править пакет в нем, с целью настройки на новый сайт и новую форму?
Записан
SimpleSunny
Гость
« Ответ #5 : Сентябрь 28, 2011, 13:55 »

2. Использую дополнение к ФФ FireBug и\или Wireshark, доступен под win\lin.
1,3 Не совсем понял понял про пакет данных, но запрос выглядит как-то так
Код
C++ (Qt)
QNetworkAccessManager magaer;
QNetworkReuqest request;
request.setRawHeader("Referer", "blabla");
request.setUrl(QUrl("http://example.com/form.php"));
manager.post(request, "name1=value1&name2=value2");
Записан
Bepec
Гость
« Ответ #6 : Сентябрь 28, 2011, 13:57 »

Благодарю, завтра попробую, сегодня уж забился по самое нехочу. Благодарю за отклик.

to all: если есть еще предложения по JavaScript'у, пишите Улыбающийся
Записан
Bepec
Гость
« Ответ #7 : Октябрь 03, 2011, 12:03 »

up!

Обновление вопроса.

Как все же с помощью жабаСкрипта нажать на кнопку?

PS название темы совпадает, новую создавать, твинков плодить.
Записан
_OLEGator_
Гость
« Ответ #8 : Октябрь 03, 2011, 15:10 »

Серьезно чтоли?
Вызвать click() у кнопки с помощью JavaScript
Записан
Bepec
Гость
« Ответ #9 : Октябрь 04, 2011, 07:12 »

Я в курсе что вызвать click() у кнопки с помощью JavaScript, НО:

1) кнопка находится в форме, событие click у нее не обрабатывается( хз почему, но находится по id, вызывается click() и... тишина)

2) меня интересует не отдельный вопрос по жабе, а - смотри название темы.  Как это сделать в QWebView с помощью жабы.

3) вызов у кнопки submit не увенчался успехом. (а тип у нее submit)

4) попытка вызова Jaba функции отправки формы (которая уже имеется на странице) не увенчалась успехом тоже.

5 - пожалуйста, прежде чем писать простые ответы, хотя бы прочитайте тему и собственно вопрос.

to SimpleSunny:
    Благодарю за направление, авторизируется, разбираюсь сейчас с тем, как подружить его с QWebView. Ну или хотя бы использовать его в отображении ^^

    И к сожалению он не подходит для заполнения формочек - нужна гибкость в настройке на любую форму, что вполне можно реализовать JavaScript'oм.
    А его настройка требует снифера и хотя бы малого умения им пользоваться (не для себя программу пишу, мне б и такого хватило Улыбающийся )

« Последнее редактирование: Октябрь 04, 2011, 07:14 от Bepec » Записан
_OLEGator_
Гость
« Ответ #10 : Октябрь 04, 2011, 09:48 »

Я такое уже делал (автозаполнение форм регистрации на форумах).
Скинул бы минимальный проект с проблемой, я бы глянул вечерком.
Записан
Bepec
Гость
« Ответ #11 : Октябрь 04, 2011, 10:07 »

В принципе минимальный проект доступен в теме Улыбающийся
В JavaScript'e  я новичек.

Единственное что мне непонятно - как в QWebView поймать кнопку и что ей послать чтобы она нажалась Улыбающийся

Код:
	button = ui.webView->page()->mainFrame()->findFirstElement("input[type=submit]");
button.evaluateJavaScript("click()");

почему то не проходит. Улыбающийся

Был бы рад самому простому примеру с нажатием в QWebView  кнопки, находящейся в форме (обычные нажимаются без проблема.)

PS еще сегодня по 2 разу попробую.
Записан
_OLEGator_
Гость
« Ответ #12 : Октябрь 04, 2011, 11:11 »

Вот рабочий пример:
Код
C++ (Qt)
#include <QtGui>
#include <QVBoxLayout>
#include <QWebView>
#include <QWebFrame>
#include <QWebElement>
#include <QMessageBox>
 
MainWindow::MainWindow()
{
QVBoxLayout* centralLayout = new QVBoxLayout(this);
 
QWebView* webView = new QWebView(this);
webView->setHtml("<html><body><form><input type=\"submit\" onclick=\"alert(1); return false;\">TEST</button></form></body></html>");
centralLayout->addWidget(webView);
 
QWebElement button = webView->page()->mainFrame()->findFirstElement("input[type=submit]");
 
if (button.isNull()) QMessageBox::critical(this, "", "error");
 
button.evaluateJavaScript("this.click();");
 
setLayout(centralLayout);
}
Записан
Bepec
Гость
« Ответ #13 : Октябрь 04, 2011, 13:53 »

Olegator в том то и закавыка что в форме у кнопки не определено действие. обработчик в форме находится...


Код:
<div class="block">
<div class="blocktitle">
<!-- <bt> -->
<!--<s5158>-->
Форма входа
<!--</s>-->
<!-- </bt> -->
</div>
<div class="blockcontent">
<!-- <bc> -->
<script type="text/javascript">
sendFrm549524=function(){
 var o=$('#frmLg549524')[0],pos=_uGetOffset(o),o2=$('#blk549524')[0];
 document.body.insertBefore(o2,document.body.firstChild);
 $(o2).css({top:(pos['top'])+'px',left:(pos['left'])+'px',width:o.offsetWidth+'px',height:o.offsetHeight+'px',display:''}).html('<div align="left" style="padding:5px;"><div class="myWinLoad"></div></div>');
 _uPostForm('frmLg549524',{type:'POST',url:'/index/sub/',error:function() {
  $('#blk549524').html('<div align="left" style="padding:10px;"><div class="myWinLoadSF" title="Невозможно выполнить запрос, попробуйте позже"></div></div>');
  _uWnd.alert('<div class="myWinError">Невозможно выполнить запрос, попробуйте позже</div>','',{w:250,h:90,tm:3000,pad:'15px'});
  setTimeout("$('#blk549524').css('display','none');",'1500');
  }
 });
}
</script>
<div id="blk549524" style="border:1px solid #CCCCCC;position:absolute;z-index:82;background:url('http://s57.ucoz.net/img/fr/g.gif');display:none;"/>
<form id="frmLg549524" action="/index/sub/" method="post" style="margin:0" onsubmit="sendFrm549524();return false;">
<table border="0" cellspacing="1" cellpadding="0" width="100%">
<tbody>
<tr>
<td width="20%" nowrap="nowrap">
E-mail:
<a href="javascript://" rel="nofollow" onclick="new _uWnd('HelpWd','Помощник',360,150,{align:'justify',closeonesc:1},{url:'/index/90-7'});return false;" class="noun">
<img alt="" title="uID поддержка" src="http://s57.ucoz.net/img/ma/uid.gif" style="border:0;vertical-align:-4px;"/>
</a>
</td>
<td>
<input class="loginField" type="text" name="user" value="" size="20" style="width:100%;" maxlength="50"/>
</td>
</tr>
<tr>
<td>Пароль:</td>
<td>
<input class="loginField" type="password" name="password" size="20" style="width:100%" maxlength="15"/>
</td>
</tr>
</tbody>
</table>
<table border="0" cellspacing="1" cellpadding="0" width="100%">
<tbody>
<tr>
<td nowrap="">
<input id="remsitePage2" type="checkbox" name="rem" value="1" checked="checked"/>
<label for="remsitePage2">
</td>
<td align="right" valign="top">
<input class="loginButton" name="sbm" type="submit" value="Вход"/>
</td>
</tr>
<tr>
<td colspan="2">
<div style="font-size:7pt;text-align:center;">
</td>
</tr>
</tbody>
</table>
<input type="hidden" name="a" value="2"/>
<input type="hidden" name="ajax" value="1"/>
<input type="hidden" name="rnd" value="524"/>
</form>
<!-- </bc> -->
</div>
</div>


вот сама кнопка - выдрано из предыдущего кода

Код:
<td align="right" valign="top">
<input class="loginButton" name="sbm" type="submit" value="Вход"/>
</td>

PS если передавать click(), то ничего не происходит.

Update: добавился вопрос - как нажать кнопку если у нее нет обработчика? Улыбающийся
« Последнее редактирование: Октябрь 04, 2011, 14:00 от Bepec » Записан
_OLEGator_
Гость
« Ответ #14 : Октябрь 04, 2011, 14:25 »

Bepec, а ты мой код пробовал компилять и запускать?!
Здесь не важно, определен ли обработчик клика у кнопки или нет. Я это сделал чтобы просмотреть что клик программно прошел.
Вся разница в том, что надо вместо
Код
C++ (Qt)
button.evaluateJavaScript("click()");
использовать
Код
C++ (Qt)
button.evaluateJavaScript("this.click();");
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.112 секунд. Запросов: 21.