王某某瞎編于 2018年3月20日
Selenium
Selenium 是 ThoughtWorks 提供的一個強大的基于瀏覽器的開源自動化測試工具。
Selenium 是一個用于 Web 應用程序測試的工具,測試直接自動運行在瀏覽器中,就像真正的用戶在手工操作一樣。支持的瀏覽器包括 IE、Chrome 和 Firefox 等。這個工具的主要功能包括:測試與瀏覽器的兼容性 - 測試您的應用程序看是否能夠很好地工作在不同瀏覽器和操作系統(tǒng)之上;測試系統(tǒng)功能 - 創(chuàng)建回歸測試檢驗軟件功能和用戶需求;支持自動錄制動作,和自動生成 .NET、Perl、Python、Ruby 和 Java 等不同語言的測試腳本。
Selenium 1 (又叫 Selenium RC 或 Remote Control)
Webdriver
Selenium 2,又名 WebDriver,它的主要新功能是集成了 Selenium 1.0 以及 WebDriver, 是兩個項目的合并,既兼容 Selenium API 也支持 WebDriver API。
WebDriver 曾經(jīng)是 Selenium 的競爭對手(最開始是google的一個人弄的,主要用于避免在JavaScript的沙箱環(huán)境里存在的各種限制),他主要是通過利用瀏覽器原生API的方式來操控瀏覽器執(zhí)行各種動作(還包括系統(tǒng)級別的調(diào)用來模擬用戶輸入)。
Selenium WebDriver 就是對瀏覽器提供的原生API進行封裝,使其成為一套更加面向?qū)ο蟮腟elenium WebDriver API。
使用這套API可以操控瀏覽器的開啟、關閉,打開網(wǎng)頁,操作界面元素,控制Cookie,還可以操作瀏覽器截屏、安裝插件、設置代理、配置證書等。由于使用的原生API,其速度與穩(wěn)定性都會好很多。但瀏覽器廠商各不相同,提供的驅(qū)動各異(ChromeDriver、FirefoxDriver(xpi插件)、InternetExplorerDriver(exe)等),API也會有差異(好像都走JSON Wire Protocol,并且向W3C標準靠攏)。Selenium 對不同廠商的各個驅(qū)動進行了封裝,如:selenium-chrome-driver、selenium-edge-driver、selenium-firefox-driver等。
還包括了對移動應用進行測試的AndroidDriver和iOS WebDriver,以及一個基于HtmlUnit的無界面實現(xiàn)HtmlUnitDriver。
WebDriver API可以通過Python、Ruby、Java和C#訪問
WebDriver是一個用來進行復雜重復的web自動化測試的工具。意在提供一種比Selenium1.0更簡單易學,有利于維護的API。它沒有和任何測試框架進行綁定,所以他可以很好的在單元測試和main方法中調(diào)用。一旦創(chuàng)建好一個Selenium工程,你馬上會發(fā)現(xiàn)WebDriver和其他類庫一樣:它是完全獨立的,你可以直接使用而不需要考慮其他配置,這個Selenium RC是截然相反的。
兩者的差異
- 對于所有類型的瀏覽器Selenium- RC都是使用的同一種方法:
當瀏覽器啟動時,向其中注入javascript,從而使用這些js來驅(qū)動瀏覽器中的AUT(Application Under Test)。 - WebDriver并沒有使用這種技術,它是通過調(diào)用瀏覽器原生的自動化API直接驅(qū)動瀏覽器。
Selenium IDE
Selenium IDE (集成開發(fā)環(huán)境) 是一個創(chuàng)建測試腳本的原型工具。它是一個 Firefox 插件,提供創(chuàng)建自動化測試的建議接口。Selenium IDE 有一個記錄功能,能記錄用戶的操作,并且能選擇多種語言把它們導出到一個可重用的腳本中用于后續(xù)執(zhí)行。
ChromeDriver - WebDriver for Chrome
WebDriver是一個開源工具,用于在許多瀏覽器上自動測試webapps。它提供了導航到網(wǎng)頁,用戶輸入,JavaScript執(zhí)行等功能。ChromeDriver是一個獨立的服務,它為 Chromium 實現(xiàn) WebDriver 的 JsonWireProtocol 協(xié)議。
目前正在實現(xiàn)并轉(zhuǎn)向W3C標準。 ChromeDriver適用于Android版Chrome和桌面版Chrome(Mac,Linux,Windows和ChromeOS)。
官網(wǎng)地址:
https://sites.google.com/a/chromium.org/chromedriver/home
ChromeDriver 是 google 為網(wǎng)站開發(fā)人員提供的自動化測試接口,它是 selenium2 和 chrome瀏覽器 進行通信的橋梁。selenium 通過一套協(xié)議(JsonWireProtocol :https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol)和 ChromeDriver 進行通信,selenium 實質(zhì)上是對這套協(xié)議的底層封裝,同時提供外部 WebDriver 的上層調(diào)用類庫。
大概的工作流程:
在代碼中 new ChromeDriver() 時,selenium會隨機挑選一個端口調(diào)用chromedriver程序,調(diào)用成功后 chromedriver 會在指定的端口啟動一個服務(會有一個進程)
>tasklist | find "chromedriver"
chromedriver.exe 7848 Console 1 13,740 K
selenium 中使用 apache 的 commons-exec 來運行 chromedriver.exe 啟動 ChromeDriver 服務
直接在控制臺運行 chromedriver.exe 時,默認端口是9515
selenium 通過指定的端口和約定的協(xié)議來和 ChromeDriver 進行通信,一個ChromeDriver可用管理多個chrome。
(具體細節(jié)可以看看協(xié)議部分,ChromeDriver如何控制chrome可能需要去看源碼~~)
>tasklist | find "chrome"
chromedriver.exe 14692 Console 1 14,888 K
chrome.exe 20952 Console 1 72,204 K
chrome.exe 7288 Console 1 9,052 K
chrome.exe 15524 Console 1 10,000 K
chrome.exe 13036 Console 1 96,028 K
chrome.exe 11836 Console 1 29,836 K
chrome.exe 2788 Console 1 59,876 K
selenium 中多個 WebDriver 實例對應一個 chromedriver 進程,一個 chromedriver 進程管理多個 chrome 進程。
一個 WebDriver 實例對應一個瀏覽器窗口。
在代碼中直接 new ChromeDriver() 將會啟動一個 chromedriver 進程
使用 RemoteWebDriver 則只會連接到 chromedriver 服務,不會啟動一個新的進程,連接不上會報錯。
不管哪種方式都會打開一個瀏覽器窗口。
WebDriver driver = new RemoteWebDriver(new URL("http://127.0.0.1:9515"), DesiredCapabilities.chrome());
使用
官方指導頁面
https://sites.google.com/a/chromium.org/chromedriver/getting-started
基于java
- 創(chuàng)建Maven項目
引入相關依賴
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.7.1</version>
</dependency>
- 確保Chromium / Google Chrome安裝在認可的位置
ChromeDriver希望您將Chrome安裝在您平臺的默認位置。您還可以強制ChromeDriver通過設置特殊功能來使用自定義位置。
ChromeOptions options = new ChromeOptions();
options.setBinary("/path/to/other/chrome/binary");
- 下載與你安裝的chrome對應的chromedriver
| chromedriver 版本 | chrome 版本 |
|---|---|
| ChromeDriver 2.36 | Chrome v63-65 |
| ChromeDriver 2.35 | Chrome v62-64 |
| ChromeDriver 2.34 | Chrome v61-63 |
| ChromeDriver 2.33 | Chrome v60-62 |
(這里隨便復制了幾個)
下載地址:
https://sites.google.com/a/chromium.org/chromedriver/downloads
- 指定ChromeDriver所在位置,可以通過兩種方法指定:
通過配置ChromeDriver.exe位置到path環(huán)境變量
通過設置webdriver.chrome.driver 系統(tǒng)屬性實現(xiàn)-
- 創(chuàng)建一個新的ChromeDriver的實例,并調(diào)用get方法打開頁面
代碼:
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class BaseTest {
public static void main(String[] args) {
// 設置ChromeDriver的路徑
System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http://www.baidu.com/");
//driver.quit();
}
}
執(zhí)行這段代碼將打開一個瀏覽器窗口,并訪問百度
同時瀏覽器上將顯示:Chrome 正受到自動測試軟件的控制
代碼執(zhí)行完成后chrome并不會關閉,需要調(diào)用 driver.quit(); 才能關閉瀏覽器窗口。
打開百度并進行搜索:
public static void main(String[] args) throws InterruptedException {
// 如果不設置將搜索環(huán)境變量
System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http://www.baidu.com/");
Thread.sleep(3000);
WebElement searchBox = driver.findElement(By.id("kw"));
searchBox.sendKeys("ChromeDriver");
searchBox.submit();
Thread.sleep(3000);
driver.quit();
}
高效使用
ChromeDriver 啟動ChromeDriver服務器進程,并在調(diào)用退出時終止它。
在大型測試時每個測試都會創(chuàng)建一個ChromeDriver實例,這將會浪費大量時間。有兩種方法可以解決這個問題:
1. 使用ChromeDriverService
@RunWith(BlockJUnit4ClassRunner.class)
public class ChromeTest extends TestCase {
private static ChromeDriverService service;
private WebDriver driver;
@BeforeClass
public static void createAndStartService() {
service = new ChromeDriverService.Builder()
.usingDriverExecutable(new File("path/to/my/chromedriver"))
.usingAnyFreePort()
.build();
service.start();
}
@AfterClass
public static void createAndStopService() {
service.stop();
}
@Before
public void createDriver() {
driver = new RemoteWebDriver(service.getUrl(),
DesiredCapabilities.chrome());
}
@After
public void quitDriver() {
driver.quit();
}
@Test
public void testGoogleSearch() {
driver.get("http://www.google.com");
// rest of the test...
}
}
2. 在運行測試之前單獨啟動ChromeDriver服務器,并使用Remote WebDriver連接到它
在控制臺執(zhí)行chromedriver(如果沒有添加環(huán)境變量的話需要到對應目錄下執(zhí)行)
F:\temp>chromedriver
Starting ChromeDriver 2.37.543627 (63642262d9fb93fb4ab52398be4286d844092a5e) on port 9515
Only local connections are allowed.
Java 代碼:
public static void main(String[] args) throws MalformedURLException {
WebDriver driver = new RemoteWebDriver(new URL("http://127.0.0.1:9515"), DesiredCapabilities.chrome());
driver.get("http://www.baidu.com");
}