代码之家  ›  专栏  ›  技术社区  ›  Anand

在SpecFlow中使用XPath的简洁方式

  •  0
  • Anand  · 技术社区  · 9 年前

    我目前有一些场景,其中不可避免地要使用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 回复  |  直到 9 年前
        1
  •  3
  •   Thomas Sundberg    9 年前

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

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

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

        2
  •  1
  •   Andreas Willich    9 年前

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

    在那里创建一个字典并预先填充。 在要素中使用字典的键,并在字典中进行查找。

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