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>
3 Réponses :
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
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.
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
:
li
n'est généralement pas dans l ' entrée
. 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
J'ai essayé cette méthode et elle a résolu mon problème immédiatement. Merci pour ton aide
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/
J'utilise watir-webdriver
Si tel est le cas, je vous conseillerais certainement de passer à la gemmewatir
...