2014-07-10 116 views
5

是否可以从IWebElement获取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。

+0

发生同样的问题[这里](https://github.com/seleniumhq/selenium/issues/1490),我真的相信这个问题值得更多的关注,我不认为任何的答案,以便远远提供了一个现实的解甚至不知道这可以做... –

回答

-3

你可以参考得到这个元素的驱动程序。

IWebDriver driver = element.WrappedDriver; 

你也可以执行驱动程序从element.WrappedDriver

UPDATE命令直接:

RemoteWebDriver实现IWebDriver接口。

ChromeDriverFirefoxDriverIEDriver所有扩展RemoteWebDriver类型,其包括IWebDriver接口。

同样RemoteWebElement将做同样的事情,并具有该属性。因此,将您的IWebElement更改为RemoteWebElement,该接口实现了IWebElement界面,您将可以使用该界面。

一般情况下,尽量将它保留为一个类实例,因为IWebElement接口实例几乎没有实际的功能。如果将它保留在RemoteWebDriverRemoteWebElement类实例中,您将获得更多选项。

+0

IWebElement没有WrappedDriver属性。 – msi

+0

更新的答案进一步说明。 – mutt

+2

Downvoting这个答案,因为虽然在技术上是正确的,它鼓励用户编码到特定的实现('RemoteWebDriver')而不是接口('IWebDriver'和'IWrapsDriver')。这直接违反界面隔离原则,应该不鼓励。 – JimEvans

2

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

这让我的日子var driver = ((IWrapsDriver)e).WrappedDriver;

注:如果您使用PageFactory得到IWebElement这是不可能的,那么。

+3

我收到InvalidCastException。无法投射“OpenQA.Selenium.Support.PageObjects.WebElementProxy”类型的对象以键入“OpenQA.Selenium.Internal.IWrapsDriver”。 – msi

3

从一个IWebElement得到webdriver的最好的办法是区分对象类型是否是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

使用你的一段代码会抛出一个'无法转换透明代理类型'OpenQA.Selenium.Internal.IWrapsDriver''error ..我想这是因为我使用PageFactory来创建我的元素 –

+0

我也使用PageFactory,而这在我的情况下工作。可能它会成为你使用硒的版本。 – janmbaco

+0

@ SamuelRondeau-Millaire - 我和我使用的Selenium版本有同样的问题。试试我的版本。 – Bronumski

0

我是不是能够得到janmbaco的答复工作,但作为他指出这可能是一个版本问题。

以下作品适用于我和PageFactory创建的IWebElements和常规创建IWebElements。使用硒版本3.5.2和铬驱动程序版本2.32.0

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

    return ((IWrapsDriver)realElement).WrappedDriver; 
} 
相关问题