1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/test/webdriver/webdriver_error.h" 6 7 #include <sstream> 8 9 #include "chrome/common/automation_constants.h" 10 11 namespace webdriver { 12 13 namespace { 14 15 // Returns the string equivalent of the given |ErrorCode|. 16 const char* DefaultMessageForErrorCode(ErrorCode code) { 17 switch (code) { 18 case kSuccess: 19 return "Success"; 20 case kNoSuchElement: 21 return "The element could not be found"; 22 case kNoSuchFrame: 23 return "The frame could not be found"; 24 case kUnknownCommand: 25 return "Unknown command"; 26 case kStaleElementReference: 27 return "Element reference is invalid"; 28 case kElementNotVisible: 29 return "Element is not visible"; 30 case kInvalidElementState: 31 return "Element is in an invalid state"; 32 case kUnknownError: 33 return "Unknown error"; 34 case kElementNotSelectable: 35 return "Element is not selectable"; 36 case kXPathLookupError: 37 return "XPath lookup error"; 38 case kNoSuchWindow: 39 return "The window could not be found"; 40 case kInvalidCookieDomain: 41 return "The cookie domain is invalid"; 42 case kUnableToSetCookie: 43 return "Unable to set cookie"; 44 case kUnexpectedAlertOpen: 45 return "An open modal dialog blocked the operation"; 46 case kNoAlertOpenError: 47 return "No JavaScript modal dialog is open"; 48 default: 49 return "<unknown>"; 50 } 51 } 52 53 } // namespace 54 55 // static 56 Error* Error::FromAutomationError(const automation::Error& error) { 57 ErrorCode code = kUnknownError; 58 switch (error.code()) { 59 case automation::kNoJavaScriptModalDialogOpen: 60 code = kNoAlertOpenError; 61 break; 62 case automation::kBlockedByModalDialog: 63 code = kUnexpectedAlertOpen; 64 break; 65 case automation::kInvalidId: 66 code = kNoSuchWindow; 67 default: 68 break; 69 } 70 71 // In Chrome 17 and before, the automation error was just a string. 72 // Compare against some strings that correspond to webdriver errors. 73 // TODO(kkania): Remove these comparisons when Chrome 17 is unsupported. 74 if (code == kUnknownError) { 75 if (error.message() == 76 "Command cannot be performed because a modal dialog is active" || 77 error.message() == 78 "Could not complete script execution because a modal " 79 "dialog is active") { 80 code = kUnexpectedAlertOpen; 81 } else if (error.message() == "No modal dialog is showing" || 82 error.message() == "No JavaScript modal dialog is showing") { 83 code = kNoAlertOpenError; 84 } 85 } 86 87 // If the automation error code did not refer to a webdriver error code 88 // (besides unknown), include the error message from chrome. Otherwise, 89 // include the webdriver error code and the webdriver error message. 90 if (code == kUnknownError) { 91 return new Error(code, error.message()); 92 } else { 93 return new Error(code); 94 } 95 } 96 97 Error::Error(ErrorCode code) 98 : code_(code), 99 details_(DefaultMessageForErrorCode(code)) { 100 } 101 102 Error::Error(ErrorCode code, const std::string& details) 103 : code_(code), details_(details) { 104 } 105 106 Error::~Error() { 107 } 108 109 void Error::AddDetails(const std::string& details) { 110 details_ = details + ";\n " + details_; 111 } 112 113 ErrorCode Error::code() const { 114 return code_; 115 } 116 117 const std::string& Error::details() const { 118 return details_; 119 } 120 121 } // namespace webdriver 122