Skip to content

Commit b18c8a0

Browse files
committed
Add get_parent() to the SB / CDP APIs
1 parent 902929a commit b18c8a0

File tree

4 files changed

+32
-0
lines changed

4 files changed

+32
-0
lines changed

seleniumbase/core/browser_launcher.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ def extend_driver(driver):
220220
driver.highlight_if_visible = DM.highlight_if_visible
221221
driver.sleep = time.sleep
222222
driver.get_attribute = DM.get_attribute
223+
driver.get_parent = DM.get_parent
223224
driver.get_current_url = DM.get_current_url
224225
driver.get_page_source = DM.get_page_source
225226
driver.get_title = DM.get_title
@@ -647,6 +648,7 @@ def uc_open_with_cdp_mode(driver, url=None):
647648
cdp.click_if_visible = CDPM.click_if_visible
648649
cdp.click_visible_elements = CDPM.click_visible_elements
649650
cdp.mouse_click = CDPM.mouse_click
651+
cdp.get_parent = CDPM.get_parent
650652
cdp.remove_element = CDPM.remove_element
651653
cdp.remove_from_dom = CDPM.remove_from_dom
652654
cdp.remove_elements = CDPM.remove_elements

seleniumbase/core/sb_cdp.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ def __add_sync_methods(self, element):
9191
element.get_attribute = (
9292
lambda attribute: self.__get_attribute(element, attribute)
9393
)
94+
# element.get_parent() should come last
95+
element.get_parent = lambda: self.__get_parent(element)
9496
return element
9597

9698
def get(self, url):
@@ -549,6 +551,9 @@ def __get_attribute(self, element, attribute):
549551
pass
550552
return None
551553

554+
def __get_parent(self, element):
555+
return self.__add_sync_methods(element.parent)
556+
552557
def __get_x_scroll_offset(self):
553558
x_scroll_offset = self.loop.run_until_complete(
554559
self.page.evaluate("window.pageXOffset")
@@ -769,6 +774,11 @@ def focus(self, selector):
769774
def highlight_overlay(self, selector):
770775
self.find_element(selector).highlight_overlay()
771776

777+
def get_parent(self, element):
778+
if isinstance(element, str):
779+
element = self.select(element)
780+
return self.__add_sync_methods(element.parent)
781+
772782
def remove_element(self, selector):
773783
self.select(selector).remove_from_dom()
774784

seleniumbase/core/sb_driver.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,13 @@ def get_attribute(self, selector, attribute, by="css selector"):
5151
element = self.locator(selector, by=by)
5252
return element.get_attribute(attribute)
5353

54+
def get_parent(self, element):
55+
if self.__is_cdp_swap_needed():
56+
return self.driver.cdp.get_parent(element)
57+
if isinstance(element, str):
58+
element = self.locator(element)
59+
return element.find_element(by="xpath", value="..")
60+
5461
def get_current_url(self):
5562
if self.__is_cdp_swap_needed():
5663
current_url = self.driver.cdp.get_current_url()

seleniumbase/fixtures/base_case.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2072,6 +2072,19 @@ def internalize_links(self):
20722072
return
20732073
self.set_attributes('[target="_blank"]', "target", "_self")
20742074

2075+
def get_parent(self, element, by="css selector", timeout=None):
2076+
"""Returns the parent element.
2077+
If element is a string, then finds element first via selector."""
2078+
if self.__is_cdp_swap_needed():
2079+
return self.cdp.get_parent(element)
2080+
if isinstance(element, str):
2081+
if not timeout:
2082+
timeout = settings.LARGE_TIMEOUT
2083+
element = self.wait_for_element_present(
2084+
element, by=by, timeout=timeout
2085+
)
2086+
return element.find_element(by="xpath", value="..")
2087+
20752088
def get_property(
20762089
self, selector, property, by="css selector", timeout=None
20772090
):

0 commit comments

Comments
 (0)