Skip to content

Commit 03694d2

Browse files
committed
replaced QXmlPattern with pugixml
1 parent 63d5159 commit 03694d2

File tree

1 file changed

+47
-46
lines changed

1 file changed

+47
-46
lines changed

src/webdriver/extension_qt/widget_view_executor.cc

Lines changed: 47 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,7 @@
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

5653
namespace webdriver {
5754

@@ -838,11 +835,6 @@ bool QWidgetViewCmdExecutor::FilterNativeWidget(const QWidget* widget, const std
838835
}
839836

840837
void 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

902903
void QWidgetViewCmdExecutor::createUIXML(QWidget *parent, QIODevice* buff, XMLElementMap& elementsMap, Error** error, bool needAddWebSource) {

0 commit comments

Comments
 (0)