4040
4141class WebBot (BaseBot ):
4242 KEYS = Keys
43+ DEFAULT_DIMENSIONS = (1600 , 900 )
4344 """
4445 Base class for Web Bots.
4546 Users must implement the `action` method in their classes.
@@ -72,7 +73,6 @@ def __init__(self, headless=False):
7273 # State for Key modifiers
7374 self ._shift_hold = False
7475
75- self ._dimensions = (1600 , 900 )
7676 self ._download_folder_path = os .getcwd ()
7777
7878 @property
@@ -255,18 +255,18 @@ def set_screen_resolution(self, width=None, height=None):
255255 width (int): The desired width.
256256 height (int): The desired height.
257257 """
258- self . _dimensions = (width or 1600 , height or 900 )
258+ dimensions = (width or self . DEFAULT_DIMENSIONS [ 0 ] , height or self . DEFAULT_DIMENSIONS [ 1 ] )
259259
260260 if self .headless :
261261 # When running headless the window size is the viewport size
262- window_size = self . _dimensions
262+ window_size = dimensions
263263 else :
264264 # When running non-headless we need to account for the borders and etc
265265 # So the size must be bigger to have the same viewport size as before
266266 window_size = self ._driver .execute_script ("""
267267 return [window.outerWidth - window.innerWidth + arguments[0],
268268 window.outerHeight - window.innerHeight + arguments[1]];
269- """ , * self . _dimensions )
269+ """ , * dimensions )
270270 self ._driver .set_window_size (* window_size )
271271
272272 def _webdriver_command (self , command , params = None , req_type = "POST" ):
@@ -312,13 +312,14 @@ def get_screen_image(self, region=None):
312312 if not region :
313313 region = (0 , 0 , 0 , 0 )
314314
315- x = region [0 ] or 0
316- y = region [1 ] or 0
317- width = region [2 ] or self ._dimensions [0 ]
318- height = region [3 ] or self ._dimensions [1 ]
319315 data = self ._driver .get_screenshot_as_base64 ()
320316 image_data = base64 .b64decode (data )
321317 img = Image .open (io .BytesIO (image_data ))
318+
319+ x = region [0 ]
320+ y = region [1 ]
321+ width = region [2 ] or self ._get_page_size ()[0 ]
322+ height = region [3 ] or self ._get_page_size ()[1 ]
322323 img = img .crop ((x , y , x + width , y + height ))
323324 return img
324325
@@ -335,6 +336,21 @@ def get_viewport_size(self):
335336 height = self ._driver .get_window_size ().get ("height" )
336337 return width , height
337338
339+ def _get_page_size (self ):
340+ """
341+ Returns the browser current page size.
342+
343+ Returns:
344+ width (int): The current page width.
345+ height (int): The current page height.
346+ """
347+ if not self ._driver :
348+ return self .DEFAULT_DIMENSIONS
349+
350+ width = self .execute_javascript ("return window.innerWidth" )
351+ height = self .execute_javascript ("return window.innerHeight" )
352+ return width , height
353+
338354 def add_image (self , label , path ):
339355 """
340356 Add an image into the state image map.
@@ -391,7 +407,7 @@ def find_multiple(self, labels, x=None, y=None, width=None, height=None, *,
391407 def _to_dict (lbs , elems ):
392408 return {k : v for k , v in zip (lbs , elems )}
393409
394- screen_w , screen_h = self ._dimensions
410+ screen_w , screen_h = self ._get_page_size ()
395411 x = x or 0
396412 y = y or 0
397413 w = width or screen_w
@@ -492,7 +508,7 @@ def find_until(self, label, x=None, y=None, width=None, height=None, *,
492508 element (NamedTuple): The element coordinates. None if not found.
493509 """
494510 self .state .element = None
495- screen_w , screen_h = self ._dimensions
511+ screen_w , screen_h = self ._get_page_size ()
496512 x = x or 0
497513 y = y or 0
498514 w = width or screen_w
@@ -595,7 +611,7 @@ def find_same(item, items):
595611 return elems
596612
597613 self .state .element = None
598- screen_w , screen_h = self ._dimensions
614+ screen_w , screen_h = self ._get_page_size ()
599615 x = x or 0
600616 y = y or 0
601617 w = width or screen_w
@@ -678,7 +694,7 @@ def display_size(self):
678694 Returns:
679695 size (Tuple): The screen dimension (width and height) in pixels.
680696 """
681- return self ._dimensions
697+ return self ._get_page_size ()
682698
683699 def screenshot (self , filepath = None , region = None ):
684700 """
@@ -722,7 +738,7 @@ def screen_cut(self, x, y, width=None, height=None):
722738 Returns:
723739 Image: The screenshot Image object
724740 """
725- screen_size = self ._dimensions
741+ screen_size = self ._get_page_size ()
726742 x = x or 0
727743 y = y or 0
728744 width = width or screen_size [0 ]
@@ -759,7 +775,7 @@ def get_element_coords(self, label, x=None, y=None, width=None, height=None, mat
759775 coords (Tuple): A tuple containing the x and y coordinates for the element.
760776 """
761777 self .state .element = None
762- screen_size = self ._dimensions
778+ screen_size = self ._get_page_size ()
763779 x = x or 0
764780 y = y or 0
765781 width = width or screen_size [0 ]
0 commit comments