<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      《Selenium自動化測試實戰:基于Python》之 基于Docker與Selenium Grid的測試技術

                             基于Docker與Selenium Grid的測試技術                        

      10.1  Selenium Grid簡介

        盡管即將推出的Selenium 4.0對Selenium Grid的一些新特性進行了說明(截至本書完稿時,Selenium 4.0尚未正式發布),但是從目前看,官方并沒有太多詳細文檔供大家參考,所以本書仍結合目前廣泛使用的Selenium Grid 版本進行講解。參見官網上的描述,Selenium Grid是智能代理服務器,允許Selenium將測試命令路由到遠程Web瀏覽器實例,目的是提供一種在多臺計算機上并行運行測試的簡便方法。使用Selenium Grid,一臺服務器可以充當將JSON格式的測試命令路由到一個或多個已注冊Grid節點的中樞,以獲得對遠程瀏覽器實例的訪問。Selenium Grid允許我們在多臺計算機上并行運行測試,并集中管理不同的瀏覽器版本和瀏覽器配置。如圖10-1所示,可以看到Selenium Grid主要由Hub和Node兩部分構成。可以使用Python、Java、C#等語言編寫和測試Selenium腳本,每個Selenium Grid僅有一個Hub,客戶端腳本可以指定連接到這個Hub(主控節點或者叫集線器),Hub接收客戶端腳本的運行測試請求,同時將這些測試請求分發到已注冊的一個或多個節點以執行并收集運行結果。Selenium Grid中可以有一個或多個Node(節點)。作為節點的機器不必與Hub或其他Node具有相同的操作系統或瀏覽器。換言之,某個Node可能使用的是Windows操作系統,而在Windows操作系統中安裝的是Internet Explorer瀏覽器,另外的Node可能使用的是Linux操作系統、macOS,而它們安裝的瀏覽器可能是Firefox、Safari、Chrome等。這些Node的設置結合測試來講,就是看想做哪些操作系統和瀏覽器版本的兼容性測試,在實際工作中請結合測試執行計劃和策略進行選擇。

       

      圖10-1  Selenium Grid的組件構成

      10.2  基于Docker的Selenium Grid的相關配置

        Docker Hub提供了Selenium Grid的相關鏡像文件以供使用,如圖10-2所示。

       

      圖10-2  Selenium Grid的相關鏡像文件

        這里,我們使用docker pull命令分別將這3個鏡像文件拉取下來,對應的拉取命令如下。

      docker pull selenium/hub
      docker pull selenium/node-chrome
      docker pull selenium/node-firefox
      

        拉取鏡像文件到本地后,可以使用docker images命令查看一下相關鏡像的信息,如圖10-3所示。

       

      圖10-3  Selenium Grid的相關鏡像信息

        這里我們先測試一下Hub與Node之間的連通性。

        創建并啟動Hub容器,如圖10-4所示。

       

      圖10-4  創建并啟動Hub容器

        創建并啟動 chromenode容器節點,如圖10-5所示。

       

      圖10-5  創建并啟動chromenode容器節點

        創建并啟動 firefoxnode容器節點,如圖10-6所示。   

       

      圖10-6  創建并啟動firefoxnode容器節點

        接下來,在本機瀏覽器的地址欄中輸入http://localhost:4444/grid/console并按Enter鍵,打開Selenium Grid的控制臺,出現圖10-7所示頁面。

       

      圖10-7  Selenium Grid的控制臺

        從圖10-7可知,當前使用的Selenium Grid 版本為3.141.59,連接到Hub的兩個Node中,IP地址為172.17.0.4的Linux操作系統使用的是75.0版本的Firefox瀏覽器,IP地址為172.17.0.3的Linux操作系統使用的是81.0.4044.92版本的Chrome瀏覽器。默認情況下,Hub使用的是4444端口,而Node在本例中使用的是5555端口。如果在同一個容器中出現端口沖突等情況,則需要根據實際情況進行調整以避免端口沖突情況再次發生。

      10.3  基于Docker + Selenium Grid的案例演示

             下面結合Bing搜索案例在Chrome和Firefox瀏覽器中實現兼容性測試。在經過對Selenium、Docker和Selenium Grid相關知識的學習后,你想到了什么?是不是通過使用Docker + SeleniumGrid就能夠完成基于不同瀏覽器的兼容性測試呢?是的,這確實是個好主意。

        但是,為了讓Selenium測試腳本在不同的瀏覽器中運行,又需要做些什么呢?

        在腳本設計上,需要做一些改變。通常情況下,要在腳本運行時指定主機和端口號,使用的腳本如下。

      import time
      from selenium import webdriver
      from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
      
      driver = webdriver.Remote(
          command_executor='http://192.168.1.102:4444/wd/hub',
          desired_capabilities=DesiredCapabilities.CHROME)
      base_url = 'https://cn.bing.com'
      driver.get(base_url)
      driver.save_screenshot('chrome.png')
      driver.close()
      

        通常在執行時,只需要指定Hub的地址(http://192.168.1.102:4444/wd/hub)。這里宿主機的IP地址信息如圖10-8所示,Hub會將腳本自動分配給Node去執行。

       

      圖10-8  宿主機的IP地址信息

      • command_executor:選填參數,可指定遠程服務器的URL字符串或自定義遠程連接,默認為http://127.0.0.1:4444/wd/hub。
      • desired_capabilities參數:必填參數,可根據情況配置為在啟動瀏覽器會話時請求功能字典。這里我們使用的是DesiredCapabilities.CHROME,對應的源代碼如下所示。
      class DesiredCapabilities(object):
      
          """
          Set of default supported desired capabilities.
          Use this as a starting point for creating a desired capabilities object for
          requesting remote webdrivers for connecting to selenium server or selenium grid.
          Usage Example::
               from selenium import webdriver
              selenium_grid_url = "http://198.0.0.1:4444/wd/hub"
              capabilities = DesiredCapabilities.FIREFOX.copy()
              capabilities['platform'] = "WINDOWS"
              capabilities['version'] = "10"
              driver = webdriver.Remote(desired_capabilities=capabilities,
                                        command_executor=selenium_grid_url)
          Note: Always use '.copy()' on the DesiredCapabilities object to avoid the side
          effects of altering the Global class instance.
          """
      
          FIREFOX = {
              "browserName": "firefox",
              "acceptInsecureCerts": True,
          }
      
           INTERNETEXPLORER = {
              "browserName": "internet explorer",
              "version": "",
              "platform": "WINDOWS",
          }
      
           EDGE = {
              "browserName": "MicrosoftEdge",
              "version": "",
              "platform": "ANY"
          }
      
          CHROME = {
              "browserName": "chrome",
              "version": "",
              "platform": "ANY",
          }
      
           OPERA = {
              "browserName": "opera",
              "version": "",
              "platform": "ANY",
          }
      
           SAFARI = {
              "browserName": "safari",
              "version": "",
              "platform": "MAC",
          }
      
           HTMLUNIT = {
              "browserName": "htmlunit",
              "version": "",
              "platform": "ANY",
          }
      
           HTMLUNITWITHJS = {
              "browserName": "htmlunit",
              "version": "firefox",
              "platform": "ANY",
              "javascriptEnabled": True,
          }
      
           IPHONE = {
              "browserName": "iPhone",
              "version": "",
              "platform": "MAC",
          }
      
          IPAD = {
              "browserName": "iPad",
              "version": "",
              "platform": "MAC",
          }
      
          ANDROID = {
              "browserName": "android",
              "version": "",
              "platform": "ANDROID",
          }
      
           PHANTOMJS = {
              "browserName": "phantomjs",
              "version": "",
              "platform": "ANY",
              "javascriptEnabled": True,
          }
      
           WEBKITGTK = {
              "browserName": "MiniBrowser",
              "version": "",
              "platform": "ANY",
          }
      
          WPEWEBKIT = {
              "browserName": "MiniBrowser",
              "version": "",
              "platform": "ANY",
          }

        從DesiredCapabilities類的源碼可知DesiredCapabilities.CHROME是DesiredCapabilities類定義的字典對象。

        這里采用多線程的方式,分別在Chrome和Firefox瀏覽器中執行Bing搜索業務。

        Grid_Test.py文件的內容如下。

      from threading import Thread
      from selenium import webdriver
      from time import sleep,ctime
      from selenium.webdriver.common.by import By
      
      def Test_Bing(Host, Browser):
          caps = {'browserName': Browser}  
          driver = webdriver.Remote(command_executor=Host, desired_capabilities=caps)
          driver.get('http://www.bing.com')
          driver.find_element(By.ID,'sb_form_q').send_keys('異步社區')
          driver.find_element(By.ID,'sb_form_go').click()
          PicName=Browser+'_result'+'.png'
          driver.save_screenshot(PicName)
          assert ('沒有與此相關的結果' not in driver.page_source)
          sleep(2)
          driver.close()
      
      if __name__ == '__main__':
          pcs = {'http://192.168.1.102:4444/wd/hub': 'chrome',
                   'http://localhost:4444/wd/hub': 'firefox'
                   }
          threads = []
          tds=range(len(pcs))
          #創建線程
          for host, browser in pcs.items():
              t = Thread(target=Test_Bing, args=(host, browser))
              threads.append(t)
          #啟動線程
          for i in tds:
              threads[i].start()
          for i in tds:
              threads[i].join()
      

        從上面的腳本可以看到,這里創建了一個名為Test_Bing()的函數,它包含兩個參數,分別用來指定主機和瀏覽器。這個函數的執行意圖就是根據遠程服務器的URL字符串和傳入的瀏覽器名稱字符串,在對應的瀏覽器中執行搜索業務,且搜索詞為“異步社區”。然后對執行結果進行截圖,截圖的名稱為對應瀏覽器的名稱加上_result.png,最后對搜索結果進行斷言。需要說明的是,這里進行截圖的目的不僅是看一下結果,還要看一下執行過程。在使用Selenium Grid時,由于測試過程中不會出現瀏覽器,因此看不到執行過程。如果還想看看不同的容器在執行過程中的界面,那么可以使用VNC Viewer連接到對應的容器(但需要下載對應的selenium/node-firefox-debug和selenium/node-chrome- debug鏡像文件,以debug結尾的鏡像都帶有VNC服務器,在本機上安裝VNC客戶端后即可遠程連接。5900端口為VNC Viewer的監聽端口,因此做了端口映射),如圖10-9和圖10-10所示。

       

      圖10-9  創建并啟動Debug版本的節點容器

       

      圖10-10  使用VNC Viewer觀察節點容器的腳本執行情況

        事實上,這對于測試工作并沒有太多意義,因而不做太多文字贅述。

        主函數定義了一個包含兩個元素的字典,這里雖然使用了同一個地址,但采用的是兩種不同的表示方式(宿主機的IP地址為192.168.1.102),而localhost也表示宿主機。那么為什么不都用192.168.1.102或localhost呢?這是因為字典的鍵(key)是不允許重復的。接下來,我們創建了一個線程列表,以pcs字典的鍵、值作為Test_Bing()函數的參數添加到這個線程列表中,而后啟動這個線程列表中的各個線程。

        在運行腳本前,需要保證創建并啟動Hub和Node容器(這里應用的是非Debug版本的Node鏡像),如圖10-11所示。

       

      圖10-11  創建并啟動Hub和Node容器

        腳本執行完畢后,將會生成chrome_result.png和firefox_result.png兩個圖片文件,如圖10-12所示。

       

        圖10-12  腳本執行完畢后生成的圖片文件

        在本次兼容性測試中,這兩個瀏覽器執行了相同的Bing搜索業務,它們的頁面展示、布局、內容基本是相同的,但存在兩個小的問題。第一個小問題就是在Chrome瀏覽器中搜索到的結果有855 000條(見圖10-13),而在Firefox瀏覽器中搜索到的結果有859 000條(見圖10-14),它們是不一致的。另一個小問題是,Firefox瀏覽器會顯示Sign in和登錄圖標,而Chrome瀏覽器沒有。從理論上講,這是兩個嚴重度級別較低的小Bug,建議針對這兩個小的差異,與產品及研發人員再確認一下,產品、測試及研發人員應統一、明確需求,明確后再修改需求或代碼,使兩者保持一致。

       

      圖10-13  在Chrome瀏覽器中搜索到的結果

       

       

      圖10-14  在Firefox瀏覽器中搜索到的結果

      京東:https://item.jd.com/13123910.html

      當當:http://product.dangdang.com/29204520.html

      答疑解惑群:50788246

      posted on 2021-03-26 08:59  測試者家園  閱讀(751)  評論(0)    收藏  舉報

      導航

      主站蜘蛛池模板: 欧洲lv尺码大精品久久久| 日韩狼人精品在线观看| 国产精品国三级国产av| 日韩亚洲精品中文字幕| 狠狠亚洲色一日本高清色| 久播影院无码中文字幕| 九九在线精品国产| 日韩一区二区三区精彩视频| 香港特级三A毛片免费观看| 国产区成人精品视频| 欧美人与zoxxxx另类| 国产亚洲精品黑人粗大精选| 亚洲av男人电影天堂热app| 亚州中文字幕一区二区| 国产成人高清精品免费软件| 野花社区www视频日本| 福利成人午夜国产一区| 大香伊蕉在人线国产免费| 国产无遮挡无码视频在线观看| 日本强伦片中文字幕免费看| 日韩精品一区二区三区四| 麻豆国产va免费精品高清在线| 丰满少妇被猛烈进出69影院| 日本三级香港三级三级人妇久| 婷婷丁香五月激情综合| 精品av一区二区三区不卡| 狠狠色狠狠色综合| 亚洲成av人片色午夜乱码| 亚洲国产超清无码专区| 高清破外女出血AV毛片| 无码免费大香伊蕉在人线国产| 色综合久久久久综合体桃花网| 极品少妇的粉嫩小泬看片| 亚洲精品美女一区二区| 韩国免费a级毛片久久| 国产无遮挡免费真人视频在线观看| 成在人线av无码免费高潮水老板 | 国内精品大秀视频日韩精品| 亚洲精品乱码久久久久久中文字幕 | 国产精品自在自线免费观看| 国产成人综合色视频精品|