blob: 6848ae2cd65337f3567d09a64b0ae23306e8e955 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_TEST_WEBDRIVER_WEBDRIVER_AUTOMATION_H_
#define CHROME_TEST_WEBDRIVER_WEBDRIVER_AUTOMATION_H_
#include <map>
#include <string>
#include <vector>
#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "chrome/common/automation_constants.h"
#include "chrome/test/webdriver/webdriver_logging.h"
#include "ui/base/keycodes/keyboard_codes.h"
class AutomationId;
class AutomationProxy;
class ProxyLauncher;
struct WebKeyEvent;
struct WebMouseEvent;
class WebViewId;
struct WebViewInfo;
class WebViewLocator;
namespace base {
class DictionaryValue;
class ListValue;
class Value;
}
namespace webdriver {
class Error;
class FramePath;
class Point;
class Rect;
// Creates and controls the Chrome instance.
// This class should be created and accessed on a single thread.
// Note: All member functions are void because they are invoked
// by posting a task.
class Automation {
public:
struct BrowserOptions {
BrowserOptions();
~BrowserOptions();
// The command line to use for launching the browser. If no program is
// specified, the default browser executable will be used.
CommandLine command;
// The user data directory to be copied and used. If empty, a temporary
// directory will be used.
base::FilePath user_data_dir;
// The channel ID of an already running browser to connect to. If empty,
// the browser will be launched with an anonymous channel.
std::string channel_id;
// True if the Chrome process should only be terminated if quit is called.
// If false, Chrome will also be terminated if this process is killed or
// shutdown.
bool detach_process;
// True if the browser should ignore certificate related errors.
bool ignore_certificate_errors;
// Set of switches to be excluded from default list when starting Chrome.
std::set<std::string> exclude_switches;
};
explicit Automation(const Logger& logger);
virtual ~Automation();
// Start the system's default Chrome binary.
void Init(const BrowserOptions& options, int* build_no, Error** error);
// Terminates this session and disconnects its automation proxy. After
// invoking this method, the Automation can safely be deleted.
void Terminate();
// Executes the given |script| in the specified frame of the current
// tab. |result| will be set to the JSON result. Returns true on success.
void ExecuteScript(const WebViewId& view_id,
const FramePath& frame_path,
const std::string& script,
std::string* result,
Error** error);
// Sends a webkit key event to the current browser. Waits until the key has
// been processed by the web page.
void SendWebKeyEvent(const WebViewId& view_id,
const WebKeyEvent& key_event,
Error** error);
// Sends a web mouse event to the given view. Waits until the event has
// been processed by the view.
void SendWebMouseEvent(const WebViewId& view_id,
const WebMouseEvent& event,
Error** error);
// Drag and drop the file paths to the given location.
void DragAndDropFilePaths(
const WebViewId& view_id,
const Point& location,
const std::vector<base::FilePath::StringType>& paths,
Error** error);
// Captures a snapshot of the tab to the specified path. The PNG will
// contain the entire page, including what is not in the current view
// on the screen.
void CaptureEntirePageAsPNG(
const WebViewId& view_id, const base::FilePath& path, Error** error);
#if !defined(NO_TCMALLOC) && (defined(OS_LINUX) || defined(OS_CHROMEOS))
// Dumps a heap profile of the process of the tab.
void HeapProfilerDump(
const WebViewId& view_id, const std::string& reason, Error** error);
#endif // !defined(NO_TCMALLOC) && (defined(OS_LINUX) || defined(OS_CHROMEOS))
void NavigateToURL(
const WebViewId& view_id, const std::string& url, Error** error);
void NavigateToURLAsync(
const WebViewId& view_id, const std::string& url, Error** error);
void GoForward(const WebViewId& view_id, Error** error);
void GoBack(const WebViewId& view_id, Error** error);
void Reload(const WebViewId& view_id, Error** error);
void GetCookies(const std::string& url,
scoped_ptr<base::ListValue>* cookies,
Error** error);
void DeleteCookie(const std::string& url,
const std::string& cookie_name,
Error** error);
void SetCookie(const std::string& url,
base::DictionaryValue* cookie_dict,
Error** error);
// TODO(kkania): All of these mouse commands are deprecated and should be
// removed when chrome build 1002 is no longer supported.
// Use SendWebMouseEvent instead.
void MouseMoveDeprecated(const WebViewId& view_id,
const Point& p,
Error** error);
void MouseClickDeprecated(const WebViewId& view_id,
const Point& p,
automation::MouseButton button,
Error** error);
void MouseDragDeprecated(const WebViewId& view_id,
const Point& start,
const Point& end,
Error** error);
void MouseButtonDownDeprecated(const WebViewId& view_id,
const Point& p,
Error** error);
void MouseButtonUpDeprecated(const WebViewId& view_id,
const Point& p,
Error** error);
void MouseDoubleClickDeprecated(const WebViewId& view_id,
const Point& p,
Error** error);
// Get info for all views currently open.
void GetViews(std::vector<WebViewInfo>* views, Error** error);
// Check if the given view exists currently.
void DoesViewExist(const WebViewId& view_id, bool* does_exist, Error** error);
// Closes the given view.
void CloseView(const WebViewId& view_id, Error** error);
// Sets the bounds for the given view. The position should be in screen
// coordinates, while the size should be the desired size of the view.
void SetViewBounds(const WebViewId& view_id,
const Rect& bounds,
Error** error);
// Maximizes the given view.
void MaximizeView(const WebViewId& view_id, Error** error);
// Gets the active JavaScript modal dialog's message.
void GetAppModalDialogMessage(std::string* message, Error** error);
// Accepts or dismisses the active JavaScript modal dialog.
void AcceptOrDismissAppModalDialog(bool accept, Error** error);
// Accepts an active prompt JavaScript modal dialog, using the given
// prompt text as the result of the prompt.
void AcceptPromptAppModalDialog(const std::string& prompt_text,
Error** error);
// Gets the version of the runing browser.
void GetBrowserVersion(std::string* version);
// Gets the ChromeDriver automation version supported by the automation
// server.
void GetChromeDriverAutomationVersion(int* version, Error** error);
// Waits for all views to stop loading.
void WaitForAllViewsToStopLoading(Error** error);
// Install a packed or unpacked extension. If the path ends with '.crx',
// the extension is assumed to be packed.
void InstallExtension(const base::FilePath& path, std::string* extension_id,
Error** error);
// Gets a list of dictionary information about all installed extensions.
void GetExtensionsInfo(base::ListValue* extensions_list, Error** error);
// Gets a list of dictionary information about all installed extensions.
void IsPageActionVisible(const WebViewId& tab_id,
const std::string& extension_id,
bool* is_visible,
Error** error);
// Sets whether the extension is enabled or not.
void SetExtensionState(const std::string& extension_id,
bool enable,
Error** error);
// Clicks the extension action button. If |browser_action| is false, the
// page action will be clicked.
void ClickExtensionButton(const std::string& extension_id,
bool browser_action,
Error** error);
// Uninstalls the given extension.
void UninstallExtension(const std::string& extension_id, Error** error);
// Set a local state preference, which is not associated with any profile.
// Ownership of |value| is taken by this function.
void SetLocalStatePreference(const std::string& pref,
base::Value* value,
Error** error);
// Set a user preference, which is associated with the current profile.
// Ownership of |value| is taken by this fucntion.
void SetPreference(const std::string& pref,
base::Value* value,
Error** error);
// Gets the current geolocation.
void GetGeolocation(scoped_ptr<base::DictionaryValue>* geolocation,
Error** error);
// Overrides the current geolocation.
void OverrideGeolocation(const base::DictionaryValue* geolocation,
Error** error);
private:
AutomationProxy* automation() const;
Error* ConvertViewIdToLocator(const WebViewId& view_id,
WebViewLocator* view_locator);
Error* DetermineBuildNumber();
Error* CheckVersion(int min_required_build_no,
const std::string& error_msg);
Error* CheckAlertsSupported();
Error* CheckAdvancedInteractionsSupported();
Error* CheckNewExtensionInterfaceSupported();
Error* CheckGeolocationSupported();
Error* CheckMaximizeSupported();
Error* IsNewMouseApiSupported(bool* supports_new_api);
const Logger& logger_;
scoped_ptr<ProxyLauncher> launcher_;
int build_no_;
scoped_ptr<base::DictionaryValue> geolocation_;
DISALLOW_COPY_AND_ASSIGN(Automation);
};
} // namespace webdriver
#endif // CHROME_TEST_WEBDRIVER_WEBDRIVER_AUTOMATION_H_