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?
oudriver.find_element_next?
oudriver.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?
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"]')
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']");
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:
Android.widget.TextView[@text = "Current element text"]
Android.widget.RelativeLayout
et sélectionnera le prochain Android.widget.TextView[@text="Next element text"]
sous la même hiérarchie.