OLD | NEW |
| (Empty) |
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() | |
OLD | NEW |