你能将一个WebElement转换为WebDriver吗?

5

我希望使用WebElement作为根元素来查找元素,而不是使用driver。我知道这是可能的,因为WebElement和WebDriver都扩展了SearchContext类。但我希望能够进行以下搜索。

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设置为起点,而不必进行if语句或使用两种不同的方法来获取元素,并且无论何时我想要获取元素,有时候我想使用WebDriver作为根节点,有时候我想使用WebElement作为根节点,而这一切都不需要改变代码。这是否可能呢?是的,我知道这可能不是最佳实践,只是想知道是否可能。

3个回答

4

使用 OpenQA.Selenium.Support.UI;

如果元素是ISearchContextIWebElement类型,那么这个转换对我来说是有效的。

var driver = ((IWrapsDriver)element).WrappedDriver;


1
不,WebElement和WebDriver并非彼此的子类。
如果你的IWebElement恰好是RemoteWebElement,则可以通过以下方式获取IWebDriver。
var remoteElement = (RemoteWebElement)element;
var webDriver = remoteElement.WrappedDriver;

0
如果您只需要使用“root”查找其下的元素而不执行其他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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接