安装浏览器驱动

设置您的浏览器用于自动化.

通过 WebDriver,Selenium 支持市面上所有主流的浏览器,如 Chrom(ium)、Firefox、 Internet Explorer、 Edge、Opera 和 Safari。 尽管并非所有浏览器都对远程控制提供官方支持, 但 WebDriver 尽可能使用浏览器的内置自动化支持来驱动浏览器。

WebDriver 的目标是尽可能模拟真实用户与浏览器的交互。
在不同的浏览器中,这可能有不同的级别。

尽管所有的驱动程序共享一个面向用户的界面来控制浏览器,但它们设置浏览器会话的方式略有不同。 由于许多驱动程序实现是由第三方提供的,所以它们不包括在标准的 Selenium 发行版中。

驱动程序实例化、配置文件管理和各种特定于浏览器的设置都是具体参数的例子,这些参数根据浏览器有 不同的需求。本节介绍了使用不同浏览器的基本要求。

将可执行文件添加到 PATH

大多数驱动程序需要 Selenium 额外的可执行文件才能与浏览器通信。您可以在启动 WebDriver 之前手动指定可执行文件的存放位置,但这会使测试的可移植性降低,因为可执行文件必须位于每台 计算机上的同一位置,或包含在测试代码存储库中。

通过将包含 WebDriver 二进制文件的文件夹添加到系统 path 环境变量中,Selenium 将能够找到其他二进制文件,而无需您的测试代码来定位驱动程序的确切位置。

  • 创建一个目录来放置可执行文件,例如 C:\WebDriver\bin/opt/WebDriver/bin
  • 将目录添加到您的 path 中:
    • 在 Windows 上 - 以管理员身份打开命令提示符,然后运行以下命令将目录永久添加到计算机上所有用户的路径中:
setx PATH "%PATH%;C:\WebDriver\bin"
  • 在 macOS 和 Linux 上的 Bash 用户 - 在终端中:
export PATH=$PATH:/opt/WebDriver/bin >> ~/.profile
  • 现在您可以测试更改了。关闭所有打开的命令提示符,然后打开一个新的提示符。 输入您在上一步创建的文件夹中的某一个二进制文件的名称,例如:
    chromedriver
    
  • 如果您的 PATH 配置正确,您将看到一些有关驱动程序启动的输出:
Starting ChromeDriver 2.25.426935 (820a95b0b81d33e42712f9198c215f703412e1a1) on port 9515
Only local connections are allowed.

您可以通过按 Ctrl + C 重新获得对命令提示符的控制。

快速参考

浏览器支持的操作系统维护者下载问题追踪
Chromium/ChromeWindows/macOS/Linux谷歌下载问题
火狐Windows/macOS/LinuxMozilla下载问题
EdgeWindows 10微软下载问题
Internet ExplorerWindowsSelenium 项目组下载问题
SafarimacOS El Capitan 及更高版本苹果内置问题
OperaWindows/macOS/LinuxOpera下载问题

Chromium/Chrome

要驱动 Chrome 或 Chromium,您必须下载 chromedriver 并将其放在系统路径上的文件夹中。

在 Linux 或 macOS 上,这意味着修改 PATH 环境变量。通过执行以下命令,您可以看到由冒号分隔的目录组成的系统路径:

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

要在路径上包含 chromedriver(如果还没有的话),请确保包含 chromedriver 二进制文件的父目录。 下面的行将设置当前 PATH 环境变量的内容,在冒号后面添加一个额外的路径:

$ export PATH="$PATH:/path/to/chromedriver"

当您的路径上有 chromedriver 时,您应该可以从任何目录执行 chromedriver 可执行文件。

要实例化 Chrome/Chromium 会话,您可以执行以下操作:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

WebDriver driver = new ChromeDriver();
  
#简单赋值
from selenium.webdriver import Chrome

driver = Chrome()

#或者使用上下文管理器
from selenium.webdriver import Chrome

with Chrome() as driver:
    #你自己的代码放在这个缩进中
  
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;

IWebDriver driver = new ChromeDriver();
  
require "selenium-webdriver"

driver = Selenium::WebDriver.for :chrome
  
const {Builder} = require('selenium-webdriver');

(async function myFunction() {let driver = await new Builder().forBrowser('chrome').build();
    //你的代码放在这个块中
})();
  
import org.openqa.selenium.WebDriver
import org.openqa.selenium.chrome.ChromeDriver

val driver: WebDriver = ChromeDriver()
  

请记住,您必须设置 chromedriver 可执行文件的路径。可以使用下行代码实现:

System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
  
Chrome(executable_path='/path/to/chromedriver')
  
new ChromeDriver("/path/to/chromedriver");
  
Selenium::WebDriver::Chrome.driver_path = "/path/to/chromedriver"
  
chrome.setDefaultService(new chrome.ServiceBuilder('path/to/chromedriver').build());
  
System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver")
  

chromedriver 被实现为 WebDriver 远程服务器,该服务器通过公开 Chrome 的内部自动化代理接口来指示浏览器该怎么做。

火狐浏览器

从 Selenium 3 开始,Mozilla 通过 geckodriver 接管了火狐驱动程序的实现。火狐的新驱动程序被称为 geckodriver,可与 Firefox 48 及更高版本一起使用。 由于正在开发 Firefox WebDriver,因此 Firefox 版本越新,支持越好。

由于 geckodriver 是默认新的启动火狐浏览器的方式,您可以像 Selenium 2 那样实例化火狐浏览器:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

WebDriver driver = new FirefoxDriver();
  
#简单赋值
from selenium.webdriver import Firefox

driver = Firefox()
#或者使用上下文管理器
from selenium.webdriver import Firefox

with Firefox() as driver:
   #你自己的代码放在这个缩进中
  
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;

IWebDriver driver = new FirefoxDriver();
  
require "selenium-webdriver"

driver = Selenium::WebDriver.for :firefox
  
const {Builder} = require('selenium-webdriver');

(async function myFunction() {let driver = await new Builder().forBrowser('firefox').build();
   // 你自己的代码放在这个块中
})();
  
import org.openqa.selenium.WebDriver
import org.openqa.selenium.Firefox.FirefoxDriver

val driver: WebDriver = FirefoxDriver()
  

如果您不想使用 PATH 设置 geckodriver 的位置,请在代码中设置 geckodriver 的位置:

System.setProperty("webdriver.gecko.driver", "/path/to/geckodriver");
  
Firefox(executable_path='/path/to/geckodriver')
  
new FirefoxDriver("/path/to/geckodriver");
  
Selenium::WebDriver::Firefox.driver_path = "/path/to/geckodriver"
  
const firefox = require('selenium-webdriver/firefox');

const serviceBuilder = new firefox.ServiceBuilder("/path/to/geckodriver");

(async function myFunction() {
    let driver = await new Builder()
        .forBrowser('firefox')
        .setFirefoxService(serviceBuilder)
        .build();
        //your code inside this block
})();
  
System.setProperty("webdriver.gecko.driver", "/path/to/geckodriver")
  

也可以在运行时设置属性:

mvn test -Dwebdriver.gecko.driver=/path/to/geckodriver

当前,可以通过安装 Firefox 47.0.145 ESR 并指定 marionette 功能为 false 来还原到功能更强大的旧版 Firefox 驱动程序。Firefox 的更高版本不再兼容。

Edge

Edge 是微软最新的浏览器,内置在 Windows 10 和 Windows Server 2016 中。Edge 的更新与 Windows 的主要更新捆绑在一起,因此您需要下载一个与您当前安装的 Windows 版本的版本号匹配的二进制文件。 Edge 开发者网站 包含指向所有可用的二进制文件的链接。针对 EdgeDriver 实现的 bug 可以在 微软网站 中提出。如果您想针对 Edge 运行测试,但没有 Windows 10,微软在 Edge 开发者网站 上为测试人员提供了免费的虚拟机。

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.edge.EdgeDriver;

WebDriver driver = new EdgeDriver();
  
#简单赋值
from selenium.webdriver import Edge

driver = Edge()
#或使用上下文管理器
from selenium.webdriver import Edge

with Edge() as driver:
   #你的代码放在这个缩进中
  
using OpenQA.Selenium;
using OpenQA.Selenium.Edge;

IWebDriver driver = new EdgeDriver();
  
require "selenium-webdriver"

driver = Selenium::WebDriver.for :edge
  
const {Builder} = require('selenium-webdriver');

(async function myFunction() {let driver = await new Builder().forBrowser('MicrosoftEdge').build();
   // 你的代码放在这个块中
})();
  
import org.openqa.selenium.WebDriver
import org.openqa.selenium.edge.EdgeDriver

val driver: WebDriver = EdgeDriver()
  

如果您的路径中没有 Edge 驱动程序,您可以使用以下行设置路径:

System.setProperty("webdriver.edge.driver", "C:/path/to/MicrosoftWebDriver.exe");
  
Edge(executable_path='/path/to/MicrosoftWebDriver.exe')
  
new EdgeDriver("/path/to/MicrosoftWebDriver.exe");
  
Selenium::WebDriver::Edge.driver_path = "C:/path/to/MicrosoftWebDriver.exe"
  
const {Builder} = require("selenium-webdriver");
const edge = require('selenium-webdriver/edge');
let service = new edge.ServiceBuilder("/path/to/msedgedriver.exe");
(async function test() {
    let driver = await new Builder()
                .setEdgeService(service)
                .forBrowser('MicrosoftEdge')
                .build();
})();
  
System.setProperty("webdriver.edge.driver", "C:/path/to/MicrosoftWebDriver.exe")
  

IE 浏览器

在 Windows 10 之前,IE 一直是微软的默认浏览器,尽管它仍被包含在 Windows 10 中。 Internet Explorer Driver 是唯一的 Selenium 项目组旨在支持 微软认为当前 版本的驱动程序。旧版本可能可以工作,但将不受支持。

虽然 Selenium 项目为 32 位和 64 位版本的 IE 提供了二进制文件,但是 IE 10 和 11 在 64 位驱动程序上 有一些限制, 但是使用 32 位驱动程序仍然可以很好地工作。应该注意的是,由于 IE 浏览器的首选项是根据登录用户的帐户保存的, 因此需要进行一些额外的设置

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;

WebDriver driver = new InternetExplorerDriver();
  
#简单赋值
from selenium.webdriver import Ie

driver = Ie()
#或使用上下文管理器
from selenium.webdriver import Ie

with Ie() as driver:
   #你的代码放在这个缩进中
  
using OpenQA.Selenium;
using OpenQA.Selenium.IE;

IWebDriver driver = new InternetExplorerDriver();
  
require "selenium-webdriver"

driver = Selenium::WebDriver.for :internet_explorer
  
const {Builder} = require('selenium-webdriver');

(async function myFunction() {let driver = await new Builder().forBrowser('internet explorer').build();
   // 你的代码放在这个块中
})();
  
import org.openqa.selenium.WebDriver
import org.openqa.selenium.ie.InternetExplorerDriver

val driver: WebDriver = InternetExplorerDriver()
  

如果 IE 浏览器驱动程序不在您的路径中,您可以使用以下行设置路径:

System.setProperty("webdriver.ie.driver", "C:/path/to/IEDriver.exe");
  
Ie(executable_path='/path/to/IEDriverServer.exe')
  
new InternetExplorerDriver("C:/path/to/IEDriver.exe");
  
Selenium::WebDriver::IE.driver_path = "C:/path/to/IEDriver.exe"
  
const {Builder} = require("selenium-webdriver");
const ie = require('selenium-webdriver/ie');
let service = new ie.ServiceBuilder("/path/to/IEDriverServer.exe");
(async function test() {
    let driver = await new Builder()
                .setIeService(service)
                .forBrowser('internet explorer')
                .build();
})();
  
System.setProperty("webdriver.ie.driver", "C:/path/to/IEDriver.exe")
  

微软还为 Windows 7 和 8.1 中的 IE 11 提供了一个 WebDriver 二进制版本。自 2014 年以来就没有更新过,它是基于 W3 规范的草案版本。 Jim Evans 写了一篇关于微软实现的优秀文章。

Opera

Opera 的当前版本是建立在 Chromium 引擎之上的,而 WebDriver 现在是通过闭源的 Opera Chromium 驱动程序来支持的, 它可以被添加到您的路径或作为系统属性。

实例化一个驱动程序会话类似于 Firefox 和 Chromium:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.opera.OperaDriver;

WebDriver driver = new OperaDriver();
  
#简单赋值
from selenium.webdriver import Opera

driver = Opera()
#或使用上下文管理器
from selenium.webdriver import Opera

with Opera() as driver:
   #你的代码放在这个缩进中
  
using OpenQA.Selenium;
using OpenQA.Selenium.Opera;

IWebDriver driver = new OperaDriver();
  
require "selenium-webdriver"

driver = Selenium::WebDriver.for :opera
  
const {Builder} = require("selenium-webdriver");
const opera = require('selenium-webdriver/opera');
(async function test() {
    let driver = await new Builder()
        .forBrowser('opera')
        .build();
})();
  
import org.openqa.selenium.WebDriver
import org.openqa.selenium.opera.OperaDriver

val driver: WebDriver = OperaDriver()
  

Safari

High Sierra and later:

  • 首先从终端运行以下命令 时间并在提示符下键入密码以授权WebDriver
safaridriver --enable

El Capitan and Sierra:

  • 启用 Safari 首选项中的 Developer 菜单
  • 从 “开发” 菜单中选择 “允许远程自动化” 选项
  • 第一次运行时在终端输入以下命令,并在提示符处输入密码以授权 WebDriver
/usr/bin/safaridriver -p 1337</

你可以使用以下代码开始一个驱动程序会话:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.safari.SafariDriver;

WebDriver driver = new SafariDriver();
  
#简单赋值
from selenium.webdriver import Safari

driver = Safari()
#或使用上下文管理器
from selenium.webdriver import Safari

with Safari() as driver:
   #你的代码放在这个缩进中
  
using OpenQA.Selenium;
using OpenQA.Selenium.Safari;

IWebDriver driver = new SafariDriver();
  
require "selenium-webdriver"

driver = Selenium::WebDriver.for :safari
  
const {Builder} = require('selenium-webdriver');

(async function myFunction() {let driver = await new Builder().forBrowser('safari').build();
   // 你的代码放在这个块中
})();
  
import org.openqa.selenium.WebDriver
import org.openqa.selenium.safari.SafariDriver

val driver: WebDriver = SafariDriver()
  

那些希望在 iOS 上实现 Safari 自动化的人应该关注Appium 项目。 虽然 Safari 之前也支持 Windows,但苹果早就放弃了对它的支持,这让它成为了一个糟糕的测试平台。

模拟浏览器

HtmlUnit

HtmlUnit 是一个 “针对 Java 程序的无图形界面浏览器”。它为 HTML 文档建模,并提供一个 API, 允许您调用页面、填写表单、单击链接等。它支持 JavaScript,能够使用 AJAX 库,根据使用的配置模拟 Chrome、Firefox 或 IE。它已经迁移到一个新位置 了。 源文件保存在 svn 上。

PhantomJS

PhantomJS 是一款基于 Webkit 的无头浏览器,尽管它的版本比谷歌 Chrome 或 Safari 要老得多。虽然曾经很流行, 但现在明智的做法是避免 PhantomJS。这个项目 从 8 月 5 日起 就一直没有被维护过,所以尽管网络会继续变化,PhantomJS 也不会更新。在谷歌宣布可以无头运行 Chrome 之后,现在 Mozilla 的火狐浏览器也提供了这个功能。