我有一种情况,我希望得到' 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"));
谢谢
答案 0 :(得分:2)
这是不可能的,因为从来没有任何关于如何找到该元素的参考。当你致电.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;
}
}
}
答案 1 :(得分:-1)
感谢您的回复,但我使用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初始化的元素。