主頁 >  其他 > 《Selenium自動化測驗實戰:基于Python》之 基于Docker與Selenium Grid的測驗技術

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

2021-04-01 18:25:33 其他

                       基于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

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/270687.html

標籤:其他

上一篇:記一次關于pymysql--fetchall()函式回傳值引發的對mysql欄位,函式(欄位)查詢結果的思考

下一篇:【介面自動化】2.快速搭建介面自動化框架

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more