在SpecFlow中使用我的XPath的简单方法

问题描述:

我目前有一些场景,它不可避免地使用XPath来定位元素。其中一个不太完美的事情是,我的specher Gherkin代码变得非常混乱。在SpecFlow中使用我的XPath的简单方法

例如,现在我有:

And User inserts 'testvan' into field with Xpath '//* [@id="content"]/div/div/div[1]/table/tbody/tr[3]/td[3]/div[1]/table/tbody/tr[5]/td[2]/input' 

我恨这是诚实的。有什么方法可以在我的SpecFlow中创建一个数据集并将所有的XPath放入它中,给我所有的XPath一个特定的名称,然后在我的场景中使用它们?

希望你能帮助!

+0

在java中,通常我会将定位器放在属性文件中的名称,我会叫这个名称.. http://www.mkyong.com/java/java-properties-file-examples/ –

+1

两件事.. .. a )使用小黄瓜是用可理解的语言编写测试。除了在小黄瓜中写入xpaths(这对我来说破坏了小黄瓜的使用)之后,考虑在字段'Field_name'中添加像“和用户插入'testvan'的步骤”。您可以维护一个散列来将这些参数映射到xpath或任何其他形式的定位器。 b)在形成xpath时,尝试在中间使用'//'而不是写入完整的层次结构。编写完整的层次结构会使得定位器变得脆弱。 – Dileep17

+0

添加到上面的评论:1)应尽可能避免使用'// *',因为它们达到了性能。在你的情况下,你知道元素的ID,所以你应该知道这个标签(例如'// div [@id = ...]'); 2)沿路径使用索引使xpath变得脆弱;如前面所述的评论,跳过中间的元素,或者提供它们的ID /独特属性,而不是索引; 3)你真正关心的元素应该确定(通过ID或其他属性)。所以你的xpath可能看起来像'// div [@ id =“content”] // select [@ some_prop ='someval']' - 突然不那么乱? –

你可以在你的绑定类中解决这个问题。

创建一个字典并预先填写它。 在你的特性中使用字典的关键字并查找字典。

Dictionary<string,string> _xpaths = new Dictionary<string,string>() {{ "XPaht1", "//* [@id=""content""]/div/div/div[1]/table/tbody/tr[3]/td[3]/div[1]/table/tbody/tr[5]/td[2]/input"}} 

[Given("And User inserts '(.*)' into field with Xpath '(*.')")] 
public void GivenXPath(string user, string xpathKey) 
{ 
    var xpath = _xpaths[xpathKey]; 
    ... 
} 

这听起来像你的小黄瓜描述了应该怎么做,而不是应该做什么。

我想你想问自己什么任务的用户正在执行和描述。这使您有机会隐藏支持类中的丑陋xpath,页面对象或类似的东西到您的步骤。

这将允许你在更高的抽象水平上工作,并会使你的小黄瓜变得更脆弱。