简体   繁体   English

如何将数据表转换为 C# 中的 webelement 列表

[英]How to convert the datatable into list of webelement in C#

I am new to C# and I am using specflow我是 C# 的新手,我正在使用 specflow

I am automating a scenario where multiple element needs to be checked if they are enabled.我正在自动化一个场景,如果启用了多个元素,则需要检查它们。 These elements are from different section of the page and have different xpath.这些元素来自页面的不同部分,具有不同的 xpath。

Approach I am thinking is我想的方法是

  1. Convert the datatable to list of webelements将数据表转换为 webelements 列表

  2. Iterate over the list with遍历列表

    foreach (webelement e in list) { element.isEnabled(); }

I am planning to keep the element name same as the name given in datatable.我打算保持元素名称与数据表中给出的名称相同。

Have edited my question编辑了我的问题

Edit编辑

My scenario我的场景

Scenario: Validate G Functionality
    Given Open URL
    When verifies fields
        | Gmail  |
        | Images |

Step Def步骤定义

[When(@"verifies fields")]
        public void WhenVerifiesFields(Table table)

        {
           for(int i=0;i<=table.Rows.Count;i++)
            {


                IWebElement ew= table.Rows[i] as IWebElement;
                Assert.False(ew.Enabled);
            }

Page class:页 class:

[FindsBy(How = How.LinkText, Using = "Gmail")]
    private IWebElement Gmail;

    [FindsBy(How = How.LinkText, Using = "Images")]
    private IWebElement Images;

I am getting following error我收到以下错误

    Validate G Functionality [FAIL]
    [xUnit.net 00:00:06.38]       System.NullReferenceException : Object reference not set to an instance of an object.
    [xUnit.net 00:00:06.38]       Stack Trace:
    [xUnit.net 00:00:06.38]         /*line pointed here is 
 ew.enabled*/C:\Users\StepDefinition\TestStepsOne.cs(53,0): at BillTrackerAutomation.StepDefinition.TestStepsOne.WhenVerifiesFields(Table table)
    [xUnit.net 00:00:06.38]            at lambda_method(Closure , IContextManager , Table )

There are a number of ways to convert datatable to a list of elements, here is a linq based example...有多种方法可以将数据表转换为元素列表,这是一个基于 linq 的示例...

List<WebElement> studentList = new List<WebElement>();  
studentList = (from DataRow dr in dt.Rows  
        select new WebElment()  
        {  
            StudentId = Convert .ToInt32 (dr["StudentId"]),  
            StudentName = dr["StudentName"].ToString(),  
            Address = dr["Address"].ToString(),  
            MobileNo = dr["MobileNo"].ToString()  
        }).ToList();  

Adding a method to your page model would allow you to retain encapsulation of your web elements, but also provide a parameterized way to test the elements:将方法添加到您的页面 model 将允许您保留 web 元素的封装,但还提供了一种测试元素的参数化方法:

public bool IsFieldEnabled(string fieldName)
{
    switch(fieldName)
    {
        case "Gmail":
            return Gmail.Enabled;
        ...
    }
}

The step:步骤:

When verifies fields
    | Field  |
    | Gmail  |
    | Images |

The step definition:步骤定义:

[When(@"verifies fields")]
public void WhenVerifiesFields(Table table)
{
    foreach (var row in table.Rows)
    {
       var isEnabled =  yourPageModel.IsFieldEnabled(row["Field"]);

       Assert.False(isEnabled);
    }
}

You can achieve that with [StepArgumentTransformation]您可以使用[StepArgumentTransformation]来实现

  Scenario Outline: examples with step argument
  Given we have '<Webelements>'

  Examples:
  | Webelements | 
  |     Gmail   |

And step definitions are:步骤定义是:

  using TechTalk.SpecFlow;
  using OpenQA.Selenium.Chrome;
  using OpenQA.Selenium.Support.UI;
  using NUnit.Framework;

[Binding]
   public class Browser
  {
     private readonly BrowserDriver _browserDriver;
     public static  OpenQA.Selenium.IWebDriver driver ;

      public Browser(BrowserDriver browserDriver, FeatureContext featureContext)
    {
        _browserDriver = browserDriver;  //your chrome driver
        driver = _browserDriver._driver;
        _featureContext = featureContext;
        _featureContext.Add("driver", driver);
    }

     [Given(@"we have '(.*)'")] 

    public void webelements(ChromeWebElement o)
    {
       Assert.False(o.Displayed);
    }

    [StepArgumentTransformation]
      public ChromeWebElement convertToWebElement(string c)
      {
        ChromeDriver parent = _featureContext.Get<ChromeDriver>("driver");
        return new ChromeWebElement(parent, c);
    }  

And obviously you get result element is not attached to the page document because I just used a Gmail for test purpose显然你得到的结果element is not attached to the page document ,因为我只是使用Gmail进行测试

But it is converting string to ChromeWebElement class (thats why you get that error).但它正在将字符串转换为ChromeWebElement class (这就是您收到该错误的原因)。

Note that you can not convert to IWebElement directly because it is an interface注意不能直接转换成IWebElement ,因为它是一个接口

Also, note that you can not use [StepArgumentTransformation] with specFlow tables.另外,请注意,您不能将[StepArgumentTransformation]与 specFlow 表一起使用。 It is mentioned in Restrictions part in here此处Restrictions部分中提到了

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM