获取页面工厂 IWebElement By 定位器
本文关键字:By 定位器 IWebElement 工厂 获取 | 更新日期: 2023-09-27 18:36:56
我有一个情况,我想获取用于查找元素的"By"定位器。我使用PageFactory初始化了元素。
像这样:
[TestClass]
public class Page
{
private IWebDriver _driver;
[FindsBy(How = How.Id, Using = "Username")]
public IWebElement TxtUsername { get; set; }
public Page(IWebDriver driver)
{
_driver = driver;
PageFactory.InitElements(_driver, this);
}
public void DoSomething()
{
By locator = GetLocator(TxtUsername); //Not real function
IWebElement e = _driver.FindElement(locator);
}
}
我知道我可以从 GetAttribute 获取 ID,但是如果我使用 XPath 找到元素或元素根本没有 ID,它就无法解决。
喜欢这个:
By locator = By.Id(element.GetAttribute("id"));
谢谢
这
是不可能的,因为从来没有保留任何关于你如何找到该元素的参考。当你调用.FindElement
时,它只对查找元素并返回它感兴趣,它对记住你是如何找到它的并不感兴趣。
您唯一的解决方案是通过创建一个记录引用的类来自己保留引用。
像这样:
public class SeleniumElement : IWrapsElement
{
private IWebElement cachedElement;
private By mechanismUsed;
public SeleniumElement(IWebElement element, By locatorUsed)
{
mechanismUsed = locatorUsed;
cachedElement = element;
}
public IWebElement WrappedElement
{
get
{
return cachedElement;
}
}
}
感谢您的回复,但我设法使用 Reflection 来做我想做的事情。
这是我在 C# 中的实现:
private By GetLocator(IWebElement element)
{
// Retrieve a FieldInfo instance corresponding to the field
FieldInfo field = element.GetType().GetField("bys", BindingFlags.Instance | BindingFlags.NonPublic);
// Retrieve the value of the field, and cast as necessary
return ((List<By>)field.GetValue(element))[0];
}
注意:此实现仅适用于使用 PageFactory 初始化的元素。