關於webdriver

webdriver協議

webdriver協議是一套json格式的規範,自己是基於http協議的
這個協議規定了每一個操做對應的數據格式,webdriver做爲一個服務端,須要實現協議中的每個操做
做爲客戶端的庫文件須要封裝好給用戶使用的api,每一個api對應着協議中不一樣的數據格式,這些數據封裝在http中的body中,數據格式內容和具體的操做一一對應
selenium中的webdriver就是瀏覽器驅動,好比ChromeDriver等,驅動實現了webdriver協議
appium中的webdriver是appium server
通俗地說:
因爲客戶端腳本(java, python, ruby)不能直接與瀏覽器/手機通訊,這時候能夠把webdriver server當作一個翻譯器,它能夠把客戶端代碼翻譯成瀏覽器/手機能夠識別的代碼(好比js),客戶端經過http請求向webdriver server發送restful的請求,webdriver server翻譯成瀏覽器/手機懂得腳本傳給瀏覽器/手機,瀏覽器/手機把執行的結果返回給webdriver server,webdriver server把返回的結果作了一些封裝(JSON Wire protocol),而後返回給客戶端腳本,客戶端根據返回值就能判斷對瀏覽器/手機的操做是否執行成功
協議就像是一個抽象類,規定了方法,以及觸發方法所須要的數據格式和內容,可是沒有具體實現;服務端須要具體去實現這些方法;客戶端則須要按照協議規定的數據格式和內容去封裝提供給用戶的api

selenium中的WebDriver類

selenium做爲一個客戶端,提供給用戶的接口基本都在selenium/webdriver/remote/webdriver.py中的WebDriver類中實現
這個類是selenium中全部關於瀏覽器driver類的基類
截取Chrome webdriver類中初始化的一段代碼:
try:
    RemoteWebDriver.__init__(
        self,
        command_executor=ChromeRemoteConnection(
            remote_server_addr=self.service.service_url,
            keep_alive=keep_alive),
        desired_capabilities=desired_capabilities)
except Exception:
    self.quit()
    raise
self._is_remote = False

能夠看到調用了基類的初始化方法,來鏈接到webdriver server,在此以前會尋找瀏覽器驅動,並自動啓動服務:java

self.service = Service(
    executable_path, # 默認爲chromedriver
    port=port,
    service_args=service_args,
    log_path=service_log_path)
self.service.start() #啓動server

以後,腳本調用對應的api,就會向這個server發送符合webdriver協議規範的http請求,server接收請求來操做瀏覽器python

appium中的WebDriver類

appium中的WebDriver繼承自不少類,功能更加豐富,固然它也繼承了selenium中的webdriver基類
class WebDriver(
    ActionHelpers,
    Activities,
    Applications,
    Clipboard,
    Context,
    DeviceTime,
    HardwareActions,
    ImagesComparison,
    IME,
    Keyboard,
    Location,
    Network,
    RemoteFS,
    ScreenRecord
):
在初始化中,command_executor參數填寫的是appium server的地址+端口號,這個appium server咱們在運行腳本前須要手動啓動
以後腳本調用對應的api,就會向這個appium server發送符合webdriver協議規範的http請求,appium server接收請求來操做手機

總結

webdriver中的三個角色

  1. 測試腳本——做爲客戶端
  2. 瀏覽器驅動/appium server——做爲服務端
  3. 瀏覽器/手機——做爲服務端操做的對象

客戶端包的做用

屏蔽有關協議的內容,讓用戶沒必要關心這些細節,只需使用提供給用戶的api便可完成相應的操做
相關文章
相關標籤/搜索