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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: поиск объекта на Google Docs  (Прочитано 4586 раз)
WILY
Гость
« : Октябрь 05, 2015, 15:40 »

Добрый день
Пишу программу и решил в нее встроить гугл опросник. Хочу автоматически заполнять поля которые могу, такие как имя фамилия и. т. д.
вывожу QWebView сам опрос, вопрос как найти на странице элемент и заложить в туда свое значение.
Нагуглил такое решение

 
Код
C++ (Qt)
      QWebView *wbQre = new QWebView();
       wbQre->load(QUrl(link));
       wbQre->show();
 
       QWebFrame* frame = wbQre->page()->currentFrame();
       if (frame!=NULL)
              {
                  QWebElement collection = frame->findFirstElement("input[type='text']");
                  collection.setAttribute("value", "qt webkit autocomplete an input");
              }

не могу как выделить атрибут для поиска элемента.
Всем заранее спасибо!
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Октябрь 05, 2015, 15:53 »

Правой кнопкой на объект и выбираете, например Инспектировать (для Firefox) у других браузеров есть свои, и смотрите какой тег и атрибут у полей и заполняете нужные. В вашем примере "input[type='text']" это что-то: <input type="text"><input>
QWebElement для поиска использует css-селекторы. Если там будут теги вида:
<input class="first_name">
<input id="first_name">
то найти их можно так:
QWebElement * doc = view->page()->mainFrame()->documentElement();
QWebElement * tag = doc ->findFirst(".first_name");
QWebElement * tag = doc ->findFirst("#first_name");
Это короткая запись для атрибутов class и id, можно и полную запись использовать, в которой указывается тег
Чтобы проверить, что элемент нашелся проверяйте на isNone()

Если не справитесь, то скиньте ссылку на тот вебдокумент
Записан

WILY
Гость
« Ответ #2 : Октябрь 05, 2015, 16:29 »

https://docs.google.com/forms/d/1Uh6pMB6c9lF9GUMdZcK-zXfdeAtjFM76uDA0l1uJ214/viewform
вот ссылка

Попробовал вот по всякому

Код
C++ (Qt)
       QWebElement frame = wbQre->page()->mainFrame()->documentElement();
       QWebElement collection = frame.findFirst("#entry_665195659");
       if (collection.isNull())
       {
           qDebug() << "None";
       }
 

и вот так вот

 
Код
C++ (Qt)
      QWebElement frame = wbQre->page()->mainFrame()->documentElement();
       QWebElement collection = frame.findFirst("<input id=\"entry_665195659\">");
       if (collection.isNull())
       {
           qDebug() << "None";
       }
 

все равно выводит none
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #3 : Октябрь 05, 2015, 16:48 »

Скрипт на питоне, но использует он Qt
« Последнее редактирование: Октябрь 05, 2015, 16:53 от gil9red » Записан

gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #4 : Октябрь 05, 2015, 16:49 »

А страница у вас успела прогрузиться?

Попробуйте после вызова загрузки страницы и перед поиском тэга воспользоваться этим:
QEventLoop loop;
connect(view, SIGNAL(loadFinished()), &loop, SLOT(quit()));
loop.exec();

Вроде бы правильно код написан
« Последнее редактирование: Октябрь 05, 2015, 16:51 от gil9red » Записан

WILY
Гость
« Ответ #5 : Октябрь 05, 2015, 17:02 »

Написал вот так

Код
C++ (Qt)
       QWebView *wbQre = new QWebView();
       wbQre->load(QUrl(link));
       wbQre->show();
 
       QEventLoop loop;
       connect(wbQre, SIGNAL(loadFinished()), &loop, SLOT(quit()));
       loop.exec();
 
       QWebElement frame = wbQre->page()->mainFrame()->documentElement();
       QWebElement collection = frame.findFirst("#entry_665195659");
       collection.setAttribute("value", "qqq");

все равно не работает.

Забыл указать у меня qt 4.7.0 и просто в место сбора бинарника скопированы ssl библиотеки
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #6 : Октябрь 05, 2015, 17:34 »

Проверил, loadFinished() надо так: loadFinished(bool)
Приложил мини пример
Записан

WILY
Гость
« Ответ #7 : Октябрь 06, 2015, 09:31 »

Спасибо большое, все работает, есть еще следующий вопрос. Я так понял мы идем объект по его id и вставляем текс, но если мы будем делать различные формы, то и id соответственно будет разным. Есть ли возможность например парсить тип объекта? или например по заголовку?

 
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #8 : Октябрь 06, 2015, 09:40 »

Вы можете искать объекты хоть по любому типу (div, input, button и т.п.), хоть просто по атрибутам, хоть смешано.
Посмотрите в гугле "css-selectors". Если возможностей css-селектора мало, можно работать через QWebElement'ы, например:

self.mw.doc это QWebElement
функция ищет объекты с class="alert", у которых есть вложенный тег с id="alert-title", значением которого строка "Восстановить здоровье".
Код
Python
   def _find_restore_hp_window(self):
       for el in self.mw.doc.findAll('.alert'):
           title = el.findFirst('#alert-title')
           if not title.isNull() and title.toPlainText() == 'Восстановить здоровье':
               logger.debug('Найдено окно восстановления жизней.')
 
               self._restore_hp_window = el
               self._find_restore_hp_window_finded.emit()
               self._timer.stop()
               return
Записан

WILY
Гость
« Ответ #9 : Октябрь 06, 2015, 09:59 »

Спасибо большое, вот решение
Код
C++ (Qt)
       QNetworkProxyFactory::setUseSystemConfiguration(true);
       QWebSettings::globalSettings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true);
 
       QWebView *wbQre = new QWebView();
       wbQre->load(QUrl(link));
       wbQre->show();
 
       QEventLoop loop;
       QObject::connect(wbQre, SIGNAL(loadFinished(bool)), &loop, SLOT(quit()));
       loop.exec();
 
       QWebElement frame = wbQre->page()->mainFrame()->documentElement();
       QWebElement collection = frame.findFirst("input[type=\"text\"]");
       collection.setAttribute("value", protocol->getClientName());
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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