@@ -60,6 +60,7 @@ def test_anything(self):
60
60
from selenium.webdriver.common.by import By
61
61
from selenium.webdriver.common.keys import Keys
62
62
from selenium.webdriver.remote.remote_connection import LOGGER
63
+ from selenium.webdriver.remote.webelement import WebElement
63
64
from seleniumbase import config as sb_config
64
65
from seleniumbase.__version__ import __version__
65
66
from seleniumbase.common import decorators
@@ -5645,6 +5646,40 @@ def highlight_if_visible(
5645
5646
if self.is_element_visible(selector, by=by):
5646
5647
self.__highlight(selector, by=by, loops=loops, scroll=scroll)
5647
5648
5649
+ def __highlight_element(self, element, loops=None, scroll=True):
5650
+ self.__check_scope()
5651
+ if not loops:
5652
+ loops = settings.HIGHLIGHTS
5653
+ if scroll and self.browser != "safari":
5654
+ try:
5655
+ self.__slow_scroll_to_element(element)
5656
+ except Exception:
5657
+ pass
5658
+ if self.highlights:
5659
+ loops = self.highlights
5660
+ if self.browser == "ie":
5661
+ loops = 1 # Override previous setting because IE is slow
5662
+ loops = int(loops)
5663
+ if self.headless or self.headless2 or self.xvfb:
5664
+ # Headless modes have less need for highlighting elements.
5665
+ # However, highlight() may be used as a sleep alternative.
5666
+ loops = int(math.ceil(loops * 0.5))
5667
+ o_bs = "" # original_box_shadow
5668
+ try:
5669
+ style = element.get_attribute("style")
5670
+ except Exception:
5671
+ self.wait_for_ready_state_complete()
5672
+ time.sleep(0.12)
5673
+ style = element.get_attribute("style")
5674
+ if style:
5675
+ if "box-shadow: " in style:
5676
+ box_start = style.find("box-shadow: ")
5677
+ box_end = style.find(";", box_start) + 1
5678
+ original_box_shadow = style[box_start:box_end]
5679
+ o_bs = original_box_shadow
5680
+ self.__highlight_element_with_js(element, loops, o_bs)
5681
+ time.sleep(0.065)
5682
+
5648
5683
def __highlight(
5649
5684
self, selector, by="css selector", loops=None, scroll=True
5650
5685
):
@@ -5733,13 +5768,16 @@ def highlight(
5733
5768
):
5734
5769
"""This method uses fancy JavaScript to highlight an element.
5735
5770
@Params
5736
- selector - the selector of the element to find
5771
+ selector - the selector of the element to find (Accepts WebElement)
5737
5772
by - the type of selector to search by (Default: CSS)
5738
5773
loops - # of times to repeat the highlight animation
5739
5774
(Default: 4. Each loop lasts for about 0.2s)
5740
5775
scroll - the option to scroll to the element first (Default: True)
5741
5776
timeout - the time to wait for the element to appear """
5742
5777
self.__check_scope()
5778
+ if isinstance(selector, WebElement):
5779
+ self.__highlight_element(selector, loops=loops, scroll=scroll)
5780
+ return
5743
5781
if not timeout:
5744
5782
timeout = settings.SMALL_TIMEOUT
5745
5783
self.wait_for_element_visible(selector, by=by, timeout=timeout)
@@ -5751,6 +5789,31 @@ def highlight(
5751
5789
action = ["hi_li", selector, origin, time_stamp]
5752
5790
self.__extra_actions.append(action)
5753
5791
5792
+ def highlight_elements(
5793
+ self,
5794
+ selector,
5795
+ by="css selector",
5796
+ loops=None,
5797
+ scroll=True,
5798
+ limit=0,
5799
+ ):
5800
+ if not limit:
5801
+ limit = 0 # 0 means no limit
5802
+ limit = int(limit)
5803
+ count = 0
5804
+ elements = self.find_elements(selector, by=by)
5805
+ for element in elements:
5806
+ try:
5807
+ if element.is_displayed():
5808
+ self.__highlight_element(
5809
+ element, loops=loops, scroll=scroll
5810
+ )
5811
+ count += 1
5812
+ except Exception:
5813
+ pass
5814
+ if limit > 0 and count >= limit:
5815
+ break
5816
+
5754
5817
def press_up_arrow(self, selector="html", times=1, by="css selector"):
5755
5818
"""Simulates pressing the UP Arrow on the keyboard.
5756
5819
By default, "html" will be used as the CSS Selector target.
0 commit comments