从IWebElement获取WebDriver

时间:2014-07-10 19:46:37

标签: c# selenium selenium-webdriver webdriver

是否可以从IWebElement获取WebDriver?

我需要以下扩展名:

public static bool HasFocus(this IWebElement e)
{
    var driver = ((????)e).WebDriver;

    var activeElement = driver.SwitchTo().ActiveElement();
    return Equals(activeElement, e);
}

但不知道是否可以将IWebElement转换为某种类型以获取WebDriver。

7 个答案:

答案 0 :(得分:7)

从IWebElement获取WebDriver的最佳方法是区分Object类型是否为WebElementProxy,如下所示:

if (this.webElement.GetType().ToString() == 
    "OpenQA.Selenium.Support.PageObjects.WebElementProxy")
{
 this.WebDriver = ((IWrapsDriver)this.webElement
                  .GetType().GetProperty("WrappedElement")
                  .GetValue(this.webElement, null)).WrappedDriver;
}
else
{
  this.WebDriver = ((IWrapsDriver)this.webElement).WrappedDriver;
}

答案 1 :(得分:3)

我最近有同样的问题,但发现它有可能:)

这是我的一天:var driver = ((IWrapsDriver)e).WrappedDriver;

注意:如果您使用PageFactory来获取IWebElement,则不可能。

答案 2 :(得分:1)

我无法获得janmbaco的工作答案,但他指出这可能是一个版本问题。

以下内容适用于我PageFactory创建IWebElements和常规创建IWebElements。使用Selenium版本3.5.2和Chrome驱动程序版本2.32.0

static IWebDriver GetWebDriverFromElement(IWebElement element)
{
  var realElement = element.GetType() != typeof(RemoteWebElement)
    ? element
    : ((IWrapsElement)element).WrappedElement;

  return ((IWrapsDriver)realElement).WrappedDriver;
}

答案 3 :(得分:0)

@janmbaco的答案对我有用,只需创建一个static方法即可。

public static IWebDriver GetWebDriverFromElement(this IWebElement element)
{
    IWebDriver driver = null;

    if (element.GetType().ToString() == "OpenQA.Selenium.Support.PageObjects.WebElementProxy")
    {
        driver = ((IWrapsDriver)element
                         .GetType().GetProperty("WrappedElement")
                         .GetValue(element, null)).WrappedDriver;
    }
    else
    {
        driver = ((IWrapsDriver)element).WrappedDriver;
    }
    return driver;
}

用法:

IWebDriver driver = element.GetWebDriverFromElement();

答案 4 :(得分:0)

我对某些建议因InvalidCastException失败而感到麻烦。这似乎只是发行版本中的问题,而不是调试版本。

我发现这很适合我。

    public static IWebDriver GetWebDriver(this IWebElement element)
    {
        return ((IWrapsDriver)((IWrapsElement)element).WrappedElement).WrappedDriver;
    }

答案 5 :(得分:0)

缺少此参考的另一个原因是,如果您使用的是nuget软件包Selenium.WebDriver版本大于v3.141.0。由于某种原因,版本4alpha(目前)中缺少它

答案 6 :(得分:-4)

您可以引用获得此元素的驱动程序。

    IWebDriver driver = element.WrappedDriver;

您也可以直接从element.WrappedDriver

执行驱动程序命令

更新:

RemoteWebDriver实现IWebDriver接口。

ChromeDriverFirefoxDriverIEDriver都扩展了包含RemoteWebDriver接口的IWebDriver类。

同样RemoteWebElement将执行相同的操作并拥有该属性。因此,将实现IWebElement界面的RemoteWebElement更改为IWebElement,您就可以使用该界面了。

一般情况下,尝试将其保留为类实例,因为IWebElement接口实例实际上只有很少的东西。如果将其保留在RemoteWebDriverRemoteWebElement类实例中,您将获得更多选项。