我经常使用一些自定义查找方法,而不是WebDriver.findElement和WebDriver.findElements。这些方法采用包含By定位器和正则表达式的自定义定位器对象,并返回与By定位器匹配且其文本与正则表达式匹配的WebElement或WebElements。
这些在很多场合非常有用,我想为WebElement.findElement和WebElement.findElements提供相同的功能。我可以创建一个实现WebElement接口的新类,并且还包含这些新的查找方法,但我对这是否真的有用感到困惑。毕竟,当我对FireFox运行时,驱动程序返回的元素是FireFoxWebElements。当我对IE运行时,它们是InternetExplorerElements。这两个都实现了WebElement,但它们与我实现WebElement的自定义类完全无关,对吧?他们没有这个额外的功能,他们不能被视为我的自定义类,因为他们......不是。
由于WebDriver.findElement(s)是WebElements的唯一“源”,也就是说,它是WebElements到达我的代码的基本方式,然后我可以改变我的自定义findElement方法(调用WebDriver)。 findElement(s),最终)为包含我的特殊element.find方法的任何WebElement返回一个新的自定义包装器?这样,到达我的代码的所有WebElements都将是这些自定义元素以及我想要的额外查找方法。对?如果是这样,这样的包装类会是什么样的?
答案 0 :(得分:4)
更清晰的方法是继承By
类,并为By.findElement()
和By.findElements()
提供自定义实现。该架构专为这种类型的可扩展性而设计。然后,可以将此By
子类作为参数传递给findElement()
和findElements()
WebDriver
和WebElement
方法,而不会出现任何问题。
或者,您可以重新调整自定义查找方法的用途。如果他们当前采用WebDriver
对象,请考虑将其更改为采用SearchContext
参数,这是WebDriver
和WebElement
扩展的接口。 SearchContext
是findElement()
和findElements()
方法的实际来源。