2016-09-05 32 views
1

mit Watir/Gurke/Ruby für Webseiten testen. Problem ist, dass einige Felder nicht ohne Javascript gefunden werden können. watir, erhalten Element nach Wert

Dies ist der Teil der Seite I übereinstimmen soll:

<!-- ngIf: (!entry.valueIcon) --><div ng-if="(!entry.valueIcon)" class="ng-scope"> 
    <!-- valueAlt when value is not present or is on a separate object key such as valueFrom: { something: 'else' } --> 
    <!-- ngIf: entry.valueAlt --> 

    <!-- default value display --> 
    <!-- ngIf: (!entry.valueAlt) --><input ng-if="(!entry.valueAlt)" type="text" class="form-control ng-valid ng-scope ng-valid-pattern ng-valid-minlength ng-valid-maxlength ng-dirty ng-valid-parse ng-touched" ng-class="{ 'key-value-editor-set-focus-value-1006' : $last }" id="key-value-editor-value-1006-0" name="key-value-editor-value-1006-0" ng-attr-placeholder="{{ (!isReadonlyAny) &amp;&amp; valuePlaceholder || ''}}" maxlength="" ng-model="entry.value" ng-readonly="isReadonlyAny || isReadonlySome(entry.name) || entry.isReadonly" placeholder=""><!-- end ngIf: (!entry.valueAlt) --> 
</div><!-- end ngIf: (!entry.valueIcon) --> 

In der Tat in Web-Browser ich einen Wert eingegeben XYZ haben. Aber die Verwendung xpath wie browser.element(xpath: %Q%*[@value="XYZ"]%) findet kein Element. Auf der anderen Seite, wenn ich browser.element(id: "key-value-editor-value-1006-0").value mache, dann wird der richtige Wert von XYZ zurückgegeben.

Jetzt würden Sie fragen, warum nicht Element nach ID auswählen. Dies liegt daran, dass dies eine Tabelle mit Schlüssel/Wert-Paaren Eingabefeldern ist. Und ich möchte den Wert bearbeiten, indem ich den Wert key als Parameter verwende. Ich möchte keinen separaten Code für jede Kombination, die gerade benötigt wird, behalten.

Frage ist: Gibt es eine Möglichkeit, das Element nur durch Angabe des Schlüsselwerts XYZ mit Watir Selektoren auswählen. d. h., was an Stelle von ??? unten setzen?

browser.element(???)

Update: hier ist Ansatz mit Javascript, aber ich frage mich, ob gleiche kann mit einfachen watir Selektoren erfolgen:

browser.browser.execute_script(%Q%var p = new RegExp("^BARBATRON$"); var el = document.getElementsByTagName("input"); for (var i=0; i<el.length; i++) { if (p.test(el[i].value)) return el[i]; }%).click 
+0

Ich glaube nicht, dass der XPath '% Q% * [@ value =" XYZ "]%' korrekt ist. Ich glaube, es sollte '% Q% // * [@ value =" XYZ "]%' sein. Obwohl ich nicht glaube, dass das die Wurzel Ihres Problems ist. –

Antwort

0

Ich bin nicht sicher, ich verstehe, I don‘ t sehen Sie ein Wertattribut in Ihrem HTML. Vielleicht so etwas wie diese:

browser.element(id: /key-value-editor-value-\d{4}-0/).value 

oder dies:

key = "1006" 
browser.element(id: "key-value-editor-value-#{key}-0").value 
+0

Diese Tabelle wird dynamisch von angularjs generiert. Ich kenne die Schlüsselnummern nicht im Voraus, um sie zur Auswahl zu verwenden. Ich möchte nur das Eingabefeld mit dem Wert "etwas" auswählen. Ich weiß, dass HTML den Wert nicht enthält. Siehe Frage. 'element.value' gibt den Wert korrekt zurück. Aber ich kann keinen Selektor herausfinden, der das Element basierend auf diesem Wert auswählen würde. – akostadinov

2

Dies scheint eine Begrenzung (oder Bug?) Zu sein, in Selen-WebDriver. Offenbar können Sie das Element nur anhand des Werts beim Laden der Seite finden. Sie können das Element nicht mit dem geänderten Wert finden.

# Element can be located using its original value 
browser.text_field(value: 'initial value').exists? 
#=> true 
browser.text_field(xpath: '//*[@value="initial value"]').exists? 
#=> true 

# The value is changed 
browser.text_field.set('new value') 

# Element cannot be found using the new value 
browser.text_field(value: 'new value').exists? 
#=> false 
browser.text_field(xpath: '//*[@value="new value"]').exists? 
#=> false 

# Element can still be found using the original value 
browser.text_field(value: 'initial value').exists? 
#=> true 
browser.text_field(xpath: '//*[@value="initial value"]').exists? 
#=> true 

Die einzige Lösung scheint zu sein, die Elemente durchzulaufen, wie Sie getan haben. Obwohl ich es persönlich lieber in Ruby machen würde:

field = browser.text_fields.find { |t| t.value == 'XYZ' } 
+0

Ehrfürchtig, weißt du, ob es einen bestehenden Bug dafür gibt? Ihre Beispiele zeigen es nicht sehr kritisch, aber eckige Web-App scheint diese Tabelle im laufenden Betrieb zu generieren, daher scheinen alle Werte wie geänderte Werte zu sein. Daher kann watir nicht basierend auf ihnen lokalisieren, unabhängig davon, ob der Benutzer sie geändert hat oder nicht. – akostadinov

+0

Es ist definitiv kein Fehler bei Watir aufgetreten, da das Problem mit Selenium-WebDriver reproduziert werden kann. Ich konnte keinen Selen-Käfer finden. –

+0

Dies ist kein Fehler an sich. Es ist der Unterschied zwischen dem value-Attribut und der value-Eigenschaft. XPath kann nur die Attributwerte abfragen, und wenn der Wert eines Felds aktualisiert wird, wird die Eigenschaft aktualisiert, nicht das Attribut –