我是C#的新手,我使用的是specflow
我正在自动化一个场景,其中如果启用了多个元素,则需要对其进行检查。这些元素来自页面的不同部分,具有不同的xpath。
我认为方法是
-
将数据表转换为网络元素列表
-
使用遍历列表
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
部分提到了这一点