@@ -77,6 +77,96 @@ void JSNotifier::setResult(QVariant result)
7777 emit completed ();
7878}
7979
80+ BrowserLogHandler::BrowserLogHandler (QObject *parent): QObject(parent), jslogger()
81+ {
82+ }
83+
84+ base::ListValue* BrowserLogHandler::getLog ()
85+ {
86+ return jslogger.getLog ();
87+ }
88+
89+ void BrowserLogHandler::SetMinLogLevel (LogLevel level)
90+ {
91+ jslogger.SetMinLogLevel (level);
92+ }
93+
94+ void BrowserLogHandler::loadJSLogObject ()
95+ {
96+ QWebFrame *mainFrame = qobject_cast<QWebFrame*>(sender ());
97+ if (mainFrame)
98+ loadJSLogObject (mainFrame);
99+ }
100+
101+ void BrowserLogHandler::loadJSLogObject (QWebFrame *frame)
102+ {
103+ frame->addToJavaScriptWindowObject (" wdconsole" , &jslogger);
104+ }
105+
106+ void BrowserLogHandler::loadConsoleJS ()
107+ {
108+ QWebView* view = qobject_cast<QWebView*>(sender ());
109+ if (view)
110+ loadConsoleJS (view);
111+ }
112+
113+ void BrowserLogHandler::loadConsoleJS (const QWebView *view)
114+ {
115+ QString jscript (" if ( _log == null ){"
116+ " var _log = console.log,"
117+ " _warn = console.warn,"
118+ " _error = console.error;"
119+ " };"
120+
121+ " console.log = function() {"
122+ " wdconsole.log(arguments[0]);"
123+ " return _log.apply(console, arguments);"
124+ " };"
125+
126+ " console.warn = function() {"
127+ " wdconsole.warn(arguments[0]);"
128+ " return _warn.apply(console, arguments);"
129+ " };"
130+
131+ " console.error = function() {"
132+ " wdconsole.error(arguments[0]);"
133+ " return _error.apply(console, arguments);"
134+ " };" );
135+ view->page ()->mainFrame ()->evaluateJavaScript (jscript);
136+ }
137+
138+ JSLogger::JSLogger ()
139+ {
140+ browserLogger.AddHandler (&browserLog);
141+ }
142+
143+ base::ListValue* JSLogger::getLog ()
144+ {
145+ base::ListValue* retVal = browserLog.entries_list ()->DeepCopy ();
146+ browserLog.clear_entries_list ();
147+ return retVal;
148+ }
149+
150+ void JSLogger::SetMinLogLevel (LogLevel level)
151+ {
152+ browserLogger.set_min_log_level (level);
153+ }
154+
155+ void JSLogger::log (QVariant message)
156+ {
157+ browserLogger.Log (kInfoLogLevel , message.toString ().toStdString ());
158+ }
159+
160+ void JSLogger::warn (QVariant message)
161+ {
162+ browserLogger.Log (kWarningLogLevel , message.toString ().toStdString ());
163+ }
164+
165+ void JSLogger::error (QVariant message)
166+ {
167+ browserLogger.Log (kSevereLogLevel , message.toString ().toStdString ());
168+ }
169+
80170const ViewType QWebViewCmdExecutorCreator::WEB_VIEW_TYPE = 0x13f0 ;
81171
82172QWebViewCmdExecutorCreator::QWebViewCmdExecutorCreator ()
@@ -771,6 +861,8 @@ void QWebViewCmdExecutor::SwitchTo(Error** error) {
771861
772862 session_->logger ().Log (kInfoLogLevel , " SwitchTo - set current view (" +view_id_.id ()+" )" );
773863
864+ AddBrowserLoggerToView (view);
865+
774866 // reset frame path
775867 session_->frame_elements_ .clear ();
776868 session_->set_current_frame (FramePath ());
@@ -1464,6 +1556,19 @@ void QWebViewCmdExecutor::TouchFlick(const ElementId &element, const int &xoffse
14641556 view->page ()->mainFrame ()->scroll (-xoffset*(speed+1 ), -yoffset*(speed+1 ));
14651557}
14661558
1559+ void QWebViewCmdExecutor::GetBrowserLog (base::ListValue** browserLog, Error **error)
1560+ {
1561+ QWebView* view = getView (view_id_, error);
1562+ if (NULL == view)
1563+ return ;
1564+
1565+ BrowserLogHandler* logHandler = view->findChild <BrowserLogHandler*>();
1566+ if (NULL == logHandler)
1567+ return ;
1568+
1569+ *browserLog = logHandler->getLog ();
1570+ }
1571+
14671572QWebFrame* QWebViewCmdExecutor::FindFrameByPath (QWebFrame* parent, const FramePath &frame_path) {
14681573 if (frame_path.value ().empty ())
14691574 return NULL ;
@@ -1984,7 +2089,7 @@ Error* QWebViewCmdExecutor::SwitchToFrameWithJavaScriptLocatedFrame(
19842089 std::string frame_id = GenerateRandomID ();
19852090 error = ExecuteScriptAndParse (
19862091 frame,
1987- " function(elem, id) { var meta; elem.setAttribute('wd_frame_id_', id); var doc = elem.contentDocument? elem.contentDocument: elem.contentWindow.document; meta=doc.createElement('meta'); meta.name = 'wd_frame_id_'; meta.content = id; var child = doc.body.appendChild(meta); console.log(meta); console.log(child); }" ,
2092+ " function(elem, id) { var meta; elem.setAttribute('wd_frame_id_', id); var doc = elem.contentDocument? elem.contentDocument: elem.contentWindow.document; meta=doc.createElement('meta'); meta.name = 'wd_frame_id_'; meta.content = id; var child = doc.body.appendChild(meta);}" ,
19882093 " setFrameId" ,
19892094 CreateListValueFrom (new_frame_element, frame_id),
19902095 CreateDirectValueParser (kSkipParsing ));
@@ -2107,5 +2212,20 @@ Error* QWebViewCmdExecutor::ToggleOptionElement(const ElementId& element) {
21072212 return error;
21082213}
21092214
2215+ void QWebViewCmdExecutor::AddBrowserLoggerToView (QWebView* view)
2216+ {
2217+ BrowserLogHandler* logHandler = view->findChild <BrowserLogHandler*>();
2218+ if (NULL == logHandler)
2219+ {
2220+ logHandler = new BrowserLogHandler (view);
2221+ logHandler->SetMinLogLevel (session_->capabilities ().log_levels [LogType::kBrowser ]);
2222+ }
2223+
2224+ QObject::connect (view->page ()->mainFrame (), SIGNAL (javaScriptWindowObjectCleared ()), logHandler, SLOT (loadJSLogObject ()));
2225+ QObject::connect (view, SIGNAL (loadFinished (bool )),logHandler, SLOT (loadConsoleJS ()), Qt::QueuedConnection);
2226+ logHandler->loadJSLogObject (view->page ()->mainFrame ());
2227+ logHandler->loadConsoleJS (view);
2228+ }
2229+
21102230
21112231} // namespace webdriver
0 commit comments