Как преобразовать данные в список webelement в C# - PullRequest
1 голос
/ 01 мая 2020

Я новичок в C# и использую specflow

Я автоматизирую сценарий, в котором необходимо проверить несколько элементов, если они включены. Эти элементы относятся к разным разделам страницы и имеют разный xpath.

Подход, который я считаю

  1. Преобразование данных в список веб-элементов

  2. Перебрать список с помощью

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

Я планирую оставить имя элемента таким же, как имя, указанное в datatable.

Отредактировал мой вопрос

Редактировать

Мой сценарий

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

Класс страницы:

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

Ответы [ 3 ]

0 голосов
/ 03 мая 2020

Добавление метода к вашей модели страницы позволит вам сохранить инкапсуляцию ваших веб-элементов, но также предоставит параметризованный способ тестирования элементов:

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);
    }
}
0 голосов
/ 12 мая 2020

Вы можете достичь этого с помощью [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 (вот почему вы получаете эту ошибку).

Обратите внимание, что вы не можете конвертировать в IWebElement напрямую, потому что это интерфейс

Также обратите внимание, что вы не можете использовать [StepArgumentTransformation] с таблицами specFlow. Упоминается в Restrictions части в здесь

0 голосов
/ 01 мая 2020

Существует несколько способов преобразования данных в список элементов, вот пример на основе 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();  
...