如何在C#中将数据表转换为Web元素列表



我是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 |

步骤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:UsersStepDefinitionTestStepsOne.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();  

在页面模型中添加一个方法可以保留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类(这就是您出现该错误的原因(。

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

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

最新更新