繁体   English   中英

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

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

我是 C# 的新手,我正在使用 specflow

我正在自动化一个场景,如果启用了多个元素,则需要检查它们。 这些元素来自页面的不同部分,具有不同的 xpath。

我想的方法是

  1. 将数据表转换为 webelements 列表

  2. 遍历列表

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

我打算保持元素名称与数据表中给出的名称相同。

编辑了我的问题

编辑

我的场景

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

步骤定义

[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);
            }

页 class:

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

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

我收到以下错误

    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 )

有多种方法可以将数据表转换为元素列表,这是一个基于 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();  

将方法添加到您的页面 model 将允许您保留 web 元素的封装,但还提供了一种测试元素的参数化方法:

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

步骤:

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

步骤定义:

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

       Assert.False(isEnabled);
    }
}

您可以使用[StepArgumentTransformation]来实现

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

  Examples:
  | Webelements | 
  |     Gmail   |

步骤定义是:

  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);
    }  

显然你得到的结果element is not attached to the page document ,因为我只是使用Gmail进行测试

但它正在将字符串转换为ChromeWebElement class (这就是您收到该错误的原因)。

注意不能直接转换成IWebElement ,因为它是一个接口

另外,请注意,您不能将[StepArgumentTransformation]与 specFlow 表一起使用。 此处Restrictions部分中提到了

暂无
暂无

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

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