28

I have this HTML:

<body>
    <p id='one'> 1A </p>
    <p id='two'> 2A </p>
    <p id='three'> 3A </p>
    <p id='four'> 4A </p>
    <p id='five'> 5A </p>
    <p id='six'> 6A </p>
    <p id='seven'> 7A </p>
</body>

I use the code below to get the first p tag element:

elem = driver.find_element_by_id('one')

Now, how to find the next sibling of elem?

ibodi
  • 1,543
  • 3
  • 21
  • 40
user3679414
  • 291
  • 1
  • 4
  • 5

3 Answers3

36

I want to correct Mark Rowlands's answer,. The correct syntax will be

driver.find_element_by_xpath("//p[@id='one']/following-sibling::p")
Snow
  • 1,058
  • 2
  • 19
  • 47
jahr
  • 611
  • 6
  • 6
16

We need to pass elem to a JavaScript function and execute it. We cannot use it's name inside the JS function when we are passing elem to it, but we can use arguments. Here's an example of how you can get the next sibling of elem:

next_sibling = driver.execute_script("""
    return arguments[0].nextElementSibling
""", elem)

Take a look at this little example of how execute_script() function works:

sum = driver.execute_script("""
    console.log(arguments[0].innerHTML) // will print innerHTML of the element in console logs of the page
    return arguments[1] + arguments[2]
""", elem, 5, 6)

print(sum) # 11
ibodi
  • 1,543
  • 3
  • 21
  • 40
  • 5
    @user3679414 This should be considered as the correct answer, because fully general, i.e. there is no need for a starting-point xpath. Just tested. +1 – keepAlive Jan 13 '19 at 22:07
13

Using Xpath:

driver.find_element_by_xpath("//p[@id, 'one']/following-sibling::p")
Mark Rowlands
  • 5,357
  • 2
  • 29
  • 41