2014-07-10 5 views
5

È possibile ottenere WebDriver da IWebElement?Ottenere WebDriver da IWebElement

Ho bisogno la seguente estensione:

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

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

ma non so è possibile lanciare l'IWebElement a qualche tipo per ottenere WebDriver.

+0

Lo stesso problema si verifica [qui] (https://github.com/seleniumhq/selenium/issues/1490), io credo veramente questa domanda merita più attenzione, non credo che nessuna delle risposte in modo lontano fornire una soluzione realistica. Nemmeno sicuro che ciò possa essere fatto ... –

risposta

-3

È possibile fare riferimento al driver che ha ottenuto l'elemento in questo modo.

IWebDriver driver = element.WrappedDriver; 

È anche possibile eseguire i comandi del driver direttamente dal element.WrappedDriver

UPDATE:

RemoteWebDriver implementa l'interfaccia IWebDriver.

ChromeDriver, FirefoxDriver, IEDriver tutto estendono la classe RemoteWebDriver che include l'interfaccia IWebDriver.

Analogamente, RemoteWebElement farà la stessa cosa e avrà quella proprietà. Quindi cambia il tuo IWebElement a RemoteWebElement che implementa l'interfaccia IWebElement e avrai tutto ciò a tua disposizione.

In generale, provare a mantenerlo un'istanza di classe in quanto l'istanza dell'interfaccia IWebElement ha pochissime cose che effettivamente lo accompagnano. Se la tieni nell'istanza della classe RemoteWebDriver e RemoteWebElement otterrai molte più opzioni.

+0

IWebElement non ha la proprietà WrappedDriver. – msi

+0

Risposta aggiornata con ulteriori chiarimenti. – mutt

+2

Downvoting di questa risposta perché, pur essendo tecnicamente corretto, incoraggia gli utenti a codificare un'implementazione specifica ('RemoteWebDriver') piuttosto che l'interfaccia (' IWebDriver' e 'IWrapsDriver'). Ciò contraddice direttamente il principio di segregazione dell'interfaccia e dovrebbe essere scoraggiato. – JimEvans

2

ho avuto di recente lo stesso problema, ma scoperto è possibile :)

Questo ha reso il mio giorno: var driver = ((IWrapsDriver)e).WrappedDriver;

Nota: Se si utilizza PageFactory per ottenere IWebElement non è possibile, allora.

+3

Ricevo InvalidCastException. Impossibile eseguire il cast dell'oggetto di tipo "OpenQA.Selenium.Support.PageObjects.WebElementProxy" per digitare "OpenQA.Selenium.Internal.IWrapsDriver". – msi

3

Il modo migliore per ottenere il WebDriver da un IWebElement è quello di distinguere se il tipo di oggetto è WebElementProxy o no, in questo modo:

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

Usando il tuo pezzo di codice lancia un 'Impossibile lanciare il proxy trasparente per scrivere 'OpenQA.Selenium.Internal.IWrapsDriver'error .. Immagino sia perché sto usando PageFactory per creare i miei elementi –

+0

Uso anche PageFactory, e questo funziona nel mio caso. Peehaps sarà la versione del selenio che stai usando. – janmbaco

+0

@ SamuelRondeau-Millaire - Ho avuto lo stesso problema con la versione di Selenium che stavo usando. Prova la mia versione qui sotto. – Bronumski

0

non ero in grado di ottenere la risposta di janmbaco a lavorare, ma come egli sottolinea che questo potrebbe essere un problema di versione.

I seguenti lavori per me sia con PageFactory creato IWebElements e creare regolare IWebElements. Utilizzo della versione Selenio 3.5.2 e della versione del driver chrome 2.32.0.

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

    return ((IWrapsDriver)realElement).WrappedDriver; 
}