2017-06-21 99 views
0

在我的硒测试中,我需要找到具有特定值的输入元素。如何使用XPath测试输入值

<div id="product-list"> 
    <!-- ko foreach: $data.productItems --> 
    <div class="product-list-item"> 
     <input data-bind="value: $data.name"> 
    </div> 
    <!-- /ko --> 
</div> 

我硒测试使用下面的代码来找到输入元素具有特定名称:

UI是由下面的代码呈现

By xpath = By.xpath(".//div[@id='product-list']//div[contains(@class, 'product-list-item')]/input[@value='Product Name']"); 
WebElement element = browser.getWebDriver().findElement(xpath); 

的问题是,元素是自input[value='Product Name]"总是空将始终失败,因为在输入中没有“值”属性。只有属性“价值”,你可以通过它看到,例如Chrome中的“开发者工具”。

我有一些例子来研究为什么“价值”没有正确处理。

jsfiddle example

是否有一些建议如何找到正确的输入元素?或者至少说明如何处理值属性vs值属性?

EDIT1:更新例如

EDIT3:不是问题造成无法XPATH访问DOM属性,而且只能够处理HTML(或任何其他XGML在input[@value='Product Name']

EDIT2固定失踪@ )标签结构及其属性?由于淘汰赛仅将真实值推入DOM属性,因此无法通过XPATH访问。

+1

value属性让浏览器设置输入的初始值,所以你不想尝试通过它来选择。使用硒来查找类product-list-item中的所有元素,并遍历它们以获得具有您关心的值的元素。或者执行JavaScript以返回具有所需值的元素。我认为第一种方法更好。 –

+0

@BryanEuton属性值仅用于初始值。这解释了很多,谢谢。但迭代是不可能的。我只有一个单一的xpath必须返回节点(如果存在)。 –

+0

getWebDriver()应该有另一个名为findElements的方法,它需要xpath选择器 –

回答

0

您的XPath的最后一部分是不正确的:

/input[value='Product Name'] 

这意味着你正在寻找一个<input>它是value属性等于Product Name

您要搜索的data-bind属性改为:

/input[@data-bind='value: Product Name'] 

检索WebElement后,得到<input>的值(不是value属性):

element.getAttribute("value") 
+0

[at] data-bind是knockout.js用于将数据模型绑定到html元素的特殊属性,有许多相同的输入只有它们的值不同,我不能遍历它们来选择正确的输入这就是为什么我需要在xpath中使用@value –

0

我猜测,你犯了一些错字或不知道这是否是故意的。您可以参考下面的代码,看看是否有帮助

By xpath = By.xpath(".//div[@id='product-list']//div[contains(@class, 'product-list-item')]/input[@data-bind='value: Product Name']"); 
WebElement element = browser.getWebDriver().findElement(xpath); 
element.getAttribute("value"); 
+0

@ data-bind是knockout.js用于将数据模型绑定到html元素的特殊属性,这是错误的方式,也是element.getAttribute(“价值“)不是一种前进的方式,我不需要价值,我只需要测试它。 –