使用watir / cucumber / ruby进行网页测试。问题是没有javascript就无法找到某些字段。
这是我想要匹配的页面的一部分:
<!-- 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) && valuePlaceholder || ''}}" maxlength="" ng-model="entry.value" ng-readonly="isReadonlyAny || isReadonlySome(entry.name) || entry.isReadonly" placeholder=""><!-- end ngIf: (!entry.valueAlt) -->
</div><!-- end ngIf: (!entry.valueIcon) -->
事实上,在网络浏览器中,我输入了一个值XYZ
。但使用像xpath
这样的browser.element(xpath: %Q%*[@value="XYZ"]%)
并不能找到元素。另一方面,如果我browser.element(id: "key-value-editor-value-1006-0").value
,则会返回XYZ
的正确值。
现在你会问为什么不按id选择元素。这是因为这是键/值对输入字段的表。我想通过使用key
值作为参数来编辑值。我不想为每个恰好需要的组合保留单独的代码。
问题是:有没有办法只使用watir选择器提供键值XYZ
来选择元素。即在???
以下放置什么?
browser.element(???)
更新:这是使用javascript的方法,但我想知道是否可以使用普通的watir选择器完成同样的事情:
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 :(得分:2)
这似乎是Selenium-Webdriver中的限制(或错误?)。看起来您只能在页面加载时根据值找到元素。您无法使用更改的值找到元素。
# 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
唯一的解决方案似乎是像你一样迭代元素。虽然我个人更愿意在Ruby中做到这一点:
field = browser.text_fields.find { |t| t.value == 'XYZ' }
答案 1 :(得分:0)
我不确定我理解,我在你的html中没有看到value属性。 也许是这样的:
browser.element(id: /key-value-editor-value-\d{4}-0/).value
或者这个:
key = "1006"
browser.element(id: "key-value-editor-value-#{key}-0").value