web-dev-qa-db-fra.com

Comment trouver des éléments parents avec python webdriver?

Existe-t-il des méthodes permettant à python + Selenium de rechercher des éléments parents, des éléments frères ou des éléments enfants exactement comme

driver.find_element_parent? ou
driver.find_element_next? ou
driver.find_element_previous?

par exemple:

<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>

J'ai essayé comme ci-dessous, mais échouer:

input_el=driver.find_element_by_name('A')
td_p_input=find_element_by_xpath('ancestor::input')

Comment je peux obtenir le parent de l'élément d'entrée puis enfin obtenir l'option sélectionnée?

40
Stella

Vous pouvez trouver un élément parent en utilisant .. xpath:

input_el = driver.find_element_by_name('A')
td_p_input = input_el.find_element_by_xpath('..')

Pourquoi ne pas créer un xpath distinct pour obtenir l’option sélectionnée, comme ceci:

selected_option = driver.find_element_by_xpath('//option[@selected="selected"]')
69
alecxe

D'après votre exemple, je suppose que vous ne voulez que l'option sélectionnée dans une ligne de table si et seulement si cette ligne a aussi un élément d'entrée avec le nom "A", où que cet élément dans l'arbre HTML réside sous l'élément .

Vous pouvez y parvenir via l'axe xpath ancestor.

Par souci de meilleure lisibilité, je montrerai comment procéder étape par étape (mais vous pouvez réellement tout mettre dans une seule expression xpath):

// 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']");
5
drkthng

Une des manières possibles de naviguer vers un élément dans la même hiérarchie consiste à utiliser /../ dans xpath comme indiqué ci-dessous:

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"]')

Ici ça va:

  1. Tout d'abord naviguer vers Android.widget.TextView[@text = "Current element text"]
  2. Ensuite, il retournera à l'élément parent i.e Android.widget.RelativeLayout et sélectionnera le prochain Android.widget.TextView[@text="Next element text"] sous la même hiérarchie.
0
Parth Naik