pythonseleniumsvgxpathsvg-rect

How to access to 'rect' type element through Selenium-Python


There is a rect object in the dom:

<rect class="slv-blank" id="id123" height="8.8" stroke-width="1px" width="18.8" x="59.2" y="37.5"></rect>

I am trying to search it with following code:

WebDriverWait(driver, 1).until(ec.presence_of_element_located(("xpath", '//rect[@id="id123"]'))).click()

This does not work.

But the following does:

WebDriverWait(driver, 1).until(ec.presence_of_element_located(("xpath", '//*[name()="rect"][@id="id123"]'))).click()

Any clues on why the first one does not work?


Solution

  • <rect>

    The <rect> element is a basic SVG shape that creates rectangles, defined by their corner's position, their width, and their height. The rectangles may have their corners rounded.

    An Example:

    <svg viewBox="0 0 220 100" xmlns="http://www.w3.org/2000/svg">
      <!-- Simple rect element -->
      <rect x="0" y="0" width="100" height="100" />
    
      <!-- Rounded corner rect element -->
      <rect x="120" y="0" width="100" height="100" rx="15" ry="15" />
    </svg>
    

    Attributes

    The attributes of <rect> elements are as follows:

    Note: Starting with SVG2 x, y, width, height, rx and ry are Geometry Properties, meaning those attributes can also be used as CSS properties for that element.


    This usecase

    As the <rect> element is a SVG element so to locate such elements you have to explicitly specify the SVG namespace when accessing the elements using as follows:


    References

    You can find a couple of relevant detailed discussions in