1# Copyright 2013 The Chromium Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5import logging 6 7from telemetry.core import bitmap 8 9 10class WebDriverTabBackend(object): 11 def __init__(self, browser_backend, window_handle): 12 self._browser_backend = browser_backend 13 self._window_handle = window_handle 14 15 @property 16 def browser(self): 17 return self._browser_backend.browser 18 19 @property 20 def window_handle(self): 21 return self._window_handle 22 23 @property 24 def url(self): 25 self._browser_backend.driver.switch_to_window(self._window_handle) 26 return self._browser_backend.driver.current_url 27 28 def Activate(self): 29 # Webdriver doesn't support tab control. 30 raise NotImplementedError() 31 32 def Close(self): 33 self._browser_backend.driver.switch_to_window(self._window_handle) 34 self._browser_backend.driver.close() 35 36 def WaitForDocumentReadyStateToBeComplete(self, timeout=None): 37 # TODO(chrisgao): Double check of document state. 38 pass 39 40 def WaitForDocumentReadyStateToBeInteractiveOrBetter(self, timeout=None): 41 # TODO(chrisgao): Double check of document state. 42 pass 43 44 @property 45 def screenshot_supported(self): 46 return True 47 48 def Screenshot(self, timeout=None): # pylint: disable=W0613 49 if timeout: 50 logging.warning('timeout is not supported') 51 self._browser_backend.driver.switch_to_window(self._window_handle) 52 snap = self._browser_backend.driver.get_screenshot_as_base64() 53 if snap: 54 return bitmap.Bitmap.FromPng(snap) 55 return None 56 57 @property 58 def message_output_stream(self): 59 # Webdriver has no API for grabbing console messages. 60 raise NotImplementedError() 61 62 @message_output_stream.setter 63 def message_output_stream(self, stream): 64 raise NotImplementedError() 65 66 def GetDOMStats(self, timeout=None): 67 # Webdriver has no API for DOM status. 68 raise NotImplementedError() 69 70 def WaitForNavigate(self): 71 raise NotImplementedError() 72 73 def Navigate(self, url, script_to_evaluate_on_commit=None, timeout=None): 74 if script_to_evaluate_on_commit: 75 raise NotImplementedError('script_to_evaluate_on_commit is NOT supported') 76 self._browser_backend.driver.switch_to_window(self._window_handle) 77 if timeout: 78 self._browser_backend.driver.set_page_load_timeout(timeout * 1000) 79 self._browser_backend.driver.get(url) 80 81 def GetCookieByName(self, name, timeout=None): 82 if timeout: 83 logging.warning('timeout is not supported') 84 self._browser_backend.driver.switch_to_window(self._window_handle) 85 cookie = self._browser_backend.driver.get_cookie(name) 86 if cookie: 87 return cookie['value'] 88 return None 89 90 def ExecuteJavaScript(self, expr, timeout=None): 91 self._browser_backend.driver.switch_to_window(self._window_handle) 92 if timeout: 93 logging.warning('timeout is not supported') 94 self._browser_backend.driver.execute_script(expr) 95 96 def EvaluateJavaScript(self, expr, timeout=None): 97 self._browser_backend.driver.switch_to_window(self._window_handle) 98 if timeout: 99 logging.warning('timeout is not supported') 100 return self._browser_backend.driver.execute_script( 101 'return eval(\'%s\')' % expr.replace('\'', '\\\'').replace('\n', ' ')) 102 103 @property 104 def timeline_model(self): 105 # IE/Firefox has no timeline. 106 raise NotImplementedError() 107 108 @property 109 def id(self): 110 raise NotImplementedError() 111 112 def StartTimelineRecording(self): 113 raise NotImplementedError() 114 115 def StopTimelineRecording(self): 116 raise NotImplementedError() 117 118 def ClearCache(self): 119 # Can't find a way to clear cache of a tab in IE/Firefox. 120 raise NotImplementedError() 121