在SpecFlow中使用我的XPath的巧妙方法

时间:2016-05-06 12:05:47

标签: c# selenium specflow gherkin

我目前有几个场景,它不可避免地使用XPath来定位元素。这带来的不那么巧妙的事情之一是我的specflow Gherkin代码变得非常混乱。

例如,现在我有:

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提供一个特定的名称,然后在我的场景中使用它们?

希望你能帮忙!

2 个答案:

答案 0 :(得分:3)

听起来你的Gherkin描述了应该如何做而不是应该做什么。

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

这将允许您在更高的抽象级别上工作,并使您的小黄瓜变得不那么脆弱。

答案 1 :(得分:1)

您可以在绑定类中解决此问题。

在那里创建一个词典并预填充它。 在功能中使用字典的键,然后查找字典。

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];
     ...
}