diff options
author | nirnimesh@chromium.org <nirnimesh@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-01-21 23:23:12 +0000 |
---|---|---|
committer | nirnimesh@chromium.org <nirnimesh@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-01-21 23:23:12 +0000 |
commit | c5647608aaf50455dc0b41b8e9f03e597589d76c (patch) | |
tree | c4ab2e971161e92188b1b8543a4d859c76586f52 /chrome/test/pyautolib | |
parent | 9e42ad6261487d76b9336d7417361ee9de515adc (diff) | |
download | chromium_src-c5647608aaf50455dc0b41b8e9f03e597589d76c.zip chromium_src-c5647608aaf50455dc0b41b8e9f03e597589d76c.tar.gz chromium_src-c5647608aaf50455dc0b41b8e9f03e597589d76c.tar.bz2 |
PyAuto: Python Interface to Chromium's Automation Proxy.
PyAuto is a python interface to chromium's automation framework. It exposes
some of the Automation Proxy functions in Python. This can be used to play
around with chromium, or automate functional tests.
SWIG is used to bridge Automation Proxy's C++ to Python.
This CL addresses Mac-only to begin with. I'll be adding win/linux shortly.
Also, this CL breaks down UITest class into parts that does not use gtest
(UITestBase) and parts that does (UITest). UITestBase is used by pyauto.
BUG=32283
TEST=None
Review URL: http://codereview.chromium.org/555022
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@36808 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/test/pyautolib')
-rw-r--r-- | chrome/test/pyautolib/pyauto.py | 74 | ||||
-rw-r--r-- | chrome/test/pyautolib/pyautolib.cc | 74 | ||||
-rw-r--r-- | chrome/test/pyautolib/pyautolib.h | 54 | ||||
-rw-r--r-- | chrome/test/pyautolib/pyautolib.i | 63 |
4 files changed, 265 insertions, 0 deletions
diff --git a/chrome/test/pyautolib/pyauto.py b/chrome/test/pyautolib/pyauto.py new file mode 100644 index 0000000..66abdc9 --- /dev/null +++ b/chrome/test/pyautolib/pyauto.py @@ -0,0 +1,74 @@ +#!/usr/bin/python + +# Copyright (c) 2010 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. + +"""PyAuto: Python Interface to Chromium's Automation Proxy. + +PyAuto uses swig to expose Automation Proxy interfaces to Python. +For complete documentation on the functionality available, +run pydoc on this file. + +Ref: http://dev.chromium.org/developers/pyauto +""" + +import os +import sys +import unittest + + +def _LocateBinDirs(): + script_dir = os.path.dirname(__file__) + chrome_src = os.path.join(script_dir, os.pardir, os.pardir, os.pardir) + + # TODO(nirnimesh): Expand this to include win/linux build dirs + # crbug.com/32285 + bin_dirs = [ os.path.join(chrome_src, 'xcodebuild', 'Debug'), + os.path.join(chrome_src, 'xcodebuild', 'Release'), + ] + for d in bin_dirs: + sys.path.append(os.path.normpath(d)) + +_LocateBinDirs() + +try: + from pyautolib import PyUITestSuite +except ImportError: + print >>sys.stderr, "Could not locate built libraries. Did you build?" + raise + + +class PyUITest(PyUITestSuite, unittest.TestCase): + """Base class for UI Test Cases in Python. + + A browser is created before executing each test, and is destroyed after + each test irrespective of whether the test passed or failed. + + You should derive from this class and create methods with 'test' prefix, + and use methods inherited from PyUITestSuite (the C++ side). + + Example: + + class MyTest(PyUITest): + + def testNavigation(self): + self.NavigateToURL("http://www.google.com") + self.assertTrue("Google" == self.GetActiveTabTitle()) + """ + + def __init__(self, methodName='runTest'): + PyUITestSuite.__init__(self, sys.argv) + unittest.TestCase.__init__(self, methodName) + + def __del__(self): + PyUITestSuite.__del__(self) + + def run(self, result=None): + """The main run method. + + We override this method to make calls to the setup steps in PyUITestSuite. + """ + self.SetUp() # Open a browser window + unittest.TestCase.run(self, result) + self.TearDown() # Destroy the browser window diff --git a/chrome/test/pyautolib/pyautolib.cc b/chrome/test/pyautolib/pyautolib.cc new file mode 100644 index 0000000..a891e8e --- /dev/null +++ b/chrome/test/pyautolib/pyautolib.cc @@ -0,0 +1,74 @@ +// Copyright (c) 2010 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. + +#include "base/scoped_ptr.h" +#include "chrome/test/automation/tab_proxy.h" +#include "chrome/test/pyautolib/pyautolib.h" +#include "googleurl/src/gurl.h" + +PyUITestSuite::PyUITestSuite(int argc, char** argv) + : UITestSuite(argc, argv), + UITestBase() { + UITestSuite::Initialize(); +} + +PyUITestSuite::~PyUITestSuite() { + UITestSuite::Shutdown(); +} + +void PyUITestSuite::SetUp() { + UITestBase::SetUp(); +} + +void PyUITestSuite::TearDown() { + UITestBase::TearDown(); +} + +void PyUITestSuite::NavigateToURL(const char* url_string) { + GURL url(url_string); + UITestBase::NavigateToURL(url); +} + +void PyUITestSuite::SetShelfVisible(bool is_visible) { + scoped_refptr<BrowserProxy> browser_proxy = automation()->GetBrowserWindow(0); + ASSERT_TRUE(browser_proxy.get()); + EXPECT_TRUE(browser_proxy->SetShelfVisible(is_visible)); +} + +bool PyUITestSuite::IsShelfVisible() { + scoped_refptr<BrowserProxy> browser_proxy = automation()->GetBrowserWindow(0); + EXPECT_TRUE(browser_proxy.get()); + if (!browser_proxy.get()) + return false; + bool visible = false; + EXPECT_TRUE(browser_proxy->IsShelfVisible(&visible)); + return visible; +} + +std::wstring PyUITestSuite::GetActiveTabTitle() { + std::wstring title; + scoped_refptr<TabProxy> tab_proxy(GetActiveTab()); + EXPECT_TRUE(tab_proxy.get()); + if (!tab_proxy.get()) + return title; + EXPECT_TRUE(tab_proxy->GetTabTitle(&title)); + return title; +} + +void PyUITestSuite::OpenFindInPage() { + scoped_refptr<BrowserProxy> browser_proxy = automation()->GetBrowserWindow(0); + ASSERT_TRUE(browser_proxy.get()); + EXPECT_TRUE(browser_proxy->OpenFindInPage()); +} + +bool PyUITestSuite::IsFindInPageVisible() { + scoped_refptr<BrowserProxy> browser_proxy = automation()->GetBrowserWindow(0); + EXPECT_TRUE(browser_proxy.get()); + if (!browser_proxy.get()) + return false; + bool is_visible; + EXPECT_TRUE(browser_proxy->IsFindWindowFullyVisible(&is_visible)); + return is_visible; +} + diff --git a/chrome/test/pyautolib/pyautolib.h b/chrome/test/pyautolib/pyautolib.h new file mode 100644 index 0000000..04fe7a8 --- /dev/null +++ b/chrome/test/pyautolib/pyautolib.h @@ -0,0 +1,54 @@ +// Copyright (c) 2010 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. +// +// This file declares the C++ side of PyAuto, the python interface to +// Chromium automation. It access Chromium's internals using Automation Proxy. + +#ifndef CHROME_TEST_PYAUTOLIB_PYAUTOLIB_H_ +#define CHROME_TEST_PYAUTOLIB_PYAUTOLIB_H_ + +#include "base/scoped_nsautorelease_pool.h" +#include "chrome/test/ui/ui_test.h" +#include "chrome/test/ui/ui_test_suite.h" + +// TODO(nirnimesh): separate out the UITestSuite and UITestBase parts +// crbug.com/32292 + +// The primary class that interfaces with Automation Proxy. +// This class is accessed from python using swig. +class PyUITestSuite : public UITestSuite, public UITestBase { + public: + // Only public methods are accessible from swig. + PyUITestSuite(int argc, char** argv); + ~PyUITestSuite(); + + // SetUp,TearDown is redeclared as public to make it accessible from swig. + virtual void SetUp(); + virtual void TearDown(); + + void NavigateToURL(const char* url_string); + + // Get the title of the active tab. Empty string in case of error. + std::wstring GetActiveTabTitle(); + + // BrowserProxy methods + + // Shows or hides the download shelf. + void SetShelfVisible(bool is_visible); + + // Determines the visibility of the download shelf + bool IsShelfVisible(); + + // Open the Find box + void OpenFindInPage(); + + // Determines the visibility of the Find box + bool IsFindInPageVisible(); + + private: + base::ScopedNSAutoreleasePool pool_; +}; + +#endif // CHROME_TEST_PYAUTOLIB_PYAUTOLIB_H_ + diff --git a/chrome/test/pyautolib/pyautolib.i b/chrome/test/pyautolib/pyautolib.i new file mode 100644 index 0000000..83854c0 --- /dev/null +++ b/chrome/test/pyautolib/pyautolib.i @@ -0,0 +1,63 @@ +// Copyright (c) 2010 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. +// +// Swig Interface for PyAuto. +// PyAuto makes the Automation Proxy interface available in Python +// +// Running swig as: +// swig -python -c++ chrome/test/pyautolib/pyautolib.i +// would generate pyautolib.py, pyautolib_wrap.cxx + +%module pyautolib + +%include "std_string.i" +%include "std_wstring.i" + +%{ +#include "chrome/test/pyautolib/pyautolib.h" +%} + +// Make functions using (int argc, char** argv) usable as (sys.argv) from python +%typemap(in) (int argc, char **argv) { + int i; + if (!PyList_Check($input)) { + PyErr_SetString(PyExc_ValueError, "Expecting a list"); + return NULL; + } + $1 = PyList_Size($input); + $2 = (char **) malloc(($1+1)*sizeof(char *)); + for (i = 0; i < $1; i++) { + PyObject *s = PyList_GetItem($input,i); + if (!PyString_Check(s)) { + free($2); + PyErr_SetString(PyExc_ValueError, "List items must be strings"); + return NULL; + } + $2[i] = PyString_AsString(s); + } + $2[i] = 0; +} + +%typemap(freearg) (int argc, char **argv) { + if ($2) free($2); +} + + +// TODO(nirnimesh): Fill in the autodoc constructs - crbug.com/32287 +class PyUITestSuite { + public: + PyUITestSuite(int argc, char** argv); + + virtual void SetUp(); + virtual void TearDown(); + + void NavigateToURL(const char* url_string); + std::wstring GetActiveTabTitle(); + + // BrowserProxy methods + void SetShelfVisible(bool is_visible); + bool IsShelfVisible(); + void OpenFindInPage(); + bool IsFindInPageVisible(); +}; |