我已经使用NUnit和Selenium Webdriver设置了一个测试项目,你可以在下面找到一个缩短的版本。
class ByHolder
{
public readonly string name, path;
public readonly Func<string, By> call;
public ByHolder(string name, string path, Func<string, By> call)
{
this.name = name;
this.path = path;
this.call = call;
}
}
class Page
{
private readonly List<ByHolder> LocatorList = new List<ByHolder>();
public Page()
{
SetUpList();
}
private void SetUpList()
{
AddLocator("Button0", "//button0", By.XPath);
AddLocator("Button1", "button1", By.Id);
...
}
public By Get(string locatorName)
{
var holder = LocatorList.FirstOrDefault(p => p.name.Equals(locatorName));
return holder?.call(holder.path);
}
public void AddLocator(string name, string path, Func<string, By> call)
{
LocatorList.Add(new ByHolder(name, path,call ));
}
}
class PersonelDriver : IWebDriver
{
IWebDriver driver = new FirefoxDriver();
Page page = new Page();
public void Click(string locatorName)
{
driver.FindElement(page.Get(locatorName)).Click();
}
...
}
[TestFixture]
class PageTest
{
private readonly PersonelDriver d = new PersonelDriver();
[Test]
public void ClickTest0()
{
d.Click("Button0");
}
[Test]
public void ClickTest1()
{
d.Click("Button1");
}
...
}
正如你可以看到我尝试用最少的变量实现一个缩短的方法,以使更长的测试用例更易于阅读,主要针对外人,但也适用于我,例如。
d.Click("that");
d.EnterText("thisLocator","text");
d.WaitFor("somethingElse");
d.Click("this");
(使用Selenium一段时间后,我发现在测试中反复使用driver.FindElement ...时,事情会变得非常混乱。)
即使很难,我对缩短的版本和可读性感到满意,当然没有自动完成或检查,因为我正在处理字符串而不是IWebElement对象或者已经命名或放入特定getter的引用。 我过去做的是以下,但它只是感觉不对:
class Locators
{
public By GetButton()
{
return By.Id("button");
}
...
}
我想知道在添加例如d.Click(“stringvalue”)时是否有办法实现自动完成或其他字符串值检查;
提前谢谢。