Selenium 與 ChromeDriver

王某某瞎編于 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ā)人員提供的自動化測試接口,它是 selenium2chrome瀏覽器 進行通信的橋梁。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

  1. 創(chuàng)建Maven項目
    引入相關依賴
<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>3.7.1</version>
</dependency>
  1. 確保Chromium / Google Chrome安裝在認可的位置

ChromeDriver希望您將Chrome安裝在您平臺的默認位置。您還可以強制ChromeDriver通過設置特殊功能來使用自定義位置。

ChromeOptions options = new ChromeOptions();
options.setBinary("/path/to/other/chrome/binary");
  1. 下載與你安裝的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

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

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

  1. 創(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");
}
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容