在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一个特定的名称,然后在我的场景中使用它们?
希望你能帮助!
答
你可以在你的绑定类中解决这个问题。
创建一个字典并预先填写它。 在你的特性中使用字典的关键字并查找字典。
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,页面对象或类似的东西到您的步骤。
这将允许你在更高的抽象水平上工作,并会使你的小黄瓜变得更脆弱。
在java中,通常我会将定位器放在属性文件中的名称,我会叫这个名称.. http://www.mkyong.com/java/java-properties-file-examples/ –
两件事.. .. a )使用小黄瓜是用可理解的语言编写测试。除了在小黄瓜中写入xpaths(这对我来说破坏了小黄瓜的使用)之后,考虑在字段'Field_name'中添加像“和用户插入'testvan'的步骤”。您可以维护一个散列来将这些参数映射到xpath或任何其他形式的定位器。 b)在形成xpath时,尝试在中间使用'//'而不是写入完整的层次结构。编写完整的层次结构会使得定位器变得脆弱。 – Dileep17
添加到上面的评论:1)应尽可能避免使用'// *',因为它们达到了性能。在你的情况下,你知道元素的ID,所以你应该知道这个标签(例如'// div [@id = ...]'); 2)沿路径使用索引使xpath变得脆弱;如前面所述的评论,跳过中间的元素,或者提供它们的ID /独特属性,而不是索引; 3)你真正关心的元素应该确定(通过ID或其他属性)。所以你的xpath可能看起来像'// div [@ id =“content”] // select [@ some_prop ='someval']' - 突然不那么乱? –