4848#include < QtGui/QListView>
4949#endif
5050
51- #ifdef WD_CONFIG_XPATH
52- #include < QtXmlPatterns/QXmlQuery>
53- #include < QtXmlPatterns/QXmlResultItems>
54- #endif
51+ #include " third_party/pugixml/pugixml.hpp"
5552
5653namespace webdriver {
5754
@@ -838,11 +835,6 @@ bool QWidgetViewCmdExecutor::FilterNativeWidget(const QWidget* widget, const std
838835}
839836
840837void QWidgetViewCmdExecutor::FindNativeElementsByXpath (QWidget* parent, const std::string &query, std::vector<ElementId>* elements, Error **error) {
841- #ifndef WD_CONFIG_XPATH
842- *error = new Error (kXPathLookupError , " Finding elements by xpath is not supported" );
843- return ;
844- #else
845- QXmlResultItems result;
846838 QByteArray byteArray;
847839 QBuffer buff (&byteArray);
848840
@@ -853,50 +845,59 @@ void QWidgetViewCmdExecutor::FindNativeElementsByXpath(QWidget* parent, const st
853845 return ;
854846
855847 buff.seek (0 );
856- QXmlQuery xmlquery;
857- xmlquery.bindVariable (" buff" , &buff);
858- xmlquery.setQuery (" doc($buff) " +QString (query.c_str ()));
859848
860- if (!xmlquery.isValid ()) {
861- *error = new Error (kXPathLookupError );
862- return ;
863- }
864- xmlquery.evaluateTo (&result);
865-
866- buff.close ();
867- QXmlItem item (result.next ());
868- while (!item.isNull ()) {
869- if (item.isNode ()) {
870- xmlquery.setFocus (item);
871- xmlquery.setQuery (" ./@elementId/string()" );
872- if (!xmlquery.isValid ()) {
873- *error = new Error (kXPathLookupError );
874- return ;
875- }
876-
877- QString elementId;
878- xmlquery.evaluateTo (&elementId);
879- if (!elementId.isEmpty ()) {
880- // TODO: what this? why do we need to remove EOL?
881- elementId.remove (' \n ' );
882-
883- if (elementsMap.contains (elementId)) {
884- ElementId elm;
885- session_->AddElement (view_id_, new QElementHandle (elementsMap[elementId]), &elm);
886- (*elements).push_back (elm);
887- session_->logger ().Log (kFineLogLevel , " element found: " +elm.id ());
888- } else {
889- session_->logger ().Log (kSevereLogLevel , " cant get element from map, skipped" );
849+ // prepare pointer to data to parse
850+ const void * content = byteArray.data ();
851+ int content_size = byteArray.size ();
852+
853+ pugi::xml_document doc;
854+ pugi::xml_parse_result result = doc.load_buffer (content, content_size);
855+
856+ if (result) {
857+ session_->logger ().Log (kFineLogLevel , " UI XML parsed without errors" );
858+
859+ // Select nodes via compiled query
860+ pugi::xpath_query query_nodes (query.c_str ());
861+ pugi::xpath_node_set found_nodes = query_nodes.evaluate_node_set (doc);
862+
863+ if (NULL == query_nodes.result ().error ) {
864+ // pugi::xpath_node_set found_nodes = doc.select_nodes(query.c_str());
865+ printf (" !!!!!!!! found nodes: %d\n " , found_nodes.size ());
866+ for (pugi::xpath_node_set::const_iterator it = found_nodes.begin (); it != found_nodes.end (); ++it) {
867+ pugi::xpath_node node = *it;
868+
869+ QString elemId (node.node ().attribute (" elementId" ).value ());
870+
871+ if (!elemId.isEmpty ()) {
872+ if (elementsMap.contains (elemId)) {
873+ ElementId elm;
874+ session_->AddElement (view_id_, new QElementHandle (elementsMap[elemId]), &elm);
875+ (*elements).push_back (elm);
876+ session_->logger ().Log (kFineLogLevel , " element found: " +elm.id ());
877+ } else {
878+ session_->logger ().Log (kSevereLogLevel , " cant get element from map, skipped" );
879+ }
890880 }
891881 }
882+ } else {
883+ std::string error_descr = " Cant evaluate XPath: " ;
884+ error_descr += query_nodes.result ().description ();
885+ session_->logger ().Log (kWarningLogLevel , error_descr);
886+ *error = new Error (kXPathLookupError );
892887 }
893- item = result.next ();
894888 }
895- if (elements-> empty ())
889+ else
896890 {
897- return ;
891+ std::string error_descr = " Error description: " ;
892+ error_descr += result.description ();
893+ session_->logger ().Log (kWarningLogLevel , " UI XML parsed with errors:" );
894+ session_->logger ().Log (kWarningLogLevel , error_descr);
898895 }
899- #endif
896+
897+ // destroy tree
898+ doc.reset ();
899+
900+ buff.close ();
900901}
901902
902903void QWidgetViewCmdExecutor::createUIXML (QWidget *parent, QIODevice* buff, XMLElementMap& elementsMap, Error** error, bool needAddWebSource) {
0 commit comments