当对象ID是动态的时,如何在页面工厂中初始化FindsBy

时间:2016-08-24 14:06:26

标签: c# selenium-webdriver pageobjects

我有我的ID代码:

public int counter = 0;
public void AddClick(){
counter = counter + 1;
 driver.FindElement(By.Id(String.Format("btnAdd{0}_btnAddExpense", counter))).Click();
 Console.WriteLine("I am clicked {0} times!", counter);
}

如何在FindsBy中声明这一点?显然,这不起作用:

 [FindsBy(How = How.Id, Using = "(String.Format("btnAdd{0}_btnAddExpense", counter")]
 public IWebElement contactBox { get; set; }

1 个答案:

答案 0 :(得分:2)

您需要更改从IdXpath识别元素的方式。

[FindsBy(How = How.Xpath, Using = "your_xpath_here")] public IWebElement contactBox { get; set; }

为了简要解释一下它为什么不起作用,这是因为Using=""接受一个常数值而你内部有一个变量。

为了使用idxpath或其他内容中的变量来执行此操作,您可以创建类型为ByIWebElement的属性方法,具体取决于您之后需要做(虽然首选By是因为你可以在WebDriverWait s中使用它作为参数: 对于By;

public By ContactBoxBy(string counter)
{
    get {return By.Id("btnAdd{0}_btnAddExpense" + counter);}
}

IWebElement

public IWebElement ContactBox
{
    get {return driver.FindElement(By.Id("btnAdd{0}_btnAddExpense" + counter));}
}

这样您就不再需要[FindsBy]属性。

用法:

如果您想在联系人栏中输入文字,请执行以下操作:

driver.FindElement(ContactBoxBy(counter)).SendKeys("text to be inserted");

或直接使用IWebElement

ContactBox.SendKeys("text to be inserted");