Selenium 與 ChromeDriver

王某某瞎編于 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)化測試接口膏秫,它是 selenium2chrome瀏覽器 進(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

  1. 創(chuàng)建Maven項(xiàng)目
    引入相關(guān)依賴
<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>3.7.1</version>
</dependency>
  1. 確保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");
  1. 下載與你安裝的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

  1. 指定ChromeDriver所在位置志群,可以通過兩種方法指定:
  • 通過配置ChromeDriver.exe位置到path環(huán)境變量

  • 通過設(shè)置webdriver.chrome.driver 系統(tǒng)屬性實(shí)現(xiàn)-

  1. 創(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");
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市遍希,隨后出現(xiàn)的幾起案子等曼,更是在濱河造成了極大的恐慌,老刑警劉巖凿蒜,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件禁谦,死亡現(xiàn)場離奇詭異,居然都是意外死亡废封,警方通過查閱死者的電腦和手機(jī)枷畏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來虱饿,“玉大人拥诡,你說我怎么就攤上這事触趴。” “怎么了渴肉?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵冗懦,是天一觀的道長。 經(jīng)常有香客問我仇祭,道長披蕉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任乌奇,我火速辦了婚禮没讲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘礁苗。我一直安慰自己爬凑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布试伙。 她就那樣靜靜地躺著嘁信,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疏叨。 梳的紋絲不亂的頭發(fā)上潘靖,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機(jī)與錄音蚤蔓,去河邊找鬼卦溢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛秀又,可吹牛的內(nèi)容都是我干的单寂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼涮坐,長吁一口氣:“原來是場噩夢啊……” “哼凄贩!你這毒婦竟也來了誓军?” 一聲冷哼從身側(cè)響起袱讹,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昵时,沒想到半個(gè)月后捷雕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡壹甥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年救巷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片句柠。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浦译,死狀恐怖棒假,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情精盅,我是刑警寧澤帽哑,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站叹俏,受9級特大地震影響妻枕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜粘驰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一屡谐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蝌数,春花似錦愕掏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至枝哄,卻和暖如春肄梨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挠锥。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工众羡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蓖租。 一個(gè)月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓粱侣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蓖宦。 傳聞我的和親對象是個(gè)殘疾皇子齐婴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容