Search Context是selenium中最高级的接口,它由另一个称为Web Driver的接口扩展。
在远程WebDriver类中实现了搜索上下文的抽象方法-All和Web驱动接口。
-All浏览器相关类,如Firefox Driver、Chrome Driver等,扩展了远程Webdriver类。
根据上面的stmt,远程web驱动程序类如何定义搜索上下文接口和webdriver接口中定义的所有抽象方法。因为函数driver.get/driver.title的实现细节因浏览器不同而不同,如下所示
为什么chromedriver或firefoxdriver类不能直接扩展webdriver接口?为什么remotedriver类保持在webdriver接口和chromedriver/firefoxdriver/iedriver类之间
发布于 2019-04-03 10:02:04
虽然每个浏览器在驱动程序级别(chromedriver.exe
、geckodriver.exe
、IEDriverServer.exe
等)的实现可能不同,但语言绑定执行命令的机制对于所有浏览器都是相同的。因此,虽然每个特定于浏览器的驱动程序类都可以直接实现接口,但每个驱动程序类中的代码将是相同的。使用RemoteWebDriver
作为基类可以消除重复的代码。此外,RemoteWebDriver
类还有一个额外的好处,即可以在运行在与执行语言绑定代码的机器不同的(远程)机器上的浏览器上执行WebDriver命令。
此外,SearchContext
接口定义了两个方法:findElement
和findElements
。WebDriver
接口并不是唯一扩展它的接口;WebElement
也是如此。查找已定位元素的元素子元素是完全有效的。考虑以下示例HTML片段:
<div class="foo">
I don’t want to select this div.
</div>
<div class="bar">
I need to do something with this div.
<div class="foo">
But I also do need to select this div
</div>
</div>
使用driver.findElement(By.cssSelector("div.foo"))
会给出错误的元素,也就是我特别不想要的<div>
。但是,我可以执行以下操作来获取适当的元素:
// Assume driver is a valid WebDriver instance
WebElement parent = driver.findElement(By.cssSelector("div.bar");
// Since WebElement also extends SearchContext,
// we can do this, which limits the scope of the
// find to only children of the parent element
WebElement child = parent.findElement(By.cssSelector("div.foo");
现在我可以操作我想要的元素了。
https://stackoverflow.com/questions/55466222
复制相似问题