- add sources.
[platform/framework/web/crosswalk.git] / src / chrome_frame / tools / test / page_cycler / cf_cycler.py
1 #!/usr/bin/env python
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file.
5
6 """Automates IE to visit a list of web sites while running CF in full tab mode.
7
8 The page cycler automates IE and navigates it to a series of URLs. It is
9 designed to be run with Chrome Frame configured to load every URL inside
10 CF full tab mode.
11
12 TODO(robertshield): Make use of the python unittest module as per
13 review comments.
14 """
15
16 import optparse
17 import sys
18 import time
19 import win32com.client
20 import win32gui
21
22 def LoadSiteList(path):
23   """Loads a list of URLs from |path|.
24
25   Expects the URLs to be separated by newlines, with no leading or trailing
26   whitespace.
27
28   Args:
29     path: The path to a file containing a list of new-line separated URLs.
30
31   Returns:
32     A list of strings, each one a URL.
33   """
34   f = open(path)
35   urls = f.readlines()
36   f.close()
37   return urls
38
39 def LaunchIE():
40   """Starts up IE, makes it visible and returns the automation object.
41
42   Returns:
43     The IE automation object.
44   """
45   ie = win32com.client.Dispatch("InternetExplorer.Application")
46   ie.visible = 1
47   win32gui.SetForegroundWindow(ie.HWND)
48   return ie
49
50 def RunTest(url, ie):
51   """Loads |url| into the InternetExplorer.Application instance in |ie|.
52
53    Waits for the Document object to be created and then waits for
54    the document ready state to reach READYSTATE_COMPLETE.
55   Args:
56     url: A string containing the url to navigate to.
57     ie: The IE automation object to navigate.
58   """
59
60   print "Navigating to " + url
61   ie.Navigate(url)
62   timer = 0
63
64   READYSTATE_COMPLETE = 4
65
66   last_ready_state = -1
67   for retry in xrange(60):
68     try:
69       # TODO(robertshield): Become an event sink instead of polling for
70       # changes to the ready state.
71       last_ready_state = ie.Document.ReadyState
72       if last_ready_state == READYSTATE_COMPLETE:
73         break
74     except:
75       # TODO(robertshield): Find the precise exception related to ie.Document
76       # being not accessible and handle it here.
77       print "Unexpected error:", sys.exc_info()[0]
78       raise
79     time.sleep(1)
80
81   if last_ready_state != READYSTATE_COMPLETE:
82     print "Timeout waiting for " + url
83
84 def main():
85   parser = optparse.OptionParser()
86   parser.add_option('-u', '--url_list', default='urllist',
87                     help='The path to the list of URLs')
88   (opts, args) = parser.parse_args()
89
90   urls = LoadSiteList(opts.url_list)
91   ie = LaunchIE()
92   for url in urls:
93     RunTest(url, ie)
94     time.sleep(1)
95   ie.visible = 0
96   ie.Quit()
97
98
99 if __name__ == '__main__':
100   main()