2014-07-10 88 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; 
} 
相關問題