How to find parent elements by python webdriver?
Solution 1
You can find a parent element by using ..
xpath:
input_el = driver.find_element_by_name('A')
td_p_input = input_el.find_element_by_xpath('..')
What about making a separate xpath for getting selected option, like this:
selected_option = driver.find_element_by_xpath('//option[@selected="selected"]')
Solution 2
From your example, I figure you only want the selected option within a table-row if and only if this row also has an input element with the name "A", no matter where in the html-tree this element resides below the row-element.
You can achieve this via the xpath ancestor-axis.
For the sake of better readability I will show how to do this step by step (but you can actually put everything in only one xpath-expression):
# first find your "A" named element
namedInput = driver.find_element_by_name("A");
# from there find all ancestors (parents, grandparents,...) that are a table row 'tr'
rowElement = namedInput.find_element_by_xpath(".//ancestor::tr");
# from there find the first "selected" tagged option
selectedOption = rowElement.find_element_by_xpath(".//option[@selected='selected']");
Solution 3
One of the possible ways to navigate to element under same hierarchy is to use /../
in xpath as shown below:
current_element = driver.find_element_by_xpath('//android.view.ViewGroup/android.widget.RelativeLayout/android.widget.TextView[@text="Current element text"]/../android.widget.TextView[@text="Next element text"]')
Here it will:
- Firstly navigate to
android.widget.TextView[@text = "Current element text"]
- Then it will go back to parent element i.e
android.widget.RelativeLayout
and select the nextandroid.widget.TextView[@text="Next element text"]
under the same hierarchy.
Stella
Updated on July 05, 2022Comments
-
Stella almost 2 years
Is there any methods for python+selenium to find parent elements, brother elements, or child elements just like
driver.find_element_parent?
or
driver.find_element_next?
or
driver.find_element_previous
?eg:
<tr> <td> <select> <option value=0, selected='selected'> </option> <option value=1, > </option> <option value=2,> </option> </select> </td> <td> 'abcd' <input name='A'> </input> <td> <tr>
I've tried like below, but fail:
input_el=driver.find_element_by_name('A') td_p_input=find_element_by_xpath('ancestor::input')
How can I get the parent of input element and then, finally, get the option selected?
-
Alessandro Da Rugna over 8 yearsJust to add detail:
../
syntax doesn't work,./..
and./../..
work as expected. Don't add the trailing slash. -
Divya Mani about 4 yearsbu_editor.find_element_by_xpath('..') AttributeError: 'NoneType' object has no attribute 'find_element_by_xpath' - why im getting this ?
-
simpleuser over 3 years@Martlark the parent attribute of an element is of type WebDriver, so it's not an element of type WebElement
-
Lakshmi Narayanan over 3 years@AlessandroDaRugna is there a way to get the next immediate child of the element in a similar fashion?
-
Lakshmi Narayanan over 3 yearsis there a way to get the children in a similar fashion?
-
drkthng about 3 yearssure there is. if you really just want "children" that is only elements that are 1 layer below the parent element, then use "child" instead of "ancestor". if you're interested in all elements below a parent then use "descendant" instead of ancestor.
-
Herker about 3 yearscheck out this site for more Xpath commands - scientecheasy.com/2019/08/xpath-axes.html
-
grantr over 2 yearsthis works really well but the example above isn't the greatest. Check this out, it finds an element and then navigates to the parent div:
driver.find_element_by_xpath("//div[contains(text(),'floor price')]/../div").text