王某某瞎編于 2018年3月20日
Selenium
Selenium 是 ThoughtWorks 提供的一個(gè)強(qiáng)大的基于瀏覽器的開源自動(dòng)化測試工具餐蔬。
Selenium 是一個(gè)用于 Web 應(yīng)用程序測試的工具仗考,測試直接自動(dòng)運(yùn)行在瀏覽器中秃嗜,就像真正的用戶在手工操作一樣。支持的瀏覽器包括 IE必搞、Chrome 和 Firefox 等。這個(gè)工具的主要功能包括:測試與瀏覽器的兼容性 - 測試您的應(yīng)用程序看是否能夠很好地工作在不同瀏覽器和操作系統(tǒng)之上研侣;測試系統(tǒng)功能 - 創(chuàng)建回歸測試檢驗(yàn)軟件功能和用戶需求;支持自動(dòng)錄制動(dòng)作末誓,和自動(dòng)生成 .NET喇澡、Perl读存、Python、Ruby 和 Java 等不同語言的測試腳本尔当。
Selenium 1 (又叫 Selenium RC 或 Remote Control)
Webdriver
Selenium 2,又名 WebDriver畜号,它的主要新功能是集成了 Selenium 1.0 以及 WebDriver, 是兩個(gè)項(xiàng)目的合并替饿,既兼容 Selenium API 也支持 WebDriver API视卢。
WebDriver 曾經(jīng)是 Selenium 的競爭對手(最開始是google的一個(gè)人弄的,主要用于避免在JavaScript的沙箱環(huán)境里存在的各種限制)绳锅,他主要是通過利用瀏覽器原生API的方式來操控瀏覽器執(zhí)行各種動(dòng)作(還包括系統(tǒng)級別的調(diào)用來模擬用戶輸入)。
Selenium WebDriver 就是對瀏覽器提供的原生API進(jìn)行封裝驯嘱,使其成為一套更加面向?qū)ο蟮腟elenium WebDriver API鞠评。
使用這套API可以操控瀏覽器的開啟、關(guān)閉锥忿,打開網(wǎng)頁淹朋,操作界面元素础芍,控制Cookie惶楼,還可以操作瀏覽器截屏、安裝插件豹储、設(shè)置代理、配置證書等钠怯。由于使用的原生API,其速度與穩(wěn)定性都會(huì)好很多镊尺。但瀏覽器廠商各不相同庐氮,提供的驅(qū)動(dòng)各異(ChromeDriver、FirefoxDriver(xpi插件)、InternetExplorerDriver(exe)等)衣式,API也會(huì)有差異(好像都走JSON Wire Protocol,并且向W3C標(biāo)準(zhǔn)靠攏)。Selenium 對不同廠商的各個(gè)驅(qū)動(dòng)進(jìn)行了封裝荧飞,如:selenium-chrome-driver叹阔、selenium-edge-driver、selenium-firefox-driver等。
還包括了對移動(dòng)應(yīng)用進(jìn)行測試的AndroidDriver和iOS WebDriver修档,以及一個(gè)基于HtmlUnit的無界面實(shí)現(xiàn)HtmlUnitDriver。
WebDriver API可以通過Python兴使、Ruby、Java和C#訪問
WebDriver是一個(gè)用來進(jìn)行復(fù)雜重復(fù)的web自動(dòng)化測試的工具照激。意在提供一種比Selenium1.0更簡單易學(xué)发魄,有利于維護(hù)的API。它沒有和任何測試框架進(jìn)行綁定俩垃,所以他可以很好的在單元測試和main方法中調(diào)用励幼。一旦創(chuàng)建好一個(gè)Selenium工程口柳,你馬上會(huì)發(fā)現(xiàn)WebDriver和其他類庫一樣:它是完全獨(dú)立的苹粟,你可以直接使用而不需要考慮其他配置壁熄,這個(gè)Selenium RC是截然相反的滑燃。
兩者的差異
- 對于所有類型的瀏覽器Selenium- RC都是使用的同一種方法:
當(dāng)瀏覽器啟動(dòng)時(shí),向其中注入javascript偿警,從而使用這些js來驅(qū)動(dòng)瀏覽器中的AUT(Application Under Test)望艺。 - WebDriver并沒有使用這種技術(shù)苛秕,它是通過調(diào)用瀏覽器原生的自動(dòng)化API直接驅(qū)動(dòng)瀏覽器。
Selenium IDE
Selenium IDE (集成開發(fā)環(huán)境) 是一個(gè)創(chuàng)建測試腳本的原型工具荣茫。它是一個(gè) Firefox 插件,提供創(chuàng)建自動(dòng)化測試的建議接口场靴。Selenium IDE 有一個(gè)記錄功能啡莉,能記錄用戶的操作,并且能選擇多種語言把它們導(dǎo)出到一個(gè)可重用的腳本中用于后續(xù)執(zhí)行旨剥。
ChromeDriver - WebDriver for Chrome
WebDriver是一個(gè)開源工具咧欣,用于在許多瀏覽器上自動(dòng)測試webapps。它提供了導(dǎo)航到網(wǎng)頁轨帜,用戶輸入魄咕,JavaScript執(zhí)行等功能。ChromeDriver是一個(gè)獨(dú)立的服務(wù)蚌父,它為 Chromium 實(shí)現(xiàn) WebDriver 的 JsonWireProtocol 協(xié)議哮兰。
目前正在實(shí)現(xiàn)并轉(zhuǎn)向W3C標(biāo)準(zhǔn)。 ChromeDriver適用于Android版Chrome和桌面版Chrome(Mac苟弛,Linux喝滞,Windows和ChromeOS)。
官網(wǎng)地址:
https://sites.google.com/a/chromium.org/chromedriver/home
ChromeDriver 是 google 為網(wǎng)站開發(fā)人員提供的自動(dòng)化測試接口膏秫,它是 selenium2 和 chrome瀏覽器 進(jìn)行通信的橋梁右遭。selenium 通過一套協(xié)議(JsonWireProtocol :https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol)和 ChromeDriver 進(jìn)行通信,selenium 實(shí)質(zhì)上是對這套協(xié)議的底層封裝,同時(shí)提供外部 WebDriver 的上層調(diào)用類庫窘哈。
大概的工作流程:
在代碼中 new ChromeDriver() 時(shí)吹榴,selenium會(huì)隨機(jī)挑選一個(gè)端口調(diào)用chromedriver程序,調(diào)用成功后 chromedriver 會(huì)在指定的端口啟動(dòng)一個(gè)服務(wù)(會(huì)有一個(gè)進(jìn)程)
>tasklist | find "chromedriver"
chromedriver.exe 7848 Console 1 13,740 K
selenium 中使用 apache 的 commons-exec 來運(yùn)行 chromedriver.exe 啟動(dòng) ChromeDriver 服務(wù)
直接在控制臺(tái)運(yùn)行 chromedriver.exe 時(shí)滚婉,默認(rèn)端口是9515
selenium 通過指定的端口和約定的協(xié)議來和 ChromeDriver 進(jìn)行通信图筹,一個(gè)ChromeDriver可用管理多個(gè)chrome。
(具體細(xì)節(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 中多個(gè) WebDriver 實(shí)例對應(yīng)一個(gè) chromedriver 進(jìn)程婿斥,一個(gè) chromedriver 進(jìn)程管理多個(gè) chrome 進(jìn)程。
一個(gè) WebDriver 實(shí)例對應(yīng)一個(gè)瀏覽器窗口哨鸭。
在代碼中直接 new ChromeDriver() 將會(huì)啟動(dòng)一個(gè) chromedriver 進(jìn)程
使用 RemoteWebDriver 則只會(huì)連接到 chromedriver 服務(wù)民宿,不會(huì)啟動(dòng)一個(gè)新的進(jìn)程,連接不上會(huì)報(bào)錯(cuò)像鸡。
不管哪種方式都會(huì)打開一個(gè)瀏覽器窗口活鹰。
WebDriver driver = new RemoteWebDriver(new URL("http://127.0.0.1:9515"), DesiredCapabilities.chrome());
使用
官方指導(dǎo)頁面
https://sites.google.com/a/chromium.org/chromedriver/getting-started
基于java
- 創(chuàng)建Maven項(xiàng)目
引入相關(guān)依賴
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.7.1</version>
</dependency>
- 確保Chromium / Google Chrome安裝在認(rèn)可的位置
ChromeDriver希望您將Chrome安裝在您平臺(tái)的默認(rèn)位置。您還可以強(qiáng)制ChromeDriver通過設(shè)置特殊功能來使用自定義位置只估。
ChromeOptions options = new ChromeOptions();
options.setBinary("/path/to/other/chrome/binary");
- 下載與你安裝的chrome對應(yīng)的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 |
(這里隨便復(fù)制了幾個(gè))
下載地址:
https://sites.google.com/a/chromium.org/chromedriver/downloads
- 指定ChromeDriver所在位置志群,可以通過兩種方法指定:
通過配置ChromeDriver.exe位置到path環(huán)境變量
通過設(shè)置webdriver.chrome.driver 系統(tǒng)屬性實(shí)現(xiàn)-
- 創(chuàng)建一個(gè)新的ChromeDriver的實(shí)例,并調(diào)用get方法打開頁面
代碼:
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class BaseTest {
public static void main(String[] args) {
// 設(shè)置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í)行這段代碼將打開一個(gè)瀏覽器窗口蛔钙,并訪問百度
同時(shí)瀏覽器上將顯示:Chrome 正受到自動(dòng)測試軟件的控制
代碼執(zhí)行完成后chrome并不會(huì)關(guān)閉锌云,需要調(diào)用 driver.quit(); 才能關(guān)閉瀏覽器窗口。
打開百度并進(jìn)行搜索:
public static void main(String[] args) throws InterruptedException {
// 如果不設(shè)置將搜索環(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 啟動(dòng)ChromeDriver服務(wù)器進(jìn)程吁脱,并在調(diào)用退出時(shí)終止它桑涎。
在大型測試時(shí)每個(gè)測試都會(huì)創(chuàng)建一個(gè)ChromeDriver實(shí)例,這將會(huì)浪費(fèi)大量時(shí)間兼贡。有兩種方法可以解決這個(gè)問題:
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. 在運(yùn)行測試之前單獨(dú)啟動(dòng)ChromeDriver服務(wù)器攻冷,并使用Remote WebDriver連接到它
在控制臺(tái)執(zhí)行chromedriver(如果沒有添加環(huán)境變量的話需要到對應(yīng)目錄下執(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");
}