Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Squarc от Июль 14, 2010, 23:23



Название: QWebView + клик по кнопке
Отправлено: Squarc от Июль 14, 2010, 23:23
Здравствуйте! Я новичок в Qt программировании. Вот решил повозиться с QWebView компонентом. Столкнулся с проблемой, что для автоматизации действия надо нажать на определенную кнопку на странице, только вот не знаю как это сделать. Как я понял, положение кнопки можно взять как
Код:
QWebElement element;
...element.geometry().center()
только вот как кликнуть на найденную кнопку?


Название: Re: QWebView + клик по кнопке
Отправлено: redcouch от Июль 15, 2010, 21:17
Интересует почти такая же проблема. Правда, кроме кнопки нужно еще заполнить две строчки и поставить галочку.


Название: Re: QWebView + клик по кнопке
Отправлено: crackedmind от Июль 15, 2010, 21:55
я конечно понимаю, что это не оригинально, но можно выполнить JavaScript ;)


Название: Re: QWebView + клик по кнопке
Отправлено: serg_hd от Июль 15, 2010, 22:03
да, либо evaluateJavaScript(), либо делать клик в пределах формы имея координаты для клика, которые могут быть в "составе кнопки" (не пробовал так, но наверное есть такая возможность). Хотя оба варианта прогорят, если изменится вёрстка страницы (первый может и нет, если кнопка берётся по id элемента, а значение id не изменён к примеру), тут уж ничего не поделаешь.

п.с. эко народ на роботов/ботов для автоматизации работы с сайтами потянуло


Название: Re: QWebView + клик по кнопке
Отправлено: Squarc от Июль 15, 2010, 23:22
вот именно, что бот... страничка на ПХП... скриптов никаких нет на ней... какна кнопать кликнуть даже не представляю. Подскажите как кликнуть то на виджет


Название: Re: QWebView + клик по кнопке
Отправлено: serg_hd от Июль 16, 2010, 00:14
вот именно, что бот... страничка на ПХП... скриптов никаких нет на ней... какна кнопать кликнуть даже не представляю. Подскажите как кликнуть то на виджет
сказал же, evaluateJavaScript() используй. поставить его надо в слоте на сигнал loadFinished() вебвьюхи например.

QVariant QWebFrame::evaluateJavaScript ( const QString & scriptSource )   [slot]
Evaluates the JavaScript defined by scriptSource using this frame as context and returns the result of the last executed statement.

А если не знаешь яваскрипт, то дело плохо, смысл даже без этих знаний лезть в эту нишу?

страничка на ПХП...
страничка не на php, а на html и т.п., так как php это серверный, а не клиентский скрипт.

скриптов никаких нет на ней
они там и не нужны, это тебе надо внедрить на страницу скрипт через evaluateJavaScript().

Псевдокод:
Код
C++ (Qt)
const QString& jScript = "document.getElementById('myButtonsId').click()";
QWebView->QWebFrame->evaluateJavaScript(jScript);
 
Тут яваскрипт берёт кнопку по её id и кликает, можно также брать по имени или индексу в коллекции кнопок, смотря чем удобнее глядя на исходник страницы.


Название: Re: QWebView + клик по кнопке
Отправлено: Squarc от Июль 16, 2010, 16:12
спасибо за ответ ;) надо же на чем-то учиться...


Название: Re: QWebView + клик по кнопке
Отправлено: Nolorop от Ноябрь 27, 2010, 20:52
Доброго вечера.
Такая же проблема: нужно кликнуть по кнопке, но предложенный вариант не устраивает по причине того, что координаты клика относительно кнопки затем передаются в POST-запросе. Это видно в FireBug'e, правда пока не нашел каким макаром они получаются, ибо не знаю javascript. Мне важно полностью эмулировать поведение пользователя-мышатника.
Пробовал такое решение: http://stackoverflow.com/questions/2655414/qt-force-qwebview-to-click-on-a-web-element-even-one-not-visible-on-the-window (http://stackoverflow.com/questions/2655414/qt-force-qwebview-to-click-on-a-web-element-even-one-not-visible-on-the-window), но кнопка по которой кликаю видима на экране не всегда, поэтому такой вариант тоже не устраивает.
Итак, нужна максимально точная эмуляция клика по элементу, которого сейчас нет на экране.


Название: Re: QWebView + клик по кнопке
Отправлено: Nolorop от Ноябрь 27, 2010, 23:28
Разобрался, делается джаваскриптом:
https://developer.mozilla.org/en/DOM/document.createEvent (https://developer.mozilla.org/en/DOM/document.createEvent)
https://developer.mozilla.org/en/DOM/event.initMouseEvent (https://developer.mozilla.org/en/DOM/event.initMouseEvent)