@@ -3393,23 +3393,85 @@ def safe_execute_script(self, script, *args, **kwargs):
3393
3393
self.activate_jquery()
3394
3394
return self.driver.execute_script(script, *args, **kwargs)
3395
3395
3396
+ def get_gui_element_rect(self, selector, by="css selector"):
3397
+ """Very similar to element.rect, but the x, y coordinates are
3398
+ relative to the entire screen, rather than the browser window.
3399
+ This is specifically for PyAutoGUI actions on the full screen.
3400
+ (Note: There may be complications if iframes are involved.)"""
3401
+ element = self.wait_for_element_present(selector, by=by, timeout=1)
3402
+ element_rect = element.rect
3403
+ e_width = element_rect["width"]
3404
+ e_height = element_rect["height"]
3405
+ i_x = 0
3406
+ i_y = 0
3407
+ iframe_switch = False
3408
+ if self.__is_in_frame():
3409
+ self.switch_to_parent_frame()
3410
+ if self.__is_in_frame():
3411
+ raise Exception("Nested iframes breaks get_gui_element_rect!")
3412
+ iframe_switch = True
3413
+ iframe = self.wait_for_element_present("iframe", timeout=1)
3414
+ i_x = iframe.rect["x"]
3415
+ i_y = iframe.rect["y"]
3416
+ window_rect = self.get_window_rect()
3417
+ w_bottom_y = window_rect["y"] + window_rect["height"]
3418
+ viewport_height = self.execute_script("return window.innerHeight;")
3419
+ x = math.ceil(window_rect["x"] + i_x + element_rect["x"])
3420
+ y = math.ceil(w_bottom_y - viewport_height + i_y + element_rect["y"])
3421
+ if iframe_switch:
3422
+ self.switch_to_frame()
3423
+ if not self.is_element_present(selector, by=by):
3424
+ self.switch_to_parent_frame()
3425
+ return ({"height": e_height, "width": e_width, "x": x, "y": y})
3426
+
3427
+ def get_gui_element_center(self, selector, by="css selector"):
3428
+ """Returns the x, y coordinates of the element's center based
3429
+ on the entire GUI / screen, rather than on the browser window.
3430
+ This is specifically for PyAutoGUI actions on the full screen.
3431
+ (Note: There may be complications if iframes are involved.)"""
3432
+ element_rect = self.get_gui_element_rect(selector, by=by)
3433
+ x = int(element_rect["x"]) + int(element_rect["width"] / 2) + 1
3434
+ y = int(element_rect["y"]) + int(element_rect["height"] / 2) + 1
3435
+ return (x, y)
3436
+
3437
+ def get_window_rect(self):
3438
+ self.__check_scope()
3439
+ self._check_browser()
3440
+ return self.driver.get_window_rect()
3441
+
3442
+ def get_window_size(self):
3443
+ self.__check_scope()
3444
+ self._check_browser()
3445
+ return self.driver.get_window_size()
3446
+
3447
+ def get_window_position(self):
3448
+ self.__check_scope()
3449
+ self._check_browser()
3450
+ return self.driver.get_window_position()
3451
+
3396
3452
def set_window_rect(self, x, y, width, height):
3397
3453
self.__check_scope()
3398
3454
self._check_browser()
3399
3455
self.driver.set_window_rect(x, y, width, height)
3400
- self.__demo_mode_pause_if_active()
3456
+ self.__demo_mode_pause_if_active(tiny=True )
3401
3457
3402
3458
def set_window_size(self, width, height):
3403
3459
self.__check_scope()
3404
3460
self._check_browser()
3405
3461
self.driver.set_window_size(width, height)
3406
- self.__demo_mode_pause_if_active()
3462
+ self.__demo_mode_pause_if_active(tiny=True)
3463
+
3464
+ def set_window_position(self, x, y):
3465
+ self.__check_scope()
3466
+ self._check_browser()
3467
+ self.driver.set_window_position(x, y)
3468
+ self.__demo_mode_pause_if_active(tiny=True)
3407
3469
3408
3470
def maximize_window(self):
3409
3471
self.__check_scope()
3410
3472
self._check_browser()
3411
3473
self.driver.maximize_window()
3412
- self.__demo_mode_pause_if_active()
3474
+ self.__demo_mode_pause_if_active(tiny=True )
3413
3475
3414
3476
def switch_to_frame(self, frame="iframe", timeout=None):
3415
3477
"""Wait for an iframe to appear, and switch to it. This should be
0 commit comments