Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 | 2 |
| 3 # Copyright (c) 2011 The Chromium Authors. All rights reserved. | 3 # Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
| 5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
| 6 | 6 |
| 7 """PyAuto: Python Interface to Chromium's Automation Proxy. | 7 """PyAuto: Python Interface to Chromium's Automation Proxy. |
| 8 | 8 |
| 9 PyAuto uses swig to expose Automation Proxy interfaces to Python. | 9 PyAuto uses swig to expose Automation Proxy interfaces to Python. |
| 10 For complete documentation on the functionality available, | 10 For complete documentation on the functionality available, |
| (...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 415 while timeout is None or time.time() - begin <= timeout: | 415 while timeout is None or time.time() - begin <= timeout: |
| 416 retval = function(*args) | 416 retval = function(*args) |
| 417 if (expect_retval is None and retval) or expect_retval == retval: | 417 if (expect_retval is None and retval) or expect_retval == retval: |
| 418 return True | 418 return True |
| 419 logging.debug('WaitUntil(%s) still waiting. ' | 419 logging.debug('WaitUntil(%s) still waiting. ' |
| 420 'Expecting %s. Last returned %s.' % ( | 420 'Expecting %s. Last returned %s.' % ( |
| 421 function, expect_retval, retval)) | 421 function, expect_retval, retval)) |
| 422 time.sleep(retry_sleep) | 422 time.sleep(retry_sleep) |
| 423 return False | 423 return False |
| 424 | 424 |
| 425 class CmdExecutionTimeoutChanger(object): | |
|
Nirnimesh
2011/03/29 20:27:28
Please let this be. Just change it to use action_t
Huyen
2011/03/31 02:42:55
Done. Also change class name to ActionTimeoutChang
| |
| 426 """Facilitate temporary changes to command_execution_timeout_ms. | |
| 427 | |
| 428 Automatically resets to original timeout when object is destroyed. | |
| 429 """ | |
| 430 _saved_timeout = -1 # Saved value for command_execution_timeout_ms | |
| 431 | |
| 432 def __init__(self, ui_test, new_timeout): | |
| 433 """Initialize. | |
| 434 | |
| 435 Args: | |
| 436 ui_test: a PyUITest object | |
| 437 new_timeout: new timeout to use (in milli secs) | |
| 438 """ | |
| 439 self._saved_timeout = ui_test.command_execution_timeout_ms() | |
| 440 if new_timeout != self._saved_timeout: | |
| 441 ui_test.set_command_execution_timeout_ms(new_timeout) | |
| 442 self._ui_test = ui_test | |
| 443 | |
| 444 def __del__(self): | |
| 445 """Reset command_execution_timeout_ms to original value.""" | |
| 446 if self._ui_test.command_execution_timeout_ms() != self._saved_timeout: | |
| 447 self._ui_test.set_command_execution_timeout_ms(self._saved_timeout) | |
| 448 | |
| 449 | 425 |
| 450 def _GetResultFromJSONRequest(self, cmd_dict, windex=0): | 426 def _GetResultFromJSONRequest(self, cmd_dict, windex=0): |
|
Nirnimesh
2011/03/29 20:27:28
Since the _GetResultFromJSONRequest below has a de
Huyen
2011/03/31 02:42:55
Good catch. Nope, removed.
| |
| 451 """Issue call over the JSON automation channel and fetch output. | 427 """Issue call over the JSON automation channel and fetch output. |
| 452 | 428 |
| 453 This method packages the given dictionary into a json string, sends it | 429 This method packages the given dictionary into a json string, sends it |
| 430 over the JSON automation channel, loads the json output string returned, | |
| 431 and returns it back as a dictionary. | |
| 432 | |
| 433 Args: | |
| 434 cmd_dict: the command dictionary. It must have a 'command' key | |
| 435 Sample: | |
| 436 { | |
| 437 'command': 'SetOmniboxText', | |
| 438 'text': text, | |
| 439 } | |
| 440 windex: 0-based window index on which to work. Default: 0 (first window) | |
| 441 Use -ve windex if the automation command does not apply to a | |
| 442 browser window. example: chromeos login | |
| 443 | |
| 444 Returns: | |
| 445 a dictionary for the output returned by the automation channel. | |
| 446 | |
| 447 Raises: | |
| 448 pyauto_errors.JSONInterfaceError if the automation call returns an error. | |
| 449 """ | |
| 450 return self._GetResultFromJSONRequest( | |
| 451 cmd_dict, windex, timeout=self.action_max_timeout_ms()) | |
| 452 | |
| 453 | |
| 454 def _GetResultFromJSONRequest(self, cmd_dict, windex=0, timeout=-1): | |
| 455 """Issue call over the JSON automation channel and fetch output. | |
| 456 | |
| 457 This method packages the given dictionary into a json string, sends it | |
| 454 over the JSON automation channel, loads the json output string returned, | 458 over the JSON automation channel, loads the json output string returned, |
| 455 and returns it back as a dictionary. | 459 and returns it back as a dictionary. |
| 456 | 460 |
| 457 Args: | 461 Args: |
| 458 cmd_dict: the command dictionary. It must have a 'command' key | 462 cmd_dict: the command dictionary. It must have a 'command' key |
| 459 Sample: | 463 Sample: |
| 460 { | 464 { |
| 461 'command': 'SetOmniboxText', | 465 'command': 'SetOmniboxText', |
| 462 'text': text, | 466 'text': text, |
| 463 } | 467 } |
| 464 windex: 0-based window index on which to work. Default: 0 (first window) | 468 windex: 0-based window index on which to work. Default: 0 (first window) |
| 465 Use -ve windex if the automation command does not apply to a | 469 Use -ve windex if the automation command does not apply to a |
| 466 browser window. example: chromeos login | 470 browser window. example: chromeos login |
| 467 | 471 |
| 472 timeout: request timeout | |
| 473 | |
| 468 Returns: | 474 Returns: |
| 469 a dictionary for the output returned by the automation channel. | 475 a dictionary for the output returned by the automation channel. |
| 470 | 476 |
| 471 Raises: | 477 Raises: |
| 472 pyauto_errors.JSONInterfaceError if the automation call returns an error. | 478 pyauto_errors.JSONInterfaceError if the automation call returns an error. |
| 473 """ | 479 """ |
| 474 ret_dict = json.loads(self._SendJSONRequest(windex, json.dumps(cmd_dict))) | 480 if timeout == -1: # Default |
| 481 timeout = self.action_max_timeout_ms() | |
| 482 ret_dict = json.loads(self._SendJSONRequest( | |
|
Nirnimesh
2011/03/29 20:27:28
move self._SendJSONRequest to the next line.
It'll
Huyen
2011/03/31 02:42:55
Done.
| |
| 483 windex, json.dumps(cmd_dict), timeout)) | |
| 475 if ret_dict.has_key('error'): | 484 if ret_dict.has_key('error'): |
| 476 raise JSONInterfaceError(ret_dict['error']) | 485 raise JSONInterfaceError(ret_dict['error']) |
| 477 return ret_dict | 486 return ret_dict |
| 478 | 487 |
| 479 def GetBookmarkModel(self): | 488 def GetBookmarkModel(self): |
| 480 """Return the bookmark model as a BookmarkModel object. | 489 """Return the bookmark model as a BookmarkModel object. |
| 481 | 490 |
| 482 This is a snapshot of the bookmark model; it is not a proxy and | 491 This is a snapshot of the bookmark model; it is not a proxy and |
| 483 does not get updated as the bookmark model changes. | 492 does not get updated as the bookmark model changes. |
| 484 """ | 493 """ |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 747 right key. It's useful to dump the preferences first to determine | 756 right key. It's useful to dump the preferences first to determine |
| 748 what type is expected for a particular preference path. | 757 what type is expected for a particular preference path. |
| 749 """ | 758 """ |
| 750 cmd_dict = { | 759 cmd_dict = { |
| 751 'command': 'SetPrefs', | 760 'command': 'SetPrefs', |
| 752 'path': path, | 761 'path': path, |
| 753 'value': value, | 762 'value': value, |
| 754 } | 763 } |
| 755 self._GetResultFromJSONRequest(cmd_dict) | 764 self._GetResultFromJSONRequest(cmd_dict) |
| 756 | 765 |
| 757 def WaitForAllDownloadsToComplete(self, windex=0): | 766 def WaitForAllDownloadsToComplete(self, windex=0): |
|
Nirnimesh
2011/03/29 20:27:28
The WaitForAllDownloadsToComplete below has a defa
Huyen
2011/03/31 02:42:55
Done.
| |
| 767 self.WaitForAllDownloads( | |
| 768 self, windex=0, timeout=self.action_max_timeout_ms()) | |
| 769 | |
| 770 def WaitForAllDownloadsToComplete(self, windex=0, timeout=-1): | |
| 758 """Wait for all downloads to complete. | 771 """Wait for all downloads to complete. |
| 759 | 772 |
| 760 Note: This method does not work for dangerous downloads. Use | 773 Note: This method does not work for dangerous downloads. Use |
| 761 WaitForGivenDownloadsToComplete (below) instead. | 774 WaitForGivenDownloadsToComplete (below) instead. |
| 762 """ | 775 """ |
| 776 if timeout == -1: # Default | |
|
Nirnimesh
2011/03/29 20:27:28
Why not just pass timeout ( = -1 ).
_GetResultFrom
Huyen
2011/03/31 02:42:55
Done.
| |
| 777 timeout = self.action_max_timeout_ms() | |
| 763 cmd_dict = {'command': 'WaitForAllDownloadsToComplete'} | 778 cmd_dict = {'command': 'WaitForAllDownloadsToComplete'} |
| 764 self._GetResultFromJSONRequest(cmd_dict, windex=windex) | 779 self._GetResultFromJSONRequest(cmd_dict, windex=windex, timeout=timeout) |
| 765 | 780 |
| 766 def WaitForDownloadToComplete(self, download_path, timeout=-1): | 781 def WaitForDownloadToComplete(self, download_path, timeout=-1): |
| 767 """Wait for the given downloads to complete. | 782 """Wait for the given downloads to complete. |
| 768 | 783 |
| 769 This method works for dangerous downloads as well as regular downloads. | 784 This method works for dangerous downloads as well as regular downloads. |
| 770 | 785 |
| 771 Args: | 786 Args: |
| 772 download_path: The path to the final download. This is only necessary for | 787 download_path: The path to the final download. This is only necessary for |
| 773 the workaround described in the comments below and should | 788 the workaround described in the comments below and should |
| 774 be removed when downloads are re-implemented. | 789 be removed when downloads are re-implemented. |
| (...skipping 2009 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2784 if self._options.verbose: | 2799 if self._options.verbose: |
| 2785 verbosity = 2 | 2800 verbosity = 2 |
| 2786 result = PyAutoTextTestRuner(verbosity=verbosity).run(pyauto_suite) | 2801 result = PyAutoTextTestRuner(verbosity=verbosity).run(pyauto_suite) |
| 2787 del loaded_tests # Need to destroy test cases before the suite | 2802 del loaded_tests # Need to destroy test cases before the suite |
| 2788 del pyauto_suite | 2803 del pyauto_suite |
| 2789 sys.exit(not result.wasSuccessful()) | 2804 sys.exit(not result.wasSuccessful()) |
| 2790 | 2805 |
| 2791 | 2806 |
| 2792 if __name__ == '__main__': | 2807 if __name__ == '__main__': |
| 2793 Main() | 2808 Main() |
| OLD | NEW |