0
votes

Selenium trouve des éléments en utilisant xpath

J'ai besoin de trouver des éléments avec des montants de prêt pour l'investisseur A (dans ce cas, c'est 100, 100)

quelqu'un peut-il suggérer comment écrire xpath pour trouver ces éléments

[Exemple] Dans la capture d'écran ci-dessous, je dois trouver xpath pour obtenir les éléments avec le texte 100 dans les rangées un et deux pour lesquels des boutons radio sont sélectionnés.

Ci-dessous, xpath donne les trois montants de prêt

<script src="https://code.jquery.com/jquery-3.4.1.js" integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU="
  crossorigin="anonymous"></script>
<html>

<head>
  <style>
    table {
      border: 1px dashed #cccccc;
      border-collapse: collapse;
    }

    table td {
      border: 1px dashed #cccccc;
    }
  </style>
</head>

<body>
  <table>
    <tr>
      <td>
        <label>Loan1</label>
      </td>
      <td>
        <input type='radio' name='L1' id='L1_one'></input>
        <label>100</label>
      </td>
      <td>
        <label>Investor A</label>
      </td>
      <td>
        <input type='radio' name='L1' id='L1_two'></input>
        <label>200</label>
      </td>
      <td>
        <label>Investor B</label>
      </td>
      <td>
        <input type='radio' name='L1' id='L1_three'></input>
        <label>300</label>
      </td>
      <td>
        <label>Investor C</label>
      </td>
    </tr>
    <tr>
      <td>
        <label>Loan2</label>
      </td>
      <td>
        <input type='radio' name='L2' id='L2_one'></input>
        <label>100</label>
      </td>
      <td>
        <label>Investor A</label>
      </td>
      <td>
        <input type='radio' name='L2' id='L2_two'></input>
        <label>200</label>
      </td>
      <td>
        <label>Investor B</label>
      </td>
      <td>
        <input type='radio' name='L2' id='L2_three'></input>
        <label>300</label>
      </td>
      <td>
        <label>Investor C</label>
      </td>
    </tr>
    <tr>
        <td>
          <label>Loan3</label>
        </td>
        <td>
          <input type='radio' name='L3' id='L3_one'></input>
          <label>100</label>
        </td>
        <td>
          <label>Investor A</label>
        </td>
        <td>
          <input type='radio' name='L3' id='L3_two'></input>
          <label>200</label>
        </td>
        <td>
          <label>Investor B</label>
        </td>
        <td>
          <input type='radio' name='L3' id='L3_three'></input>
          <label>300</label>
        </td>
        <td>
          <label>Investor C</label>
        </td>
      </tr>
  </table>
</body>

Mais je n'ai besoin que des montants de prêt des lignes 1 et 2 pour lesquels le bouton radio est sélectionné

 entrez la description de l'image ici

XXX


6 commentaires

Qu'essayez-vous de trouver? Les boutons radio?


@GregBurghardt, j'ai mis à jour la question avec l'exemple. S'il vous plaît laissez-moi savoir si vous avez besoin de plus d'informations


Quel code avez-vous essayé jusqu'à présent pour obtenir les éléments?


Ci-dessous xpath donne les trois montants de prêt // td [contient (., "Investor A")] / precedent-sibling :: td [descendant :: input] [1] / label / text (‌) Mais j'ai besoin uniquement les montants de prêt des rangées un et deux pour lesquels le bouton radio est sélectionné


Veuillez ajouter ceci à votre question et non aux commentaires.


Merci @GregBurghardt a ajouté un exemple de code à la question. Faites-moi savoir si vous avez besoin de n'importe quelle autre information


4 Réponses :


0
votes

Voici un exemple de la façon dont vous pouvez obtenir des boutons radio selon le libellé et la valeur du prêt:

//tr[.//label[.='Loan1']]//td[./label[.='100']]/input
//tr[.//label[.='Loan1']]//td[./label[.='300']]/input

//tr[.//label[.='Loan2']]//td[./label[.='100']]/input

//tr[.//label[.='Loan3']]//td[./label[.='200']]/input


0 commentaires

1
votes

essayez cet xpath:

// td [contient (., "Investisseur A")] / précédent-frère :: td [descendant :: input [@selected ou @checked]] [1] / label / text () < / code>


3 commentaires

Merci d'avoir fourni le fichier xpath. pour une raison quelconque Si j'ai [@selected] les éléments ne sont pas sélectionnés. Ci-dessous xpath donne les trois montants de prêt // td [contient (., "Investor A")] / precedent-sibling :: td [descendant :: input] [1] / label / text (‌) y a-t-il un autre moyen d'obtenir des entrées sélectionnées?


J'ai mis à jour le xpath pour utiliser @checked ou @selected, mais j'ai essayé et même ils ne fonctionnent pas pour xpath, mais une solution fonctionne en css, si vous êtes intéressé par une solution basée sur css, veuillez essayer ceci # L1_one: coché . si cela fonctionne pour vous, je convertirai le xpath ci-dessus en css.


Je vais essayer d'utiliser le css, pouvez-vous s'il vous plaît fournir un css équivalent



1
votes

Puisque vous recherchez le montant du prêt avec le libellé du prêt (Prêt1) et l'investisseur (Investisseur A), vous pouvez utiliser le XPath ci-dessous.

"//tr[.//label[.='#{loanLabel}']]//label[.='#{investorLabel}']//preceding::label[1]"

Cela renverra "100".

/ p>

Vous pouvez insérer le libellé de prêt et d’investisseur de votre choix dans XPath et obtenir le montant du prêt correspondant à ce que vous voulez.

//tr[.//label[.='Loan1']]//label[.='Investor A']//preceding::label[1]
^ find a TR
    ^ that has a descendant LABEL with the loan label
                         ^ that TR has a descendant LABEL that contains the investor name
                                                ^ then go back up the DOM and find the first LABEL

Voir Ruby: fusion de variables dans une chaîne


4 commentaires

Merci d'avoir fourni le code. Je n'ai besoin de récupérer l'élément que si le bouton radio à côté du montant du prêt est sélectionné. Comme ruhaib l'a suggéré, j'ai utilisé l'entrée [@selected] dans xpath mais cela ne fonctionne pas.


Pour autant que je sache, vous ne pouvez pas obtenir les éléments sélectionnés à l'aide de XPath car cette valeur n'est pas reflétée dans le HTML (une valeur par défaut peut être mais pas celle qui a été sélectionnée). Vous devrez tout parcourir, trouver ceux qui sont vérifiés à l'aide de Selenium, puis revenir en arrière et trouver les éléments en fonction de ce que vous avez trouvé.


Pourquoi votre message a-t-il reçu autant de votes négatifs @JeffC? J'ai essayé d'en réparer quelques-uns.


Eh bien, il n'a reçu qu'un seul vote défavorable. C'est généralement une personne en particulier qui se venge des votes négatifs. Vous évaluez son message et laissez une critique ou un commentaire constructif et il évalue quelques-unes de vos réponses. Cela se produit depuis des années. Je signale de temps en temps et il a déjà été banni mais il continue de le faire. J'apprécie les votes positifs ... mais vous ne devriez voter que si vous pensez que cela le justifie, pas seulement parce qu'il a été rejeté.



0
votes

Si l'état de sélection des boutons radio a changé depuis le chargement du code HTML, ce que vous essayez de faire n'est pas possible avec XPath. En effet, XPath n'a pas accès aux propriétés des entrées qui reflètent l'état actuel (il ne peut accéder qu'aux attributs). Vous avez également le problème qu'aucun des éléments

input [id $ = "_ one"]: coché + étiquette

puisque vous voulez le texte des éléments d'étiquette que CSS trouvera et que vous indiquez que vous utilisez Capybara il le ferait alors soyez

texts = all(:css, 'input[id$="_one"]:checked + label').map(&:text)

Remarque: cela n'utilise pas réellement le texte "Investisseur A" pour trouver les éléments qui vous intéressent. Si les identifiants ne sont pas fiables et utilisent le " Le texte de l'investisseur A "est important, il n'est pas possible de le faire en utilisant un seul XPath ou CSS avec la façon dont le HTML est structuré.


0 commentaires