【问题标题】:Neat way to use my XPaths in SpecFlow在 SpecFlow 中使用我的 XPath 的巧妙方法
【发布时间】:2016-05-07 16:08:03
【问题描述】:

我目前有一些情况不可避免地使用 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 一个特定的名称,然后在我的场景中使用它们?

希望你能帮忙!

【问题讨论】:

  • 在 java 中,通常我会将定位器放在带有名称的属性文件中,我会调用该名称..mkyong.com/java/java-properties-file-examples
  • 两件事.. a) 使用 gherkin 是用可理解的语言编写测试。比起在 gherkin 中编写 xpath(对我来说这破坏了 gherkin 的使用),考虑添加诸如“并且用户将 'testvan' 插入字段 'Field_name'”之类的步骤。您可以维护一个散列来将这些参数映射到 xpath 或任何其他形式的定位器。 b)形成xpath时,尝试在中间使用'//'而不是编写完整的层次结构。编写完整的层次结构会使您的定位器变得脆弱。
  • 添加到上述评论:1) 应尽可能避免使用//*,因为它们会影响性能。在您的情况下,您知道元素的 ID,因此您也应该知道标签(例如 //div[@id=...]); 2) 沿路径使用索引使 xpath 变得脆弱;如前所述,跳过中间的元素,或提供它们的 ID/唯一属性,而不是索引; 3)您真正关心的元素应该真正被识别(通过ID或其他一些属性)。所以你的 xpath 可能看起来像 //div[@id="content"]//select[@some_prop='someval'] - 突然不那么凌乱了?

标签: c# selenium specflow gherkin


【解决方案1】:

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

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

这将使您能够在更高的抽象级别上工作,并使您的 Gherkin 不那么脆弱。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-19
      • 1970-01-01
      • 2021-03-05
      • 2021-07-28
      • 1970-01-01
      • 2018-12-31
      • 2014-11-06
      相关资源
      最近更新 更多