[英]How to convert the datatable into list of webelement in C#
我是 C# 的新手,我正在使用 specflow
我正在自动化一个场景,如果启用了多个元素,则需要检查它们。 这些元素来自页面的不同部分,具有不同的 xpath。
我想的方法是
将数据表转换为 webelements 列表
遍历列表
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.