2014-07-10 10 views
5

Czy można pobrać WebDriver z IWebElement?Pierwsze WebDriver od IWebElement

muszę następujące rozszerzenia:

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

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

Ale nie wiem, czy to możliwe, aby rzucić IWebElement do pewnego rodzaju dostać WebDriver.

+0

Ten sam problem występuje [tutaj] (https://github.com/seleniumhq/selenium/issues/1490), naprawdę wierzę, kwestia ta zasługuje na więcej uwagi, nie sądzę, któregokolwiek z odpowiedziami tak daleko zapewniają realistyczne rozwiązanie. Nawet nie jestem pewien, czy można to zrobić ... –

Odpowiedz

-3

Możesz odwołać się do sterownika, który otrzymał taki element.

IWebDriver driver = element.WrappedDriver; 

Można też po prostu wykonywać polecenia kierowcy bezpośrednio z element.WrappedDriver

UPDATE:

RemoteWebDriver implementuje interfejs IWebDriver.

ChromeDriver, FirefoxDriver, IEDriver wszystkie rozciągają klasę RemoteWebDriver który zawiera interfejs IWebDriver.

Podobnie RemoteWebElement zrobi to samo i ma tę własność. Zmień więc swój IWebElement na RemoteWebElement, który implementuje interfejs IWebElement, a otrzymasz dostęp do niego.

Ogólnie postaraj się zachować instancję klasy, ponieważ instancja interfejsu IWebElement ma bardzo mało rzeczy, które faktycznie z nią współpracują. Jeśli zatrzymasz go w instancji klasy RemoteWebDriver i RemoteWebElement, uzyskasz znacznie więcej opcji.

+0

IWebElement nie ma właściwości WrappedDriver. – msi

+0

Zaktualizowana odpowiedź z dodatkowymi wyjaśnieniami. – mutt

+2

Odwołanie tej odpowiedzi, ponieważ jest technicznie poprawne, zachęca użytkowników do kodowania do konkretnej implementacji ('RemoteWebDriver'), a nie do interfejsu (' IWebDriver' i 'IWrapsDriver'). Jest to wprost sprzeczne z zasadą podziału na interfejsy i powinno być zniechęcane. – JimEvans

2

miałem niedawno ten sam problem, ale okazało się, że to możliwe :)

To mój dzień: var driver = ((IWrapsDriver)e).WrappedDriver;

UWAGA: W przypadku korzystania z PageFactory dostać IWebElement nie jest możliwe wtedy.

+3

Otrzymuję InvalidCastException. Nie można rzucić obiektu typu "OpenQA.Selenium.Support.PageObjects.WebElementProxy", aby wpisać "OpenQA.Selenium.Internal.IWrapsDriver". – msi

3

Najlepszym sposobem, aby uzyskać WebDriver z IWebElement jest rozróżnienie, czy typ obiektu jest WebElementProxy czy nie, jak to:

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

Użycie fragmentu kodu powoduje, że 'Nie można rzutować przezroczystego proxy na typ 'OpenQA.Selenium.Internal.IWrapsDriver''error .. Myślę, że to dlatego, że używam PageFactory do tworzenia moich elementów. –

+0

Używam również PageFactory, a to działa w moim przypadku. Być może będzie to wersja selenu, którego używasz. – janmbaco

+0

@ SamuelRondeau-Millaire - Miałem ten sam problem z wersją Selenium, której używałem. Wypróbuj moją wersję poniżej. – Bronumski

0

I nie był w stanie uzyskać odpowiedź janmbaco do pracy, ale jako zwraca uwagę, że może to być problem z wersją.

Następujące utwory dla mnie z PageFactory utworzonych i regularne tworzenie IWebElements. Używanie wersji Selenium 3.5.2 i wersji sterownika chrome 2.32.0.

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

    return ((IWrapsDriver)realElement).WrappedDriver; 
}