从IWebElement获取WebDriver

msi*_*msi 7 c# selenium webdriver selenium-webdriver

是否可以从IWebElement获取WebDriver?

我需要以下扩展名:

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

    var activeElement = driver.SwitchTo().ActiveElement();
    return Equals(activeElement, e);
}
Run Code Online (Sandbox Code Playgroud)

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

小智 8

从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;
}
Run Code Online (Sandbox Code Playgroud)


Bar*_*ala 5

我最近遇到了同样的问题,但发现这是可能的:)

这件事情让我感到很快乐: var driver = ((IWrapsDriver)e).WrappedDriver;

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

  • 我收到 InvalidCastException。无法将“OpenQA.Selenium.Support.PageObjects.WebElementProxy”类型的对象转换为“OpenQA.Selenium.Internal.IWrapsDriver”。 (3认同)

mut*_*utt -4

您可以像这样引用获取该元素的驱动程序。

    IWebDriver driver = element.WrappedDriver;
Run Code Online (Sandbox Code Playgroud)

您也可以直接从element.WrappedDriver

更新:

RemoteWebDriver实现IWebDriver接口。

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

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

一般来说,尝试将其保留为类实例,因为 IWebElement 接口实例几乎没有真正与之相关的东西。如果将其保留在RemoteWebDriverandRemoteWebElement类实例中,您将获得更多选择。

  • 否决这个答案是因为,虽然技术上是正确的,但它鼓励用户编码特定的实现(“RemoteWebDriver”)而不是接口(“IWebDriver”和“IWrapsDriver”)。这直接违背了接口隔离原则,应该予以阻止。 (2认同)
  • 我无法将我的元素转换为 RemoteWebElement,因为我正在使用 PageFactory 使用 IWebElements 初始化页面,并且它的类型为 OpenQA.Selenium.Support.PageObjects.WebElemetnProxy 这是内部的,我无法访问它来转换为它。 (2认同)