LINUX.ORG.RU

Qt QwebKit


0

1

Всем доброго времени суток!

Задача довольно тривиальная, вбить в поля ввода на сайте данные и нажать кнопку.

 
// В хедере
QWebView*     webView;
...
// в *.cpp
webView->page()->mainFrame()->findFirstElement("name").setAttribute("value", "nikName");

По логике должно, как то так быть. Т.е. в окне WebView-a мы находим первый элемент с тегом «name» и задаем его атрибут «value» нужным нам значением. Конечно же это не работает, видимо потому, что findFirstElement() работает не так как я хочу.. Читал как парсить код сайтов, но это мне не нужно, нужно имитировать нажатия кнопки и вбить в поле ввода значение. Пхп запросы тоже не подходят. Помогите решить эту задачу: 1. как задать атрибут value у поля ввода 2. как нажать кнопку 3. Если ли возможность искать элементы на форме более узко, по ID или name атрибуту?

Заранее спасибо.

P.S. В C# есть такие методы как получить по ID (GetElementById()) или Name(GetElementByName()) элемент, или контейнер элементов. Хотелось бы именно, что то подобное реализовать. Думаю в Qt это есть. Если кто то может помочь пример буду очень благодарен, если нет, то хотя бы подскажите книжку где это можно вычитать. (Хотя если вы знаете книжку то видимо и ответ знаете= ))

Ответ на: комментарий от shty

Ух.. даже стыдно стало, это стандартный пример для Qt 4.7. Спасибо большое он помог, но мне надо более узко, ибо пример ищет разметку. для поиска по запросу «input», все input-ы будут одинаковые, хотя одно поле ввода, другое кнопка.. И уж тем более если они имеют разные ID или Name.

<input type = "button" ..>
<input type = "text" ..>
Не подскажите как это можно решить?

AlkaLoiD
() автор топика
Ответ на: комментарий от thrall

Возможно это изврат, но задумка заключается в том, чтобы пользователь мог видеть, что и как происходит. Так сказать автоматизация чел-кой деятельности, выполнение каких то действий программой, а на каком это этапе передача управления пользователю, либо сразу управление пользователем.

AlkaLoiD
() автор топика
Ответ на: комментарий от AlkaLoiD

http://doc.qt.nokia.com/4.7-snapshot/qwebelement.html

Individual elements can be inspected or changed using methods such as attribute() or setAttribute(). For examle, to capture the user's input in a text field for later use (auto-completion), a browser could do something like this:

     QWebElement firstTextInput = document.findFirst("input[type=text]");
     QString storedText = firstTextInput.attribute("value");

fluorite ★★★★★
()
Ответ на: комментарий от fluorite

Большое спасибо, 1 и 3 пункт одним выстрелом.

Но вот с нажатием на кнопку или CheckBoX, проблема. Делаю вроде все так же как в примере, но не нажимает. стандартный пример

     QWebElement document = frame->documentElement();
     /* Assume that the document has the following structure:

         <form name="myform" action="submit_form.asp" method="get">
             <input type="text" name="myfield">
             <input type="submit" value="Submit">
         </form>

      */

     QWebElement button = document.findFirst("input[type=submit]");
     button.evaluateJavaScript("click()");
то что пытаюсь сделать я
    QWebFrame *frame = m_pwv->page()->mainFrame();
    QWebElement document = frame->documentElement();
...
    QWebElement inputCheckBox = document.findFirst("input[id=lowRes]");
    inputCheckBox.evaluateJavaScript("click()");
    QWebElement inputButton = document.findFirst("button[type=submit]");
    inputButton.evaluateJavaScript("click()");
...
этот код пытаюсь применить к html кода
<input type="checkbox" id="lowRes" name="lowRes" value="1" />
	<p class="btn">
...
<p class="btn">
	<button type="submit" value="Войти" name="s1" id="s1" onclick="document.snd.w.value=screen.width+':'+screen.height;">
		<div class="button-container">
			<div class="button-position">
				<div class="btl">
					<div class="btr">
						<div class="btc">
						</div>
					</div>
				</div>
				<div class="bml">
					<div class="bmr">
						<div class="bmc">
						</div>
					</div>
				</div>
				<div class="bbl">
					<div class="bbr">
						<div class="bbc">
						</div>
					</div>
				</div>
			</div>
			<div class="button-contents">
				Войти
			</div>
		</div>
	</button>
	<input type="hidden" name="w" value="" />
	<input type="hidden" name="login" value="1319356229" />
</p>
вот такая вот чушь.. знаю что это мало чем поможет, ибо скрипт находиться в файле, а файл на 20 К строк и искать там тяжко. Суть такая что я перепробовал все элементы которые тут есть, пытался нажимать на все, толку ноль. Кнопка сама по себе и не кнопка, а набор дивов которые прорисовывают картинку в виде кнопки. Нажимал на скрытые unput-ы результат нулевой..

На шарпе это выглядит примерно так

webBrowser1.Document.GetElementById("s1").InvokeMember("click");

подскажите что делаю не так? можно и лучше на примере какой то страницу, даже авторизация этого сайта удовлетворяет критериям примера.

AlkaLoiD
() автор топика
Ответ на: комментарий от AlkaLoiD
#include <QtGui/QApplication>
#include <QtWebKit/QWebElement>
#include <QtWebKit/QWebView>
#include <QtWebKit/QWebFrame>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWebView webView;
    webView.setHtml("<html><body><form><input type='submit' onclick='alert(42); return false;'>Click the button!</button></form></body></html>");

    QWebElement button = webView.page()->mainFrame()->findFirstElement("input[type=submit]");
    button.evaluateJavaScript("this.click();");

    webView.show();

    return a.exec();
}

В своем html ты не указал, что кнопка на форме.

travian не нужен

fluorite ★★★★★
()
Ответ на: комментарий от fluorite

ем.. не сразу понял в чем прикол, но дошел именно до страницы warmup3, и застрял. Прочитав мануал так и не понял как нажать на этот бекон..

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
...
			<form method="POST" action="/warmup3/" name="lf">
				<input type="hidden" name="crypt_key" value="2946af731e656bc8ea2e8cc2183f3a91">
				<select name="chosen" class="select">
					<option value="Apple">Apple</option>
					<option value="Lemon">Lemon</option>
					<option value="Mango">Mango</option>
					<option value="Orange">Orange</option>

				</select>
				<input type="submit" class="button" value="Proceed">
			</form>
вроде как получается что надо нажать
<input type="hidden" name="crypt_key" value="2946af731e656bc8ea2e8cc2183f3a91">
а как это сделать если у формы не заявлен onsubmit=.. ? выпадающий список так же не имеет разногласий в названии и строке.. дайте подсказку = )

AlkaLoiD
() автор топика
Ответ на: комментарий от fluorite

ааааааАА!! Как?! почему?! зачем?! Зачем ты мне дал этот квест? я пол дня думал.. Я не силен в php и прочем, но когда вбиваешь в поисковик POST и GET вылазит только php. Пытался запросом отправить в строку браузера, но тупо "?chosen=Bacon" не катило. Почитал понял что POST передает в теле, что это толком значит не понял, но понял что такой запрос не прокатит..

100-ый раз перечитав мануал, в котором нет ни черта как отправить запрос, а просто куча POST и submit которые не понятно как действуют.. сделал копию и тупо прописал этот Бэкон и вызвал.. как ни странно прокатило.. Но черт побери как это работает?! КАК?!

И еще по теме топика, мне надо кнопку нажать, запросы не айс.. Надо именно имитировать нажатие кнопки. Вопрос, к чему Вы меня так мучаете? скажите книгу, лучшее ее прочитать чем этот тест проходить. )

AlkaLoiD
() автор топика
Ответ на: комментарий от AlkaLoiD

Вопрос, к чему Вы меня так мучаете? скажите книгу, лучшее ее прочитать чем этот тест проходить. )

нельзя просто пойти и купить грааль в супермаркете, его надо добыть :)

shty ★★★★★
()
Ответ на: комментарий от fluorite

черт, оказалось все так просто.. спасибо большое!)

только кол-во вопросов к Вам не уменьшилось... как вы это делаете?)

совсем тупой вопрос, в стандартном примере кнопка в форме, но там не «this», в чем прикол то? this это же ссылка на себя получается?

travian не нужен

а это к чему? и как нашли от куда код?)))

AlkaLoiD
() автор топика
Ответ на: комментарий от shty

нельзя просто пойти и купить грааль в супермаркете, его надо добыть :)

хы.. самое смешное, что ответ дали мне еще 4 поста выше.. я просто проглядел его) и все время думал об этом тесте.. ужас.. самое смешное, что пройдя эту задачу, я не понял как это связано, как это работает.. мозг сломан .. надо чинить .. ) поэтому книжку посоветуйте где хорошо написано об формочках в html = )) то что я сделал не как не вяжется с логикой здравого смысла, по сути я сам чего там поменял, а потом и вызвал как GET .. видимо это не так проходиться должно было быть..)

AlkaLoiD
() автор топика
Ответ на: комментарий от AlkaLoiD

поэтому книжку посоветуйте где хорошо написано об формочках в html = ))

к сожалению, я тут особо ничего не могу посоветовать

shty ★★★★★
()
Ответ на: комментарий от AlkaLoiD

>Я не силен в php и прочем, но когда вбиваешь в поисковик POST и GET вылазит только php.

Это и не требуется, а вот основы HTTP не знать стыдно

annulen ★★★★★
()
Ответ на: комментарий от annulen

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

то что я читал, все сводилось к одному что: GET - можно вбивать прям в строку браузера POST - нельзя вбивать, по тому как данные передаются в теле, поэтому можно большими данными оперировать.

А вообще я много чего не знаю, поэтому на форумах и спрашиваю. это нормально )

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

В итоге, да студент )

AlkaLoiD
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.