2015-02-09 129 views
0

我想使用WebElement作为根来代替驱动程序查找元素。我知道这是可能的,因为WebElement和WebDriver都扩展了SearchContext类。但我希望能够有一个像这样的搜索。您可以将WebElement转换为WebDriver吗?

WebDriver chromeDriver = new ChromeDriver(); 
WebDriver driver = chromeDriver; 

// Set a new search root 
public void setSearchRoot(){ 
    if(i want a element as a root){ 
     this.driver = (WebDriver)this.driver.findElement(By.xpath("PATH")); 
    }else{ 
     this.driver = chromeDriver; 
    } 
} 

//find a element 
public void findMyElement(){ 
    this.driver.findElement(By.xpath("PATH")); 
} 

,而不是像这样

WebDriver driver = new ChromeDriver(); 
WebDriver rootElement = this.driver.findElement(By.xpath("PATH")); 

//find a element 
public void findMyElement(){ 
    if(i want a element as a root){   
    this.rootElement.findElement(By.xpath("PATH")); 
    }else{ 
    this.driver.findElement(By.xpath("PATH")); 
    } 
} 

它看起来有点混乱,但基本上我希望能够设置一个WebElement为出发点,而不是一个webdriver的,而不必如果要做一个声明或有两种不同的方法,只要我想要一个元素。因为有时我想使用WebDriver作为根,有时也使用Webelement,而不必使用get代码改变任何内容。以某种方式可能吗?是的,我知道这可能不是最佳实践,只是想知道是否有可能。

回答

0

不,WebElementWebDriver不是彼此的后代。

如果您IWebElement恰好是一个RemoteWebElement,那么你就可以得到IWebDriver

var remoteElement = (RemoteWebElement)element; 
var webDriver = remoteElement.WrappedDriver; 
0

使用OpenQA.Selenium.Support.UI;

如果元件是一种类型的ISearchContextIWebElement

然后此流延为我工作

VAR驱动=((IWrapsDriver)元件).WrappedDriver;

0

如果你只需要使用“根”找到下它的元素,而不是做其他的webdriver具体的东西(如导航或管理选项或超时),可以使用SearchContext而不是WebDriver

您的代码应该是这样的:

WebDriver chromeDriver = new ChromeDriver(); 
SearchContext driver = chromeDriver; // Use SearchContext instead of WebDriver 

// Set a new search root 
public void setSearchRoot() { 
    if(i want a element as a root) { 
     this.driver = this.driver.findElement(By.xpath("PATH")); // No cast needed 
    } else { 
     this.driver = chromeDriver; 
    } 
} 

//find a element 
public void findMyElement() { 
    this.driver.findElement(By.xpath("PATH")); 
} 

我在我自己的项目,我经常不得不期待WebDriver类型的参数时,真的只要求它findElements方法发现。通过将类型更改为SearchContext,我的实用程序变得更加灵活。

public WebElement findMyElement(SearchContext webDriver) { 
    return webDriver.findElement(By.xpath("PATH")); 
} 

使用方法如下:

WebDriver webDriver = new ChromeDriver(); 
WebElement customElement = findMyElement(webDriver); 
WebElement nestedElement = findMyElement(customElement); 
相关问题