watir,按值获取元素

时间:2016-09-05 15:15:57

标签: angularjs watir web-testing

使用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) &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) -->

事实上,在网络浏览器中,我输入了一个值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

2 个答案:

答案 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