当对象 ID 是动态的时,如何在页面工厂中初始化 FindsBy
How to initialize FindsBy in page factory when the Object IDs are dynamic
我的 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; }
您需要将识别元素的方式从 Id
更改为 Xpath
。
[FindsBy(How = How.Xpath, Using = "your_xpath_here")] public IWebElement contactBox { get; set; }
然后给你一个简短的解释为什么它不起作用,这是因为 Using=""
正在接受一个常数值并且你有一个变量在里面。
为了使用 id
、xpath
或其他变量中的变量来实现,您可以创建类型为 By
或 [=21 的 属性 方法=] 取决于你之后需要做什么(虽然 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");
我的 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; }
您需要将识别元素的方式从 Id
更改为 Xpath
。
[FindsBy(How = How.Xpath, Using = "your_xpath_here")] public IWebElement contactBox { get; set; }
然后给你一个简短的解释为什么它不起作用,这是因为 Using=""
正在接受一个常数值并且你有一个变量在里面。
为了使用 id
、xpath
或其他变量中的变量来实现,您可以创建类型为 By
或 [=21 的 属性 方法=] 取决于你之后需要做什么(虽然 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");