由于 WebElement 是一个接口,这意味着 WebElement 接口中存在的所有方法都是抽象的,即它们没有主体。另外,我们知道我们不能使用接口的引用直接访问接口的方法(因为这些方法没有任何实现)
现在,考虑以下代码:
WebElement button = driver.findElement(//xpath of a button);
button.click();
有人可以解释一下这里如何通过“按钮”访问WebElement界面的click()方法吗?“按钮”只不过是对WebElement界面的引用?
WebElement
接口由AndroidWebElement
、HtmlUnitWebElement
或RemoteWebElement
实现。
click
方法实际上是在这些具体类之一上执行的(由findElement
返回)。
有关更多详细信息,请参阅以下文档:
对于 WebElement 接口以及 Java 中的任何接口,您无法从中实例化对象。对象是根据具体类创建的。 但是您可以使用接口指定所需对象的形式。 对于你的情况: driver 是一个从具体类(例如 ChromeDriver)实例化的对象,如下所示: WebDriver 驱动程序 = new ChromeDriver(); ChromeDriver 是一个实现“WebDriver”接口的具体类。因此,在左侧,WebDriver 接口仅确定所涉及的方法的规范(specs)或必要的名称。它确定将创建的变量“驱动程序”的类型。这是一种类型的转换过程,我们不需要创建一个具有所有具体类的大量方法的对象,我们只需要在接口中指定必要的方法。 在右侧,对象驱动程序将从具体类创建,但不会使用“ChromeDriver”类的所有方法创建,而是仅创建“WebDriver”接口中的指定方法。 现在“驱动程序”是一个具有自己方法的对象“完整对象”。 同样,WebElement 是一个接口,我们无法从中实例化对象。对于您的情况: WebElement button = driver.findElement(//按钮的xpath); button.click(); WebElemen 确定要包含在变量“button”中的必要方法,该变量内部包含一个完整的对象。该对象将由对象“driver”的“findElement”方法返回。因此触发对象“driver”的方法“findElement”会带来一个WebElement类型的对象。该带来的物体位于或容纳在可变“按钮”内。所以“按钮”是一个对象并且它包含一个对象。 WebElement 接口仅确定该容纳变量的类型,您可以使用该变量“button”内容纳的该对象的方法“click()”。使用基本类型时也是同样的道理,例如: int x =10;这类似于: WebElement 按钮 = .... 对象。