1
votes

Identifier un élément html pour la sélection dans ruby ​​où tous les finders correspondent

J'utilise watir-webdriver dans un projet ruby ​​pour imiter les actions d'un utilisateur sur un système d'entreprise. Afin d'exécuter la tâche, je dois sélectionner un champ déroulant, puis sélectionner une option parmi celles-ci.

Le code dans lequel les éléments d'option sont affichés est:

Watir::Exception::UnknownObjectException: timed out after 30 seconds, waiting for #<Watir::LI: located: false; {:id=>"contentIFrame1", :tag_name=>"iframe"} --> {:id=>"navLink{bd27b00e-3d5e-b7b5-0ddb-864216077292}AreaFrame", :tag_name=>"iframe"} --> {:id=>"ctl00_MainContent_cboDefaultPaymentType_Input", :tag_name=>"input"} --> {:class=>"\"gridcontrolcolumn\" >\n      Direct Debit < /li>", :tag_name=>"li"}> to be located
./features/step_definitions/create_DD_mandate.rb:65:in `/^Change the payment type to DD$/'
./features/create_DD_contact.feature:13:in `Then Change the payment type to DD'

Remarque Je peux différencier les options en utilisant la "description" dans le code. Cependant, je ne peux pas utiliser de finders (par exemple class: / id: etc pour les identifier dans ruby.)

Y a-t-il une expression dans laquelle je peux identifier le texte descriptif à la fin? P >

J'ai déjà essayé d'utiliser une fonction send_keys pour les sélectionner en utilisant leur titre, mais le champ est en lecture seule et ne répond pas à send_keys.

Mon code ruby ​​actuel (non fonctionnel) est comme suit:

@browser.iframe(id: 'contentIFrame1')
      .iframe(id: 'navLink{bd27b00e-3d5e-b7b5-0ddb-864216077292}AreaFrame')
      .input(id: 'ctl00_MainContent_cboDefaultPaymentType_Input').wait_until_present.click
  @browser.iframe(id: 'contentIFrame1')
      .iframe(id: 'navLink{bd27b00e-3d5e-b7b5-0ddb-864216077292}AreaFrame')
      .input(id: 'ctl00_MainContent_cboDefaultPaymentType_Input').li(class: '"gridcontrolcolumn" >
      Direct Debit < /li>').click

Naturellement, si j'utilise .li (class: "gridcontrolcolumn"). cliquez sur , j'ai trop de valeurs renvoyées. p >

<ul class="rcbList" style="list-style:none;margin:0;padding:0;zoom:1;">
    <li class="rcbHovered  rcbTemplate">
        <ul>
            <li style="width: 100%" class="gridcontrolcolumn">
                Direct Debit
            </li>
        </ul>
    </li>
    <li class="rcbItem  rcbTemplate">
        <ul>
            <li style="width: 100%" class="gridcontrolcolumn">
                Invoice
            </li>
        </ul>
    </li>
    <li class="rcbItem  rcbTemplate">
        <ul>
            <li style="width: 100%" class="gridcontrolcolumn">
                Online Payment
            </li>
        </ul>
    </li>
</ul>


1 commentaires

J'utilise watir-webdriver Si tel est le cas, je vous conseillerais certainement de passer à la gemme watir ...


3 Réponses :


0
votes

Remplacez la ligne ci-dessous

.li(xpath: "//ul[@class='rcbList']//li[@class='gridcontrolcolumn'][normalize-space(.)='Invoice']").click

par ceci

.input(id: 'ctl00_MainContent_cboDefaultPaymentType_Input').li(class: '"gridcontrolcolumn" >
  Direct Debit < /li>').click


4 commentaires

En général, nous recommandons aux utilisateurs de Watir d'éviter XPath lorsque cela est possible car il est beaucoup plus difficile à lire. Avec les dernières versions de Watir, il n'y a plus de perte de performances pour la plupart des emplacements d'éléments imbriqués.


@titusfortner Merci pour votre commentaire. Dans ce cas, OP peut-il utiliser li (text: 'Invoice', class: 'gridcontrol column') ?


@titusfortner Je veux juste savoir, est-ce seulement la lisibilité? ou il y a quelque chose à noter


La lisibilité et le fait que la plupart des gens ne savent pas comment écrire correctement xpath, il est donc souvent plus facile de leur dire de ne pas le faire du tout. Watir fournit des méthodes de localisation pour tout ce que vous pourriez vouloir faire dans xpath.



0
votes

Il semble y avoir quelques problèmes avec la localisation du li à l'aide de .input (id: 'ctl00_MainContent_cboDefaultPaymentType_Input'). li (class: '"gridcontrolcolumn"> Direct Debit li> ') .cliquez :

  • Le li n'est généralement pas dans l ' entrée .
  • La classe li est simplement "gridcontrolcolumn" - c'est-à-dire sans guillemets ou autre texte.

J'essaierais le plus simple:

frame.li(text: 'Direct Debit', class: 'gridcontrolcolumn').click

Cela renverra en fait le li externe, ce qui devrait être suffisant. Si vous avez réellement besoin du li interne, essayez:

frame = @browser.iframe(id: 'contentIFrame1').iframe(id: 'navLink{bd27b00e-3d5e-b7b5-0ddb-864216077292}AreaFrame')
frame.li(text: 'Direct Debit').click


1 commentaires

J'ai essayé cette méthode et elle a résolu mon problème immédiatement. Merci pour ton aide



0
votes

Tout d'abord, voyez si vous pouvez passer à la dernière version de Watir 6.x si vous n'êtes pas déjà car watir-webdriver est obsolète.

Le localisateur : class est une classe unique (ou un tableau de plusieurs classes), donc mettre des sélecteurs CSS ne fonctionnera pas.

Vous avez des localisateurs : text pour les deux String et RegExp :

.li(text: 'Direct Debit')
.li(text: /Payment/)

Vous pouvez en savoir plus sur toutes les différentes façons de localiser les éléments Watir ici: http://watir.com/guides/locating/


0 commentaires