Home | History | Annotate | Download | only in webdriver
      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 #ifndef CHROME_TEST_WEBDRIVER_WEBDRIVER_AUTOMATION_H_
      6 #define CHROME_TEST_WEBDRIVER_WEBDRIVER_AUTOMATION_H_
      7 
      8 #include <map>
      9 #include <string>
     10 #include <vector>
     11 
     12 #include "base/command_line.h"
     13 #include "base/files/file_path.h"
     14 #include "base/memory/ref_counted.h"
     15 #include "base/memory/scoped_ptr.h"
     16 #include "chrome/common/automation_constants.h"
     17 #include "chrome/test/webdriver/webdriver_logging.h"
     18 #include "ui/base/keycodes/keyboard_codes.h"
     19 
     20 class AutomationId;
     21 class AutomationProxy;
     22 class ProxyLauncher;
     23 struct WebKeyEvent;
     24 struct WebMouseEvent;
     25 class WebViewId;
     26 struct WebViewInfo;
     27 class WebViewLocator;
     28 
     29 namespace base {
     30 class DictionaryValue;
     31 class ListValue;
     32 class Value;
     33 }
     34 
     35 namespace webdriver {
     36 
     37 class Error;
     38 class FramePath;
     39 class Point;
     40 class Rect;
     41 
     42 // Creates and controls the Chrome instance.
     43 // This class should be created and accessed on a single thread.
     44 // Note: All member functions are void because they are invoked
     45 // by posting a task.
     46 class Automation {
     47  public:
     48   struct BrowserOptions {
     49     BrowserOptions();
     50     ~BrowserOptions();
     51 
     52     // The command line to use for launching the browser. If no program is
     53     // specified, the default browser executable will be used.
     54     CommandLine command;
     55 
     56     // The user data directory to be copied and used. If empty, a temporary
     57     // directory will be used.
     58     base::FilePath user_data_dir;
     59 
     60     // The channel ID of an already running browser to connect to. If empty,
     61     // the browser will be launched with an anonymous channel.
     62     std::string channel_id;
     63 
     64     // True if the Chrome process should only be terminated if quit is called.
     65     // If false, Chrome will also be terminated if this process is killed or
     66     // shutdown.
     67     bool detach_process;
     68 
     69     // True if the browser should ignore certificate related errors.
     70     bool ignore_certificate_errors;
     71 
     72     // Set of switches to be excluded from default list when starting Chrome.
     73     std::set<std::string> exclude_switches;
     74   };
     75 
     76   explicit Automation(const Logger& logger);
     77   virtual ~Automation();
     78 
     79   // Start the system's default Chrome binary.
     80   void Init(const BrowserOptions& options, int* build_no, Error** error);
     81 
     82   // Terminates this session and disconnects its automation proxy. After
     83   // invoking this method, the Automation can safely be deleted.
     84   void Terminate();
     85 
     86   // Executes the given |script| in the specified frame of the current
     87   // tab. |result| will be set to the JSON result. Returns true on success.
     88   void ExecuteScript(const WebViewId& view_id,
     89                      const FramePath& frame_path,
     90                      const std::string& script,
     91                      std::string* result,
     92                      Error** error);
     93 
     94   // Sends a webkit key event to the current browser. Waits until the key has
     95   // been processed by the web page.
     96   void SendWebKeyEvent(const WebViewId& view_id,
     97                        const WebKeyEvent& key_event,
     98                        Error** error);
     99 
    100   // Sends a web mouse event to the given view. Waits until the event has
    101   // been processed by the view.
    102   void SendWebMouseEvent(const WebViewId& view_id,
    103                          const WebMouseEvent& event,
    104                          Error** error);
    105 
    106   // Drag and drop the file paths to the given location.
    107   void DragAndDropFilePaths(
    108       const WebViewId& view_id,
    109       const Point& location,
    110       const std::vector<base::FilePath::StringType>& paths,
    111       Error** error);
    112 
    113   // Captures a snapshot of the tab to the specified path.  The  PNG will
    114   // contain the entire page, including what is not in the current view
    115   // on the  screen.
    116   void CaptureEntirePageAsPNG(
    117       const WebViewId& view_id, const base::FilePath& path, Error** error);
    118 
    119 #if !defined(NO_TCMALLOC) && (defined(OS_LINUX) || defined(OS_CHROMEOS))
    120   // Dumps a heap profile of the process of the tab.
    121   void HeapProfilerDump(
    122       const WebViewId& view_id, const std::string& reason, Error** error);
    123 #endif  // !defined(NO_TCMALLOC) && (defined(OS_LINUX) || defined(OS_CHROMEOS))
    124 
    125   void NavigateToURL(
    126       const WebViewId& view_id, const std::string& url, Error** error);
    127   void NavigateToURLAsync(
    128       const WebViewId& view_id, const std::string& url, Error** error);
    129   void GoForward(const WebViewId& view_id, Error** error);
    130   void GoBack(const WebViewId& view_id, Error** error);
    131   void Reload(const WebViewId& view_id, Error** error);
    132 
    133   void GetCookies(const std::string& url,
    134                   scoped_ptr<base::ListValue>* cookies,
    135                   Error** error);
    136   void DeleteCookie(const std::string& url,
    137                     const std::string& cookie_name,
    138                     Error** error);
    139   void SetCookie(const std::string& url,
    140                  base::DictionaryValue* cookie_dict,
    141                  Error** error);
    142 
    143   // TODO(kkania): All of these mouse commands are deprecated and should be
    144   // removed when chrome build 1002 is no longer supported.
    145   // Use SendWebMouseEvent instead.
    146   void MouseMoveDeprecated(const WebViewId& view_id,
    147                            const Point& p,
    148                            Error** error);
    149   void MouseClickDeprecated(const WebViewId& view_id,
    150                             const Point& p,
    151                             automation::MouseButton button,
    152                             Error** error);
    153   void MouseDragDeprecated(const WebViewId& view_id,
    154                            const Point& start,
    155                            const Point& end,
    156                            Error** error);
    157   void MouseButtonDownDeprecated(const WebViewId& view_id,
    158                                  const Point& p,
    159                                  Error** error);
    160   void MouseButtonUpDeprecated(const WebViewId& view_id,
    161                                const Point& p,
    162                                Error** error);
    163   void MouseDoubleClickDeprecated(const WebViewId& view_id,
    164                                   const Point& p,
    165                                   Error** error);
    166 
    167   // Get info for all views currently open.
    168   void GetViews(std::vector<WebViewInfo>* views, Error** error);
    169 
    170   // Check if the given view exists currently.
    171   void DoesViewExist(const WebViewId& view_id, bool* does_exist, Error** error);
    172 
    173   // Closes the given view.
    174   void CloseView(const WebViewId& view_id, Error** error);
    175 
    176   // Sets the bounds for the given view. The position should be in screen
    177   // coordinates, while the size should be the desired size of the view.
    178   void SetViewBounds(const WebViewId& view_id,
    179                      const Rect& bounds,
    180                      Error** error);
    181 
    182   // Maximizes the given view.
    183   void MaximizeView(const WebViewId& view_id, Error** error);
    184 
    185   // Gets the active JavaScript modal dialog's message.
    186   void GetAppModalDialogMessage(std::string* message, Error** error);
    187 
    188   // Accepts or dismisses the active JavaScript modal dialog.
    189   void AcceptOrDismissAppModalDialog(bool accept, Error** error);
    190 
    191   // Accepts an active prompt JavaScript modal dialog, using the given
    192   // prompt text as the result of the prompt.
    193   void AcceptPromptAppModalDialog(const std::string& prompt_text,
    194                                   Error** error);
    195 
    196   // Gets the version of the runing browser.
    197   void GetBrowserVersion(std::string* version);
    198 
    199   // Gets the ChromeDriver automation version supported by the automation
    200   // server.
    201   void GetChromeDriverAutomationVersion(int* version, Error** error);
    202 
    203   // Waits for all views to stop loading.
    204   void WaitForAllViewsToStopLoading(Error** error);
    205 
    206   // Install a packed or unpacked extension. If the path ends with '.crx',
    207   // the extension is assumed to be packed.
    208   void InstallExtension(const base::FilePath& path, std::string* extension_id,
    209                         Error** error);
    210 
    211   // Gets a list of dictionary information about all installed extensions.
    212   void GetExtensionsInfo(base::ListValue* extensions_list, Error** error);
    213 
    214   // Gets a list of dictionary information about all installed extensions.
    215   void IsPageActionVisible(const WebViewId& tab_id,
    216                            const std::string& extension_id,
    217                            bool* is_visible,
    218                            Error** error);
    219 
    220   // Sets whether the extension is enabled or not.
    221   void SetExtensionState(const std::string& extension_id,
    222                          bool enable,
    223                          Error** error);
    224 
    225   // Clicks the extension action button. If |browser_action| is false, the
    226   // page action will be clicked.
    227   void ClickExtensionButton(const std::string& extension_id,
    228                             bool browser_action,
    229                             Error** error);
    230 
    231   // Uninstalls the given extension.
    232   void UninstallExtension(const std::string& extension_id, Error** error);
    233 
    234   // Set a local state preference, which is not associated with any profile.
    235   // Ownership of |value| is taken by this function.
    236   void SetLocalStatePreference(const std::string& pref,
    237                                base::Value* value,
    238                                Error** error);
    239 
    240   // Set a user preference, which is associated with the current profile.
    241   // Ownership of |value| is taken by this fucntion.
    242   void SetPreference(const std::string& pref,
    243                      base::Value* value,
    244                      Error** error);
    245 
    246   // Gets the current geolocation.
    247   void GetGeolocation(scoped_ptr<base::DictionaryValue>* geolocation,
    248                       Error** error);
    249 
    250   // Overrides the current geolocation.
    251   void OverrideGeolocation(const base::DictionaryValue* geolocation,
    252                            Error** error);
    253 
    254  private:
    255   AutomationProxy* automation() const;
    256   Error* ConvertViewIdToLocator(const WebViewId& view_id,
    257                                 WebViewLocator* view_locator);
    258   Error* DetermineBuildNumber();
    259   Error* CheckVersion(int min_required_build_no,
    260                       const std::string& error_msg);
    261   Error* CheckAlertsSupported();
    262   Error* CheckAdvancedInteractionsSupported();
    263   Error* CheckNewExtensionInterfaceSupported();
    264   Error* CheckGeolocationSupported();
    265   Error* CheckMaximizeSupported();
    266   Error* IsNewMouseApiSupported(bool* supports_new_api);
    267 
    268   const Logger& logger_;
    269   scoped_ptr<ProxyLauncher> launcher_;
    270   int build_no_;
    271   scoped_ptr<base::DictionaryValue> geolocation_;
    272 
    273   DISALLOW_COPY_AND_ASSIGN(Automation);
    274 };
    275 
    276 }  // namespace webdriver
    277 
    278 #endif  // CHROME_TEST_WEBDRIVER_WEBDRIVER_AUTOMATION_H_
    279