是否可以从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 :(得分:7)
从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;
}
答案 1 :(得分:3)
我最近有同样的问题,但发现它有可能:)
这是我的一天:var driver = ((IWrapsDriver)e).WrappedDriver;
注意:如果您使用PageFactory来获取IWebElement,则不可能。
答案 2 :(得分:1)
我无法获得janmbaco的工作答案,但他指出这可能是一个版本问题。
以下内容适用于我PageFactory
创建IWebElements
和常规创建IWebElements
。使用Selenium版本3.5.2
和Chrome驱动程序版本2.32.0
。
static IWebDriver GetWebDriverFromElement(IWebElement element)
{
var realElement = element.GetType() != typeof(RemoteWebElement)
? element
: ((IWrapsElement)element).WrappedElement;
return ((IWrapsDriver)realElement).WrappedDriver;
}
答案 3 :(得分:0)
@janmbaco的答案对我有用,只需创建一个static
方法即可。
public static IWebDriver GetWebDriverFromElement(this IWebElement element)
{
IWebDriver driver = null;
if (element.GetType().ToString() == "OpenQA.Selenium.Support.PageObjects.WebElementProxy")
{
driver = ((IWrapsDriver)element
.GetType().GetProperty("WrappedElement")
.GetValue(element, null)).WrappedDriver;
}
else
{
driver = ((IWrapsDriver)element).WrappedDriver;
}
return driver;
}
用法:
IWebDriver driver = element.GetWebDriverFromElement();
答案 4 :(得分:0)
我对某些建议因InvalidCastException失败而感到麻烦。这似乎只是发行版本中的问题,而不是调试版本。
我发现这很适合我。
public static IWebDriver GetWebDriver(this IWebElement element)
{
return ((IWrapsDriver)((IWrapsElement)element).WrappedElement).WrappedDriver;
}
答案 5 :(得分:0)
缺少此参考的另一个原因是,如果您使用的是nuget软件包Selenium.WebDriver版本大于v3.141.0。由于某种原因,版本4alpha(目前)中缺少它
答案 6 :(得分:-4)
您可以引用获得此元素的驱动程序。
IWebDriver driver = element.WrappedDriver;
您也可以直接从element.WrappedDriver
更新:
RemoteWebDriver
实现IWebDriver
接口。
ChromeDriver
,FirefoxDriver
,IEDriver
都扩展了包含RemoteWebDriver
接口的IWebDriver
类。
同样RemoteWebElement
将执行相同的操作并拥有该属性。因此,将实现IWebElement
界面的RemoteWebElement
更改为IWebElement
,您就可以使用该界面了。
一般情况下,尝试将其保留为类实例,因为IWebElement接口实例实际上只有很少的东西。如果将其保留在RemoteWebDriver
和RemoteWebElement
类实例中,您将获得更多选项。