当对象 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="" 正在接受一个常数值并且你有一个变量在里面。

为了使用 idxpath 或其他变量中的变量来实现,您可以创建类型为 By 或 [=21 的 属性 方法=] 取决于你之后需要做什么(虽然 By 是首选,因为你可以在你的 WebDriverWaits 中使用它作为参数): 对于 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");