获取页面工厂 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"));

谢谢

获取页面工厂 IWebElement By 定位器

是不可能的,因为从来没有保留任何关于你如何找到该元素的参考。当你调用.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 初始化的元素。