Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(646)

Unified Diff: tools/testing/webdriver_test_setup.py

Issue 11232026: Add Opera to the "webdriver_test_setup" script. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/testing/webdriver_test_setup.py
===================================================================
--- tools/testing/webdriver_test_setup.py (revision 13701)
+++ tools/testing/webdriver_test_setup.py (working copy)
@@ -12,11 +12,13 @@
# TODO(efortuna): Rewrite this script in Dart when the Process module has a
# better high level API.
+import HTMLParser
import optparse
import os
import platform
import re
import shutil
+import string
import subprocess
import sys
import urllib
@@ -40,6 +42,8 @@
parser = optparse.OptionParser()
parser.add_option('--firefox', '-f', dest='firefox',
help="Don't install Firefox", action='store_true', default=False)
+ parser.add_option('--opera', '-o', dest='opera', default=False,
+ help="Don't install Opera", action='store_true')
parser.add_option('--chromedriver', '-c', dest='chromedriver',
help="Don't install chromedriver.", action='store_true', default=False)
parser.add_option('--iedriver', '-i', dest='iedriver',
@@ -54,7 +58,7 @@
parser.add_option('--buildbot', '-b', dest='buildbot', action='store_true',
help='Perform a buildbot selenium setup (buildbots have a different' +
'location for their python executable).', default=False)
- args, ignored = parser.parse_args()
+ args, _ = parser.parse_args()
return args
def find_depot_tools_location(is_buildbot):
@@ -273,6 +277,114 @@
run_cmd('%s %s' % (admin_keyword, python_cmd), page.read())
run_cmd('%s %s install -U selenium' % (admin_keyword, pip_cmd))
+class OperaHtmlParser(HTMLParser.HTMLParser):
+ """A helper class to parse Opera pages listing available downloads to find the
+ correct download we want."""
+
+ def initialize(self, rejection_func, accept_func):
+ """Initialize some state for our parser.
+ Arguments:
+ rejection_func: A function that accepts the value of the URL and determines
+ if it is of the type we are looking for.
+ accept_func: A function that takes the URL and the "current best" URL and
+ determines if it is better than our current download url."""
+ self.latest = 0
+ self.rejection_func = rejection_func
+ self.accept_func = accept_func
+
+ def handle_starttag(self, tag, attrs):
+ """Find the latest version."""
+ if (tag == 'a' and attrs[0][0] == 'href' and
+ self.rejection_func(attrs[0][1])):
+ self.latest = self.better_func(attrs[0][1], self.latest)
+
+class OperaInstaller(object):
+ """Install from the Opera FTP website."""
+
+ def find_latest_version(self, download_page, rejection_func, accept_func):
+ """Get the latest non-beta version.
+ Arguments:
+ download_page: The initial page that lists all the download options.
+ rejection_func: A function that accepts the value of the URL and determines
+ if it is of the type we are looking for.
+ accept_func: A function that takes the URL and the "current best" URL and
+ determines if it is better than our current download url."""
+ f = urllib2.urlopen(download_page)
+ parser = OperaHtmlParser()
+ parser.initialize(rejection_func, accept_func)
+ parser.feed(f.read())
+ return str(parser.latest)
+
+ def run(self):
+ """Download and install Opera."""
+ print 'Installing Opera'
+ os_str = self.get_os_str
+ download_name = 'http://ftp.opera.com/pub/opera/%s/' % os_str
+
+ def higher_revision(new_version_str, current):
+ version_string = new_version_str[:-1]
+ if int(version_string) > current:
+ return int(version_string)
+ return current
+
+ version = self.find_latest_version(
+ download_name,
+ lambda x: x[0] in string.digits and 'b' not in x and 'rc' not in x,
+ higher_revision)
+ download_name += version
+ if ('linux' in sys.platform and
+ platform.linux_distribution()[0] == 'Ubuntu'):
+ # Last time I tried, the .deb file you download directly from opera was
+ # not installing correctly on Ubuntu. This installs Opera more nicely.
+ os.system("sudo sh -c 'wget -O - http://deb.opera.com/archive.key | "
+ "apt-key add -'")
+ os.system("""sudo sh -c 'echo "deb http://deb.opera.com/opera/ """
+ """stable non-free" > /etc/apt/sources.list.d/opera.list'""")
+ run_cmd('sudo apt-get update')
+ run_cmd('sudo apt-get install opera', stdin='y')
+ else:
+ if 'darwin' in sys.platform:
+ dotted_version = '%s.%s' % (version[:2], version[2:])
+ download_name += '/Opera_%s_Setup_Intel.dmg' % dotted_version
+ urllib.urlretrieve(download_name, 'opera.dmg')
+ run_cmd('hdiutil mount opera.dmg', stdin='qY\n')
+ run_cmd('sudo cp -R /Volumes/Opera/Opera.app /Applications')
+ run_cmd('hdiutil unmount /Volumes/Opera/')
+ elif 'win' in sys.platform:
+ download_name += '/en/Opera_%s_en_Setup.exe' % version
+ urllib.urlretrieve(download_name, 'opera_install.exe')
+ run_cmd('opera_install.exe -ms')
+ else:
+ # For all other flavors of linux, download the tar.
+ download_name += '/'
+ extension = '.tar.bz2'
+ if '64bit' in platform.architecture()[0]:
+ platform_str = '.x86_64'
+ else:
+ platform_str = '.i386'
+ def get_acceptable_file(new_version_str, current):
+ return new_version_str
+ latest = self.find_latest_version(
+ download_name,
+ lambda x: x.startswith('opera') and x.endswith(extension)
+ and platform_str in x,
+ get_acceptable_file)
+ download_name += latest
+ run_cmd('wget -O - %s | tar -C ~ -jxv' % download_name)
+ print ('PLEASE MANUALLY RUN "~/%s/install" TO COMPLETE OPERA '
+ 'INSTALLATION' %
+ download_name[download_name.rfind('/') + 1:-len(extension)])
+
+ @property
+ def get_os_str(self):
+ """The strings to indicate what OS a download is."""
+ os_str = 'win'
+ if 'darwin' in sys.platform:
+ os_str = 'mac'
+ elif 'linux' in sys.platform:
+ os_str = 'linux'
+ return os_str
+
def main():
args = parse_args()
if not args.python:
@@ -287,9 +399,10 @@
if not args.iedriver and platform.system() == 'Windows':
GoogleCodeInstaller('selenium', find_depot_tools_location(args.buildbot),
lambda x: 'IEDriverServer_Win32_%(version)s.zip' % x).run()
-
if not args.firefox:
FirefoxInstaller().run()
+ if not args.opera:
+ OperaInstaller().run()
if __name__ == '__main__':
main()
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698