很久很久沒有更新博客了,應該有一個月了吧,這段時間內,好忙,公司的業務在上漲期,可是卻把下面的一個小朋友砍掉了(換組),因此不少打雜的時候都讓jb去作了,基本上天天活着跟鹹魚同樣~css
雖然是鹹魚,可是仍是要學習,最近在返璞歸真,作了那麼多年的測試狗,仍是要學習點理論知識,畢竟得有些料才能吹的更愉快;html
這段時間基本上都是在學習測試相關的書籍,測試工做,理論知識等,也看到不一樣的測試書籍,感受不少都不好強人意,每本書都總以爲有所欠缺,若是有機會,挺想本身擼一本的,哈哈哈;java
本篇做爲閱讀篇的第一篇,主要來介紹下selenium,介紹的緣由是,最近有些項目是web端的,隨着項目的穩定,後面會考慮自動化,而PC的自動化,基本上都是用selenium,那就來圍觀吧~node
以前看coder-pig文章時有大體瞭解,很早以前也聽過selenium,可是仍是想系統看一遍,據說蟲師的這本書還能夠,所以就來學習學習下~python
雖然這部書叫selenium,可是有大體三分之二的內容是測試跟Python相關的內容,所以會優先介紹selenium相關內容,最後會貼一些本身以爲有點用的信息;linux
說明,本篇內容是基於coder-pig的原文進行補充及介紹,算是一個整理;git
本書全名:Selenium 2 自動化測試實戰,基於Python語言 做者:蟲師 出版社:電子工業出版社 版次:2016年1月第1版github
Selenium是一個自動化測試框架,經過他,能夠編寫代碼讓瀏覽器:web
Selenium是不支持瀏覽器功能的,須要和第三方的瀏覽器一塊兒搭配使用,支持下述瀏覽器,你須要把對應的瀏覽器驅動下載到Python的對應路徑下:面試
直接利用pip命令進行安裝,命令以下:
pip install selenium
複製代碼
接着下載瀏覽器驅動,大部分用的Chrome瀏覽器,就以此爲例,其餘瀏覽器可自行搜索相關文檔,打開Chrome瀏覽器鍵入:
chrome://version
複製代碼
便可查看Chrome瀏覽器版本的相關信息,主要是關注版本號:
Google Chrome 68.0.3440.106 (正式版本) (32 位) (cohort: Stable)
修訂版本 1c32c539ce0065a41cb79da7bfcd2c71af1afe62-refs/branch-heads/3440@{#794}
操做系統 Windows
JavaScript V8 6.8.275.26
Flash 30.0.0.154 C:\Users\jb\AppData\Local\Google\Chrome\User Data\
PepperFlash\30.0.0.154\pepflashplayer.dll
用戶代理 Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/68.0.3440.106 Safari/537.36
命令行 "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
--flag-switches-begin --flag-switches-end
可執行文件路徑 C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
我的資料路徑 C:\Users\jb\AppData\Local\Google\Chrome\User Data\Default
複製代碼
這裏看到,大版本號是68,接下來到下面的這個網站查看對應的驅動版本號:
https://chromedriver.storage.googleapis.com/2.41/notes.txt
複製代碼
能夠看到以下的版本號信息。
----------ChromeDriver v2.41 (2018-07-27)----------
Supports Chrome v67-69
Resolved issue 2458: Chromedriver fails to start with whitelisted-ips option [[Pri-1]]
Resolved issue 2379: Returned capabilities should include remote debugging port [[Pri-2]]
Resolved issue 1005: driver.manage().window().getSize() is not implemented on Android [[Pri-2]]
Resolved issue 2474: desktop launcher error messages are not readable by users [[Pri-]]
Resolved issue 2496: Fail fast when not able to start binary [[Pri-]]
Resolved issue 1990: Close Window return value does not conform with spec [[Pri-]]
複製代碼
ok,那就是下載2.4.1這個版本驅動,連接:
https://chromedriver.storage.googleapis.com/index.html?path=2.41/
複製代碼
打開後能夠看到所示的頁面,選擇對應的系統下載便可。
下載完成後,把zip文件解壓下,解壓後的chromedriver.exe拷貝到Python的Scripts目錄下,另外這裏不用糾結win32,在64位的瀏覽器上也是能夠正常使用的!Mac的話把解壓後的文件拷貝到usr/local/bin目錄下 ,Ubuntu的話則拷貝到usr/bin目錄下。
接下來,來個小demo吧:
# coding = utf-8
# 爲了防止亂碼問題,以及方便的在程序中添加中文註釋,把編碼統一成 UTF-8。
from selenium import webdriver
# 導入 selenium 的 webdriver 包,只有導入 webdriver 包咱們才能使用 webdriver API 進行自動化腳本的開發。
browser = webdriver.Chrome()
#把webdriver的Chrome對象賦值給變量driver;
#只有得到了瀏覽器對象後,才能夠啓動瀏覽器,打開網址,操做頁面元素,Chrome瀏覽器驅動默認已經在Selenium WebDriver包裏了,能夠直接調用;
#要先安裝相關的瀏覽器驅動
browser.get("http://www.baidu.com")
#得到瀏覽器對象後,經過 get()方法,能夠向瀏覽器發送網址。
html_text = browser.page_source
# 得到頁面代碼
browser.quit()
#退出並關閉窗口
複製代碼
執行這段代碼後,會自動調起Chrome瀏覽器,並訪問百度,能夠看到瀏覽器頂部有下面的提示。
而且控制檯會輸出HTML的代碼,和Chrome的Elements頁面結構徹底一致。 那就能夠用selenium這麼玩了;
不過,在實踐以前,再繼續介紹下selenium其餘方法吧;
另外,若是把element改成elements會定位全部符合條件的元素,返回一個List,好比:
find_elements_by_class_name
複製代碼
Selenium定位到結點位置會返回一個WebElement類型的對象,能夠調用下述方法來提取須要的信息。
element.get_attribute()
element.text
element.tag_name
element.id
# 設置瀏覽器寬480,高800顯示
driver.set_window_size(480,800):
# 全屏顯示
driver.maximize_window()
複製代碼
在頁面操做過程當中有時候點擊某個連接會彈出新的窗口,這時候須要切換到新打開的窗口上進行操做;
# 經過window_handles來遍歷
for handle in driver.window_handles:
driver.switch_to_window(handle)
# 切換窗口
driver.switch_to.window("窗口名")
# 或經過window_handles來遍歷
for handle in driver.window_handles:
driver.switch_to_window(handle)
# 前進
driver.forward()
# 後退
driver.back()
複製代碼
driver.refresh()
複製代碼
# clear()用於清除文本輸入框中的內容
driver.find_element_by_id("idinput").clear()
# send_keys()用於模擬鍵盤向輸入框裏輸入內容
driver.find_element_by_id("idinput").send_keys("username")
# click()用於進行點擊操做
driver.find_element_by_id("loginbtn").click()
複製代碼
# 經過定位搜索框並經過submit()提交搜索框的內容,達到點擊搜索按鈕的效果
driver.find_element_by_id("query").submit()
複製代碼
有時須要在頁面上模擬鼠標操做,好比:單擊,雙擊,右鍵,按住,拖拽等,能夠導入ActionChains類:selenium.webdriver.common.action_chains.ActionChains,使用ActionChains(driver).XXX調用對應節點的行爲。
send_key()雖然能夠模擬鍵盤輸入,但除此以外,還須要輸入其餘按鍵,好比空格,這時候就須要用到Keys(); 對應類:selenium.webdriver.common.keys.Keys,使用send_keys(Keys.XX)輸入對應的內容便可;
# 獲取當前網頁的標題
driver.title
# 獲取當前網頁的url
driver.current_url
複製代碼
如今的網頁愈來愈多采用了 Ajax技術,這樣程序便不能肯定什麼時候某個元素徹底加載出來了。
若是實際頁面等待時間過長致使某個dom元素還沒出來,可是你的代碼直接使用了這個WebElement,那麼就會拋出NullPointer的異常。
爲了不這種元素定位困難並且會提升產生ElementNotVisibleException的機率。
因此Selenium 提供了兩種等待方式,一種是隱式等待,一種是顯式等待。
from selenium import webdriver
from selenium.webdriver.common.by import By
# WebDriverWait 庫,負責循環等待
from selenium.webdriver.support.ui import WebDriverWait
# expected_conditions 類,負責條件出發
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.PhantomJS()
driver.get("http://www.xxxxx.com/loading")
try:
# 每隔10秒查找頁面元素 id="myDynamicElement",直到出現則返回
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()
複製代碼
若是不寫參數,程序默認會0.5s調用一次來查看元素是否已經生成,若是原本元素就是存在的,那麼會當即返回。
下面是一些內置的等待條件,你能夠直接調用這些條件,而不用本身寫某些等待條件了。
等待條件 | 描述 |
---|---|
title_is | 標題是內容 |
title_contains | 標題包含某內容 |
presence_of_element_located | 結點加載出來,傳入定位元組 |
visibility_of_element_located | 結點課件,傳入定位元組 |
visibility_of | 可見,傳入結點對象 |
presence_of_all_elements_located | 全部結點加載出來 |
text_to_be_present_in_element | 某個結點文本包含某文字 |
text_to_be_present_in_element_value | 某個結點值包含某文字 |
frame_to_be_available_and_switch_to_it | 加載並切換 |
invisibility_of_element_located | 結點不可見 |
element_to_be_clickable | 節點可點擊 |
staleness_of | 判斷結點是否仍在DOM,經常使用於判斷頁面是否已刷新 |
element_to_be_selected | 結點可選擇,傳入結點對象 |
element_located_to_be_selected | 結點可選擇,傳入定位元組 |
element_selection_state_to_be | 傳入結點對象和狀態,相等返回True,不然返回False |
element_located_selection_state_to_be | 傳入定位元組和狀態,相等返回True,不然返回False |
alert_is_present | 是否出現警告 |
from selenium import webdriver
driver = webdriver.PhantomJS()
driver.implicitly_wait(10) # seconds
driver.get("http://www.xxxxx.com/loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")
若是不設置,就默認等待時間爲0
複製代碼
有時候但願腳本執行到某個位置作固定時間的休眠,這時候就須要用到sleep(),這個sleep方法是由Python的time模塊提供,所以使用以前須要from time import sleep;
# 休眠X秒
sleep(X)
複製代碼
在web應用中常常會遇到frame/iframe表單嵌套頁面的應用,webdriver只能在一個頁面上對元素識別與定位,對於frame/iframe沒法直接定位;
這時候就須要經過switch_to.frame()方法將當前定位的主體切換爲frame/iframe內嵌的的頁面中;
# 切換到iframe(id = "XX")
driver.switch_to.frame("XX")
複製代碼
切換後就能正常操做元素了;
switch_to.frame()默承認以直接獲取表單的id或name屬性,但若是iframe沒有可用的id和name屬性呢?
# 先經過xpath定位到iframe
xf = driver.find_element_by_xpath("//*[@class="XX"]")
# 再將定位對象傳給switch_to.frame()方法
driver.switch_to.frame(xf)
複製代碼
對應類:selenium.webdriver.common.alert.Alert,用得很少,若是你觸發了某個事件,彈出了對話框,能夠調用這個方法得到對話框:alert = driver.switch_to_alert(),而後alert對象能夠調用下述方法:
通常網頁上傳文件,都是有一個瀏覽按鈕,選擇文件點擊上傳便可,可是對應作自動化測試來講,在選擇文件那個過程是很是麻煩的;
其實,作過相似功能的同窗會發現,瀏覽按鈕其實就是input標籤實現的上傳功能,能夠看到是一個輸入框,竟然如此,就能夠用send_keys()來模擬;
driver.find_element_by_name("file").send_keys("C:\\jb.txt")
複製代碼
運行設置文件下載路徑;
options = webdriver.ChromeOptions()
prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory': os.getcwd()}
options.add_experimental_option('prefs', prefs)
driver = webdriver.Chrome(chrome_options=options)
driver.get("http://pypi.Python.org/pypi/selenium")driver.find_element_by_partial_link_text("selenium-3.11.0-py2.py3-none-any").click()
複製代碼
driver.save_screenshot("截圖.png")
# 截取當前窗口,並指定截圖圖片的保存位置
dirver.get_screenshot_as_file("C:\\jb\\jb.jpg")
複製代碼
有些站點須要登陸後才能訪問,用Selenium模擬登陸後獲取Cookie,
而後供爬蟲使用的場景很是常見,Selenium提供了獲取,增長,刪除Cookies的函數,代碼示例以下:
# 獲取全部Cookies
browser.get_cookies()
# 獲取name對應的cookie信息
browser.get_cookie(name)
# 增長Cookies,是字典對象,必需要有name 和value
browers.add_cookie({xxx})
driver.add_cookie({"name":"jb","value":"jbtest"})
# 若是須要遍歷,則以下:
for cookie in driver.get_cookies():
print("%s -> %s " % (cookie["name"],cookie["value"]))
# 刪除全部Cookies
browser.delete_cookies()
# 刪除Cookie信息,name是要刪除的cookie的名稱,optionsString是該cookie的選項,目前支持的選項包括「路徑」和「域」
browser.delete_cookie(name,optionsString)
複製代碼
實踐:
from selenium import webdriver
browser = webdriver.Chrome()
url = "https://www.baidu.com/"
browser.get(url)
# 經過js新打開一個窗口
newwindow='window.open("https://www.baidu.com");'
# 刪除原來的cookie
browser.delete_all_cookies()
# 攜帶cookie打開
browser.add_cookie({'name':'ABC','value':'DEF'})
# 經過js新打開一個窗口
browser.execute_script(newwindow)
input("查看效果")
browser.quit()
複製代碼
這裏仍是須要說下,add_cookie方法接受一個字典,字典中包含name,value,path,domain,secure,expiry,
正確的寫cookie格式:
cookie = {
# "domain": ".58.com", #Firefox瀏覽器不能寫domain,若是寫了會報錯,谷歌須要寫不然也是報錯,這裏就是一個坑。其餘瀏覽器沒測試不知道狀況。
'name': name,
'value': value,
"expires": "",
'path': '/',
'httpOnly': False,
'HostOnly': False,
'Secure': False,
}
name:cookie的名稱
value:cookie對應的值,動態生成的
domain:服務器域名
expiry:Cookie有效終止日期
path:Path屬性定義了Web服務器上哪些路徑下的頁面可獲取服務器設置的Cookie
httpOnly:防腳本攻擊
secure:在Cookie中標記該變量,代表只有當瀏覽器和Web Server之間的通訊協議爲加密認證協議時
複製代碼
爲何要構形成這樣子,其實咱們看下瀏覽器保存的cookie格式就明白了。下圖就是谷歌瀏覽器的cookie 的截圖。
代碼應該這麼寫:
這裏有個問題,cookie要key:value的格式,是很是麻煩的,尤爲是像豆瓣那樣很是很是長的cookie,再手動一個一個改格式,這個工做量還不如從新用selenium寫一個登錄操做;
fiddler轉包的cookie格式是這樣的:
一個一個改會崩潰的;因此遇到cookie很長的狀況,還不如寫一個登錄腳本保存吧~
雖然webdriver提供瀏覽器的前進和後退,可是並不提供滾動瀏覽器的操做,所以來藉助JS來控制瀏覽器的滾動條;
driver.execute_script(js語句)
複製代碼
好比滾動到底部的代碼示例以下:
js = document.body.scrollTop=10000
driver.execute_script(js)
複製代碼
又如設置瀏覽器窗口的滾動條位置:
js = "window.scrollTo(100,450)"
driver.excute_script(js)
複製代碼
向文本框輸入文本信息:
text = "jbtest"
js = "var sum=document.getElementById("id"); sum.value='"+text+ " ';"
driver.excute_script(js)
複製代碼
HTML5定義了一個新的元素video,指定了一個標準的方式來嵌入電影片斷;
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("http://videojs.com/")
video = driver.find_element_by_xpath("body/Setion[1]/div/video")
# 返回播放文件地址
url = driver.execute_script("return arguments[0].currentSrc;",video)
# 播放視頻
driver.execute_script("return arguments[0].play()",video)
# 暫停視頻
driver.execute_script("arguments[0].pause()",video)
複製代碼
JS函數有個內置的對象叫作arguments; arguments對象包含了函數調用的參數數組,[0]表示取對象的第一個值;
在介紹Headless以前,必須介紹下PhantomJS,
PhantomJS是沒有界面的瀏覽器,特色:
會把網站加載到內存並執行頁面上的JavaScript,由於不會展現圖形界面,因此運行起來比完整的瀏覽器要高效
而上面的例子,每次執行後,都會打開瀏覽器,很麻煩,這麼看,PhantomJs是剛需啊;
但這裏不打算介紹PhantomJs,由於18年4月份,維護者宣佈退出PhantomJs,意味着這個項目再也不維護了;而同時,Chrome和FireFox也開始 提供Headless模式(無需調起瀏覽器),因此,後面的phantomjs小夥伴會遷移到這兩個瀏覽器上;
注意:Windows Chrome須要60以上的版本才支持 Headless模式,linux,unix系統須要 chrome瀏覽器 >= 59
啓用Headless模式也很簡單,以上面打開百度的代碼舉例,代碼以下:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_option = Options()
chrome_option.add_argument("--headless")
chrome_option.add_argument("--disable-gpu")
browser = webdriver.Chrome(chrome_options=chrome_option) # 調用本地的Chrome瀏覽器
browser.get('http://www.baidu.com') # 請求頁面,會打開一個瀏覽器窗口
html_text = browser.page_source # 得到頁面代碼
browser.quit() # 關閉瀏覽器
print(html_text)
複製代碼
就是多了設置chrome_option這幾步,執行後,就不會再彈出瀏覽器了,是否是很方便??
from selenium import webdriver
# 進入瀏覽器設置
options = webdriver.ChromeOptions()
# 設置中文
options.add_argument('lang=zh_CN.UTF-8')
# 更換頭部
options.add_argument('user-agent="Mozilla/5.0 (iPod; U; CPU iPhone OS 2_1 like Mac OS X; ja-jp) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5F137 Safari/525.20"')
browser = webdriver.Chrome(chrome_options=options)
url = "https://httpbin.org/get?show_env=1"
browser.get(url)
browser.quit()
複製代碼
舒適提示:遇到JS加載的問題,建議先嚐試破解JS,不行再用selenium,selenium屬於無腦類型,並且效率比較差,假如你有1W個網站,都跑一趟,估計要一天了;
大部分selenium相關的操做都介紹完了,先留個印象,那接下來,讓咱們看看怎麼用selenium來獲取豆瓣驗證碼captcha這個屬性吧;
"Cookie":"your cookie" #這裏須要輸入你本身的cookie信息,若是遇到轉義字符,轉
義字符前面加\便可
複製代碼
Selenium主要用於Web應用程序的自動化測試;
特色:
Selenium有兩個版本:Selenium 1.0 和Selenium 2.0; Selenium不是由單獨一個工具構成的,而是由一些插件、類庫組成,每一個部分都有起特色和應用場景;
Selenium 1.0家譜:
Selenium IDE是嵌入到Firefox瀏覽器中的一個插件,實現簡單的瀏覽器操做的錄製與回放功能;
官方給出它自身做用的定位:
快速地建立bug重現腳本,在測試人員測試過程當中,發現bug以後能夠經過IDE將重現的步驟錄製下來,以幫助開發人員
更容易的重現bug;
複製代碼
那就能夠理解,IDE的重點在於錄製,避免不會寫代碼的同窗,並且每次寫xpath也會很煩;
在線安裝 經過 firefox 瀏覽器訪問 selenium;
在 selenium IED 下載介紹部分,點擊版本號連接;
firefox 瀏覽器將自動識別須要下載的 selenium IED 插件,,點擊 Install Now 按鈕,安裝 selenium IED 插件。
安裝完成後重啓 firefox 瀏覽器,經過菜單欄「Tools(工具)」---> selneium IDE 能夠打開,或經過 Ctrl+Alt+S 快捷鍵打開。
可是實際,上面的url,試了半天都訪問不了,另外還有,若是非Firefox瀏覽器是否是就用不了IDE?
插件安裝 非也,還有個插件安裝的方法,此方法來自小敏同窗親測可行,Python2.7版本,Firefox40.0版本;
1)python2.7 mac/Linux自帶,不用裝; Windows須要手動安裝,要裝的小夥伴自行百度,so easy ~
2)selenium 因爲selenium IDE在新版本firefox上並不支持,沒有錄製功能寫起來仍是挺費神的,建議保守的都選擇舊版本。
若是已經安裝了selenium3,須要先卸載;
查看selenium版本命令:
pip show selenium
卸載selenium命令:
pip uninstall selenium
複製代碼
selenium用命令行pip install selenium==2.53.6安裝時,因爲被牆了,選擇下載安裝包自行安裝,步驟以下:
3)下載安裝firefox 40.0版本
4)下載selenium_ide-2.9.1-fx.xpi,拖到firefox裏面安裝好後,firefox右上角多出selenium IDE插件入口
5)下載firebug-2.0.16-fx.xpi,拖到firefox裏面安裝好後,firefox右上角多出firebug插件入口
至此,環境安裝完成。
6)錄製自動化腳本 點擊firefox右上角selenium IDE插件圖標,進入selenium IDE主界面;
7)優化腳本 上步中最後導出的腳本,只包含了操做,沒有包含斷言結果判斷,也缺乏容錯,想要持續集成自動生成結果,還須要本身按需補充。
是一種自動的測試輔助功能,Grid經過利用現有的計算機基礎設施,能加快Web-App的功能測試;
利用Grid能夠很方便地實如今多臺機器上和異構環境中運行測試用例;
聽上去會一臉懵逼,簡單說,Selenium Grid能夠解決重複執行測試和多瀏覽器兼容測試的亮點,而且是使用分佈式執行測試;
那分佈式是什麼概念?簡單的說就是老大收到任務,分發給手下去幹;
經過Selenium Grid的能夠控制多臺機器多個瀏覽器執行測試用例,分佈式上執行的環境在Selenium Grid中稱爲node節點。
舉例說明一下,好比用例上萬,一臺機器執行所有測試用例耗時5個小時,而若是須要覆蓋主流瀏覽器好比Chrome、Firefox,加起來就是10個小時;
最笨的辦法就是另外拿臺機器,而後部署環境,把測試用例分開去執行而後合併結果便可。
而Selenium也想到了這點,因此有了Selenium Grid的出現,它就是解決分佈式執行測試的痛點。
Selenium Grid實際它是基於Selenium RC的,而所謂的分佈式結構就是由一個hub節點和若干個node代理節點組成。
Hub用來管理各個代理節點的註冊信息和狀態信息,而且接受遠程客戶端代碼的請求調用,而後把請求的命令轉發給代理節點來執行。
下面結合環境部署來理解Hub與node節點的關係。
1)下載selenium-server-standalone-2.53.1.jar
2)啓動hub
使用快捷鍵WIN+R打開運行對話框,輸入cmd肯定,進入命令窗口
進入selenium-server-standalone-2.53.1.jar包的位置,如E:\selenium;
啓動hub,命令以下:
java -jar selenium-server-standalone-2.53.1.jar -role hub -maxSession 10 -port 4444
複製代碼
參數 | 解釋 |
---|---|
role hub | 啓動運行hub |
port | 設置端口號,hub的默認端口是4444,這裏使用的是默認的端口,固然能夠本身配置 |
maxSession | 最大會話請求,這個參數主要要用併發執行測試用例,默認是1,建議設置10及以上 |
瀏覽器打開地址:http://localhost:4444/grid/console,出現以下圖表示hub啓動成功。
啓動hub後,就須要運行節點啦,最少都要有一個node節點,否則hub就成空頭司令了;而node節點能夠與hub在同一臺機器上運行,演示一個node節點與hub同機,另外一個node節點啓動了一臺虛擬機。
名稱 | IP |
---|---|
hub機 | 192.168.0.245 |
node1機 | 192.168.0.245 |
node2機 | 192.168.0.183 |
3)啓動node節點1
node1節點,配置firefox瀏覽器,運行下面命令:
java -jar selenium-server-standalone-2.53.1.jar -role node -port 5555 -hub http://192.168.0.245:4444/grid/register -maxSession 5 -browser browserName=firefox,seleniumProtocol=WebDriver,maxInstances=5 ,platform=WINDOWS,version=45.0.2
複製代碼
沒有報錯則再次刷新一下http://localhost:4444/grid/console的訪問會發現node節點已經顯示,表示啓動成功;
參數 | 解釋 |
---|---|
role node | 啓動運行node節點 |
port 555 | 指定node節點端口 |
hub http://192.168.0.245:4444/grid/register | hub機地址 |
maxSession 5 | node節點最大會話請求 |
browser browserName=firefox,seleniumProtocol=WebDriver, maxInstances=5,platform=WINDOWS,version=45.0.2 | 這個就是設置瀏覽器的參數啦 |
browserName表示瀏覽器名字,maxInstances表示最大實例,能夠理解爲最多可運行的瀏覽器數,不能大於前面maxSession的值,不然可能會出錯;platform表示操做系統;version表示瀏覽器版本。
複製代碼
4)啓動node節點2
node2節點,在目錄放了chromedriver.exe文件,這裏要提示一下,這個chromedriver.exe文件前面說過下載地址了,主要是版本須要與系統中安裝的chrome瀏覽器匹配;
java -jar selenium-server-standalone-2.53.1.jar -role node -port 6666 -hub http://192.168.0.245:4444/grid/register -Dwebdriver.chrome.driver=chromedriver.exe -maxSession 5 -browser browserName=chrome,seleniumProtocol=WebDriver,maxInstances=5,platform=WINDOWS
複製代碼
沒有報錯則再次刷新一下http://localhost:4444/grid/console的訪問會發現node節點已經顯示,表示啓動成功;
若是使用的chromedriver.exe與selenium-server-standalone-2.53.1版本或者瀏覽器chrome版本不匹配都會報錯提示,具體緣由須要具體解決。
參數 | 解釋 |
---|---|
Dwebdriver.chrome.driver=chromedriver.exe | 瀏覽器插件,若是是其餘瀏覽器就寫對應的名字 |
如firefox: -Dwebdriver.firefox.driver=geckodriver.exe
注意多了這個參數注意是chromedriver.exe須要指定,而對於Webdriver2是支持geckodriver因此不須要指定geckodriver,但前提是firefox瀏覽器版本不能大於46,因此看到node節點1使用的是45版本的瀏覽器。
複製代碼
當實例化Hub遠程時,會根據配置去匹配Hub上註冊的node代理節點,匹配成功後轉發給代理節點,這時候代理節點會生成sessionid啓動瀏覽器,而後響應給Hub說一切準備就緒,Hub也會把這個sessionid響應給客戶端,接下來的客戶端的代碼發來的請求都會被Hub轉發給這個代理節點來執行。這裏實際上整個流程與Selenium1.0的原理是同樣的,只是多了Hub這一層。
DesiredCapabilities capability = new DesiredCapabilities();
capability.setBrowserName("chrome");
capability.setPlatform(Platform.WINDOWS);
try {
WebDriver driver = new RemoteWebDriver(new URL("http://192.168.0.245:4444/wd/hub"), capability);
driver.get("http://www.baidu.com");
driver.quit();
} catch (MalformedURLException e) {
e.printStackTrace();
}
複製代碼
根據上面代碼會發現node節點2執行,若是把setBrowserName()方法裏面的傳參改了firefox就會在node節點1執行。表示Selenium Grid環境搭建完成。
另外客戶端還能夠直接使用node節點運行代碼,這樣的方式就與selenium1.0如出一轍啦,看下面代碼:
DesiredCapabilities capability = new DesiredCapabilities();
capability.setBrowserName("chrome");
capability.setPlatform(Platform.WINDOWS);
try {
WebDriver driver = new RemoteWebDriver(new URL("http://192.168.0.183:6666/wd/hub"), capability);
driver.get("http://www.baidu.com");
driver.quit();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
複製代碼
要注意實例化driver對象時填寫的服務地址是node節點的地址,這樣就會直接去節點運行;還有一個注意的就是DesiredCapabilities配置,必定要設置該節點運行參數正確的瀏覽器、瀏覽器版本、系統,若是參數不對都會出現報錯。
Selenium RC(Remote Control)是Selenium家族的核心部分; 支持多種不一樣語言編寫的自動化測試腳本,經過Selenium RC的服務器做爲代理服務器去訪問應用,從而達到測試目的;
selenium RC 分爲 Client Libraries 和 Selenium Server; Client Libraries 庫主要主要用於編寫測試腳本,用來控制 selenium Server 的庫。 Selenium Server 負責控制瀏覽器行爲;
總的來講,Selenium Server 主要包括 3 個部分: Launcher、Http Proxy、Core。
其中 Selenium Core 是被 Selenium Server 嵌入到瀏覽器頁面中的。 其實 Selenium Core 就是一堆 JS 函數的集合,就是經過這些 JS 函數,咱們才能夠實現用程序對瀏覽器進行操做。
Launcher 用於啓動瀏覽器,把 selnium Core 加載到瀏覽器頁面當中,並把瀏覽器的代理設置爲 Selenium Server 的Http Proxy。
Selenium 2.0 是把 WebDriver 加入到了這個家族中; 簡單用公式表示爲:
selenium 2.0 = selenium 1.0 + WebDriver
在 selenium 2.0 中主推的是 WebDriver ,WebDriver 是 selenium RC 的替代品; 那麼 selenium RC 與 webdriver 主要有什麼區別呢?
Selenium RC 在瀏覽器中運行 JavaScript 應用,使用瀏覽器內置的 JavaScript 翻譯器來翻譯和執行 selenium 命令)。
WebDriver 經過原生瀏覽器支持或者瀏覽器擴展直接控制瀏覽器。
WebDriver 針對各個瀏覽器而開發,取代了嵌入到被測 Web 應用中的 JavaScript。與瀏覽器的緊密集成支持建立更高級的測試,避免了JavaScript 安全模型致使的限制。
除了來自瀏覽器廠商的支持,WebDriver 還利用操做系統級的調用模擬用戶輸入。
複製代碼
WebDriver是按照Server-Client的設計模式設計的;
Server端就是Remote Server,能夠是任意的瀏覽器; 當咱們的腳本啓動瀏覽器後,該瀏覽器就是Remote Server,職責就是等待Client發送請求並作出響應;
Client端簡單理解就是測試代碼; 腳本的行爲是以http請求的方式發送給被測試的瀏覽器,瀏覽器接受請求,執行相應操做,並在response中返回執行狀態,返回等信息;
WebDriver的工做流程:
斷斷續續的看了這本書好久好久,仍是由於本身懶;
看完這本書,對selenium的api至少留個印象,最重要的仍是找控件的8種方式,通常若是Jb去面試,也會問這個問題,固然也會有selenium的原理以及2.0跟1.0的區別,不事後面幾點只是作簡單瞭解,不作任何評價;
可別忘記了,selenium對因而能夠獲取JS加載後的頁面內容,若是想爬一個網頁,並且內容是JS加載的,若是不想研究JS,就用selenium吧,賊好用的玩意;
立個flag,以前太忙了,致使一個月沒更新博客,感受人都廢了,所以立一個,一週更新一篇的flag,看能堅持多久吧~
最後,貼這個這本書電子版的連接:
https://pan.baidu.com/s/1b8T6Iq?errno=0&errmsg=Auth%20Login%20Sucess&&bduss=&ssnerror=0&traceid=
複製代碼
這裏說明下,電子版跟實體書仍是有點不同,若是隻是用來查api,看這篇文章或者看電子書就行了,主要的內容沒什麼變化;
謝謝你們~