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

本文关键字:工厂 findby 初始化 id 对象 动态 | 更新日期: 2023-09-27 18:03:51

我有我的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);
}

如何在findby中声明这个?显然,这不起作用:

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

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

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

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

给你一个简短的解释为什么它不工作,这是因为Using=""接受一个常量,而你有一个变量在里面。

为了在你的id, xpath或其他东西中使用变量,你可以根据你需要做的事情创建类型ByIWebElement的属性方法(尽管By是首选,因为你可以在你的WebDriverWait s中使用它的参数):For By;

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

For 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");