Selenium 中的 WebDriver 和 WebElement 有啥区别?

Posted

技术标签:

【中文标题】Selenium 中的 WebDriver 和 WebElement 有啥区别?【英文标题】:What is the difference between WebDriver and WebElement in Selenium?Selenium 中的 WebDriver 和 WebElement 有什么区别? 【发布时间】:2019-03-17 20:54:56 【问题描述】:

Selenium 中的 WebDriver 和 WebElement 有什么区别?

示例代码:

WebDriver driver = new FirefoxDriver();      
driver.get("http://www.google.com");      
WebElement s  = driver.findElement(By.name("q"));      
s.sendKeys("Packt Publishing");      
s.submit();

【问题讨论】:

您有更具体的问题吗?它们是完全不同的类。 【参考方案1】:

WebDriver 接口

从Selenium 的角度来看,What is the difference between ChromeDriver and WebDriver in selenium? interface 类似于第 3 方Browser VendorsMozilla 的协议、ChromeInternet ExplorerSafari 等都必须遵守和实施相同的规则。这将反过来帮助最终用户使用公开的 API 编写通用代码并在所有可用浏览器中实现功能,而无需进行任何更改。


WebDriver 驱动程序 = 新的 FirefoxDriver();

通过代码行:

WebDriver driver = new FirefoxDriver();

我们正在创建一个 WebDriver 接口 的实例并将其转换FirefoxDriver 类。所有的浏览器驱动像FirefoxDriver、ChromeDriver、InternetExplorerDriver、PhantomJSDriver、SafariDriver等都实现了WebDriver接口(实际上RemoteWebDriver类实现了WebDriver接口和浏览器驱动扩展RemoteWebDriver)。因此,如果我们使用WebDriver driver,那么我们可以将已经初始化的 driver 实例(作为公共对象变量)用于我们想要自动化的所有浏览器,例如Mozilla、Chrome、InternetExplorer、PhantomJS、Safari。

WebDriver driver = new FirefoxDriver();
driver = new ChromeDriver();
driver = new FirefoxDriver();
driver = new SafariDriver();

您可以在以下位置找到详细讨论:

Is this correct - FirefoxDriver driver = new FirefoxDriver();? what is the difference between ChromeDriver and WebDriver in selenium?

WebElement 接口

Selenium 的角度来看,WebElement 代表一个 html 元素。一般情况下,所有与页面交互的操作都会通过这个接口进行。

WebElement 是一种抽象,用于在通过协议在远程和本地端之间传输Element nodes and are simply known as elements 时识别它。网页元素标识符是字符串常量,表示为:

"element-6066-11e4-a52e-4f735466cecf"

您可以在Values returned by webdrivers找到详细讨论

每个元素都有一个关联的 Web 元素引用,该引用在所有浏览上下文中唯一标识该元素。表示相同元素的每个元素的 Web 元素引用必须相同。它必须是一个字符串,并且应该是生成 UUID 的结果。

一个 ECMAScript Object 代表一个网络元素,如果它有一个网络元素标识符自己的属性。

每个浏览上下文都有一个相关的已知元素列表。当浏览上下文被丢弃时,已知元素列表也随之丢弃。

您可以在Why return type of findElement(By by) is WebElement?找到详细讨论

一些常用的关联方法如下:

clear() click() findElement(By by) findElements(By by) getAttribute(java.lang.String name) getCssValue(java.lang.String propertyName) getLocation() getRect() getSize() getTagName() getText() isDisplayed() isEnabled() isSelected() sendKeys(java.lang.CharSequence... keysToSend) submit()

【讨论】:

【参考方案2】:

WebDriver 类侧重于在广义 意义上驱动浏览器。它加载页面、切换到不同的窗口/框架、获取页面标题等。并非特定于页面元素的广泛操作。

WebElement 专注于与您找到的特定元素进行交互。比如:

点击该特定元素 从该特定元素中检索文本和其他值 找出特定元素的位置 向特定元素发送文本(如填充输入字段)

WebDriver 和 WebElement 之间唯一真正的重叠是 findElement 和 findElements 方法。对于 Webdriver,这些方法在页面上的任何位置定位给定的 By。对于 WebElement,这些方法将给定的 By 定位在该元素的上下文中(通常在其内部)。

【讨论】:

以上是关于Selenium 中的 WebDriver 和 WebElement 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

在 OS X 中使用 Selenium WebDriver 打开和关闭新选项卡

Selenium 中的 WebDriver 和 WebElement 有啥区别?

selenium 中的 ChromeDriver 和 WebDriver 有啥区别?

如何使用 Selenium Webdriver 和 Python 从这个非选择下拉菜单中选择这个元素

爬虫(selenium)

selenium2中的等待