
    EEi/-                     |    d dl Z d dlmZmZ d dlmZ d dlmZmZ d dl	m
Z
 deddfd	Zd
ededdfdZ G d d      Zy)    N)NoReturnoverload)WebDriverException)ByByType)
WebElementtag_namereturn
RelativeByc                 |    t        j                  d       | st        d      t        t        j
                  | i      S )a  Start searching for relative objects using a tag name.

    Args:
        tag_name: The DOM tag of element to start searching.

    Returns:
        RelativeBy: Use this object to create filters within a `find_elements` call.

    Raises:
        WebDriverException: If `tag_name` is None.

    Note:
        This method is deprecated and may be removed in future versions.
        Please use `locate_with` instead.
    zbThis method is deprecated and may be removed in future versions. Please use `locate_with` instead.ztag_name can not be null)warningswarnr   r   r   CSS_SELECTOR)r	   s    w/home/sietch6/trending-topics-pipeline/venv/lib/python3.12/site-packages/selenium/webdriver/support/relative_locator.pywith_tag_namer      s4      MMvw !;<<r122    byusingc                 @    | J d       |J d       t        | |i      S )a  Start searching for relative objects your search criteria with By.

    Args:
        by: The method to find the element.
        using: The value from `By` passed in.

    Returns:
        RelativeBy: Use this object to create filters within a `find_elements` call.

    Example:
        >>> lowest = driver.find_element(By.ID, "below")
        >>> elements = driver.find_elements(locate_with(By.CSS_SELECTOR, "p").above(lowest))
    zPlease pass in a by argumentzPlease pass in a using argument)r   )r   r   s     r   locate_withr   /   s5     >999>???r5k""r   c                   J   e Zd ZdZeeef   Zd&deeef   dz  dedz  fdZ	e
deez  dd fd       Ze
d'd(d
       Zd'deez  dz  dd fdZe
deez  dd fd       Ze
d'd(d       Zd'deez  dz  dd fdZe
deez  dd fd       Ze
d'd(d       Zd'deez  dz  dd fdZe
deez  dd fd       Ze
d'd(d       Zd'deez  dz  dd fdZe
deez  dd fd       Ze
d'd(d       Zd'deez  dz  dd fdZe
deez  dd fd       Ze
d'd(d       Zd'deez  dz  dd fdZe
deez  dd fd       Ze
d'd(d       Zd'deez  dz  dd fdZe
deez  dd fd       Ze
d'd(d       Zd'deez  dz  dd fd Ze
d)deez  d!edd fd"       Ze
d*ddd!edd	fd#       Zd*deez  dz  d!edd fd$Zdefd%Zy)+r   a  Find elements based on their relative location from a root element.

    It is recommended that you use the helper function to create instances.

    Example:
    --------
    >>> lowest = driver.find_element(By.ID, "below")
    >>> elements = driver.find_elements(locate_with(By.CSS_SELECTOR, "p").above(lowest))
    >>> ids = [el.get_attribute("id") for el in elements]
    >>> assert "above" in ids
    >>> assert "mid" in ids
    Nrootfiltersc                 (    || _         |xs g | _        y)aS  Create a RelativeBy object (prefer using `locate_with` instead).

        Args:
            root: A dict with `By` enum as the key and the search query as the value
            filters: A list of the filters that will be searched. If none are passed
                in please use the fluent API on the object to create the filters
        Nr   r   )selfr   r   s      r   __init__zRelativeBy.__init__R   s     	}"r   element_or_locatorr
   c                      y N r   r   s     r   abovezRelativeBy.above]       SVr   r   c                      y r    r!   r"   s     r   r#   zRelativeBy.above`       DGr   c                 ^    |st        d      | j                  j                  d|gd       | S )a  Add a filter to look for elements above.

        Args:
            element_or_locator: Element to look above

        Returns:
            RelativeBy

        Raises:
            WebDriverException: If `element_or_locator` is None.

        Example:
        --------
        >>> lowest = driver.find_element(By.ID, "below")
        >>> elements = driver.find_elements(locate_with(By.CSS_SELECTOR, "p").above(lowest))
        :Element or locator must be given when calling above methodr#   kindargsr   r   appendr"   s     r   r#   zRelativeBy.abovec   s3    " "$%abbW7I6JKLr   c                      y r    r!   r"   s     r   belowzRelativeBy.belowz   r$   r   c                      y r    r!   r"   s     r   r/   zRelativeBy.below}   r&   r   c                 ^    |st        d      | j                  j                  d|gd       | S )a  Add a filter to look for elements below.

        Args:
            element_or_locator: Element to look below

        Returns:
            RelativeBy

        Raises:
            WebDriverException: If `element_or_locator` is None.

        Example:
            >>> highest = driver.find_element(By.ID, "high")
            >>> elements = driver.find_elements(locate_with(By.CSS_SELECTOR, "p").below(highest))
        :Element or locator must be given when calling below methodr/   r)   r,   r"   s     r   r/   zRelativeBy.below   s3      "$%abbW7I6JKLr   c                      y r    r!   r"   s     r   
to_left_ofzRelativeBy.to_left_of   s    X[r   c                      y r    r!   r"   s     r   r4   zRelativeBy.to_left_of   s    ILr   c                 ^    |st        d      | j                  j                  d|gd       | S )a  Add a filter to look for elements to the left of.

        Args:
            element_or_locator: Element to look to the left of

        Returns:
            RelativeBy

        Raises:
            WebDriverException: If `element_or_locator` is None.

        Example:
            >>> right = driver.find_element(By.ID, "right")
            >>> elements = driver.find_elements(locate_with(By.CSS_SELECTOR, "p").to_left_of(right))
        ?Element or locator must be given when calling to_left_of methodleftr)   r,   r"   s     r   r4   zRelativeBy.to_left_of   s3      "$%fggV6H5IJKr   c                      y r    r!   r"   s     r   to_right_ofzRelativeBy.to_right_of   s    Y\r   c                      y r    r!   r"   s     r   r:   zRelativeBy.to_right_of   s    JMr   c                 ^    |st        d      | j                  j                  d|gd       | S )a  Add a filter to look for elements right of.

        Args:
            element_or_locator: Element to look right of

        Returns:
            RelativeBy

        Raises:
            WebDriverException: If `element_or_locator` is None.

        Example:
            >>> left = driver.find_element(By.ID, "left")
            >>> elements = driver.find_elements(locate_with(By.CSS_SELECTOR, "p").to_right_of(left))
        @Element or locator must be given when calling to_right_of methodrightr)   r,   r"   s     r   r:   zRelativeBy.to_right_of   s3      "$%ghhW7I6JKLr   c                      y r    r!   r"   s     r   straight_abovezRelativeBy.straight_above       \_r   c                      y r    r!   r"   s     r   r@   zRelativeBy.straight_above       MPr   c                 ^    |st        d      | j                  j                  d|gd       | S )zvAdd a filter to look for elements above.

        Args:
            element_or_locator: Element to look above
        r(   straightAbover)   r,   r"   s     r   r@   zRelativeBy.straight_above   3     "$%abb_?Q>RSTr   c                      y r    r!   r"   s     r   straight_belowzRelativeBy.straight_below   rA   r   c                      y r    r!   r"   s     r   rH   zRelativeBy.straight_below   rC   r   c                 ^    |st        d      | j                  j                  d|gd       | S )zvAdd a filter to look for elements below.

        Args:
            element_or_locator: Element to look below
        r2   straightBelowr)   r,   r"   s     r   rH   zRelativeBy.straight_below   rF   r   c                      y r    r!   r"   s     r   straight_left_ofzRelativeBy.straight_left_of   s    ^ar   c                      y r    r!   r"   s     r   rM   zRelativeBy.straight_left_of   s    ORr   c                 ^    |st        d      | j                  j                  d|gd       | S )zAdd a filter to look for elements to the left of.

        Args:
            element_or_locator: Element to look to the left of
        r7   straightLeftr)   r,   r"   s     r   rM   zRelativeBy.straight_left_of   s3     "$%fgg^>P=QRSr   c                      y r    r!   r"   s     r   straight_right_ofzRelativeBy.straight_right_of  s    _br   c                      y r    r!   r"   s     r   rR   zRelativeBy.straight_right_of  s    PSr   c                 ^    |st        d      | j                  j                  d|gd       | S )z|Add a filter to look for elements right of.

        Args:
            element_or_locator: Element to look right of
        r=   straightRightr)   r,   r"   s     r   rR   zRelativeBy.straight_right_of
  s3     "$%ghh_?Q>RSTr   distancec                      y r    r!   r   r   rV   s      r   nearzRelativeBy.near  s    fir   c                      y r    r!   rX   s      r   rY   zRelativeBy.near  s    WZr   c                     |st        d      |dk  rt        d      | j                  j                  d||gd       | S )a2  Add a filter to look for elements near.

        Args:
            element_or_locator: Element to look near by the element or within a distance
            distance: Distance in pixel

        Returns:
            RelativeBy

        Raises:
            WebDriverException: If `element_or_locator` is None
            WebDriverException: If `distance` is less than or equal to 0.

        Example:
            >>> near = driver.find_element(By.ID, "near")
            >>> elements = driver.find_elements(locate_with(By.CSS_SELECTOR, "p").near(near, 50))
        z9Element or locator must be given when calling near methodr   zDistance must be positiverY   r)   r,   rX   s      r   rY   zRelativeBy.near  sH    $ "$%`aaq=$%@AAV6H(5STUr   c                 8    d| j                   | j                  diS )z?Create a dict to be passed to the driver for element searching.relativer   r   )r   s    r   to_dictzRelativeBy.to_dict6  s$     		<<
 	
r   )NNr    )r   Nr
   r   )2   )Nr_   )__name__
__module____qualname____doc__dictr   strLocatorTypelistr   r   r   r#   r/   r4   r:   r@   rH   rM   rR   intrY   r^   r!   r   r   r   r   B   s	    vs{#K	%T&#+.5 	%td{ 	% V
[(@V\V VG G
[(@4(G S_ . V
[(@V\V VG G
T(9D(@ L , [Z+-E[,[ [L LZ$->-E Q] , \j;.F\<\ \M Mj4.?$.F R^ , _k1I_l_ _P P
k1ID1P 
\h 
 _k1I_l_ _P P
d1BT1I 
Ua 
 a:3KaP\a aR R
:3Dt3K 
Wc 
 bJ4LbQ]b bS S
J4E4L 
Xd 
 izK'?i3iXdi iZtZcZ:Z ZzK'?$'F Y\ fr 4
 
r   )r   typingr   r   selenium.common.exceptionsr   selenium.webdriver.common.byr   r   $selenium.webdriver.remote.webelementr   re   r   r   r   r!   r   r   <module>rm      sO   "  % 9 3 ;3C 3L 3,#F #3 #< #&{
 {
r   