WebElement 是一个接口 - 如何成功调用它的方法?

问题描述 投票:0回答:3

由于 WebElement 是一个接口,这意味着 WebElement 接口中存在的所有方法都是抽象的,即它们没有主体。另外,我们知道我们不能使用接口的引用直接访问接口的方法(因为这些方法没有任何实现)

现在,考虑以下代码:

WebElement button = driver.findElement(//xpath of a button);
button.click();

有人可以解释一下这里如何通过“按钮”访问WebElement界面的click()方法吗?“按钮”只不过是对WebElement界面的引用?

selenium-webdriver
3个回答
1
投票

WebElement
接口由
AndroidWebElement
HtmlUnitWebElement
RemoteWebElement
实现。

click
方法实际上是在这些具体类之一上执行的(由
findElement
返回)。

有关更多详细信息,请参阅以下文档:


1
投票

SearchContext 和 Takescreenshot 接口是 WebElement 接口的父接口。 现在RemoteWebElement、htmlunitWebElement类实现了WebElement接口。 这里我附上屏幕截图以便您更好地理解。enter image description here

您可以通过在 IDE 中安装反编译器并右键单击 WebElement 界面来看到相同的结果。你会看到同样的反射:


0
投票

对于 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 按钮 = .... 对象。

© www.soinside.com 2019 - 2024. All rights reserved.