Python使用Splinter(Selenium)進(jìn)行瀏覽器模擬測(cè)試

每次看到selenium都覺(jué)得很牛囱持,但是苦于文檔(包括英文)太少履婉,我到今天才真正完整地安裝使用了一把蚀腿。我不喜歡來(lái)一個(gè)項(xiàng)目就在自己電腦上搭一個(gè)運(yùn)行環(huán)境,而是喜歡在docker或者虛擬機(jī)里進(jìn)行操作舷嗡,問(wèn)題是docker或者虛擬機(jī)里并沒(méi)有任何的可視化的瀏覽器轴猎,而Selenium又依賴于這些瀏覽器驅(qū)動(dòng),我是最討厭安裝驅(qū)動(dòng)的进萄,因?yàn)轵?qū)動(dòng)這個(gè)東西電腦不同差距特別大捻脖,總是會(huì)出現(xiàn)各種問(wèn)題烦秩。而在服務(wù)器上如何安裝selenium或者splinter,這個(gè)過(guò)程在網(wǎng)上基本是找不到的郎仆,所以這里記錄下自己的安裝方法。

注:這里之所以要使用splinter兜蠕,而不只使用selenium是因?yàn)閟plinter在selenium之上又封裝了一層扰肌,使得接口更為簡(jiǎn)單。

Linux install Splinter(Selenium)

首先熊杨,需要安裝必要的python包

pip3 install splinter selenium xvfbwrapper

需要注意的是曙旭,splinter只有在使用瀏覽器的時(shí)候才需要安裝selenium,如果僅僅是在flask或者django中進(jìn)行測(cè)試是不需要的晶府。

安裝chromedriver

ChromeDriver首頁(yè)-WebDriver for Chrome桂躏,下載對(duì)應(yīng)操作系統(tǒng)的最新的chromedriver

wget http://chromedriver.storage.googleapis.com/2.23/chromedriver_linux64.zip

unzip chromedriver_linux64.zip

mv chromedriver /usr/bin # 添加到PATH即可

chromedriver # 運(yùn)行命令進(jìn)行測(cè)試,沒(méi)拋錯(cuò)則表示正確了

Docker版本Selenium

https://github.com/SeleniumHQ/docker-selenium

handless browser

https://zhuanlan.zhihu.com/p/26810049?utm_medium=social&utm_source=qq

Linux Server(Raspberry Pi)安裝瀏覽器

上面的方式是直接打開(kāi)瀏覽器的方式川陆,但是在Server上面沒(méi)有界面剂习,也就沒(méi)有瀏覽器,這種情況就得安裝單獨(dú)的真對(duì)server的瀏覽器了较沪。最先我想使用ChromeDriver鳞绕,但是無(wú)論怎么折騰也安裝不上,于是就用了Firefox尸曼,發(fā)現(xiàn)一篇很好的教程们何。它這個(gè)版本被稱作Selenium headless firefox。安裝步驟如下:

# 添加repository控轿,并安裝firefox

sudo add-apt-repository ppa:mozillateam/firefox-stable

sudo apt-get update

sudo apt-get install firefox

# 安裝Xvfb: 是用來(lái)虛擬X服務(wù)程序冤竹,實(shí)現(xiàn)X11顯示的協(xié)議

sudo apt-get install xvfb

sudo Xvfb :10 -ac? # 10表示編號(hào)

# 設(shè)置環(huán)境變量

export DISPLAY=:10

# 就可以使用了

firefox

開(kāi)始Splinter(Selenium)

無(wú)桌面環(huán)境

from splinter import Browser

from xvfbwrapper import Xvfb

from selenium.webdriver.chrome.options import Options

# 由于是在server上運(yùn)行chrome,所以必須用一些模擬器

vdisplay = Xvfb()

vdisplay.start()

# 這些設(shè)置都是必要的

chrome_options = Options()

chrome_options.add_argument("--no-sandbox")

chrome_options.add_argument("--disable-setuid-sandbox")

# 這里才是正式的使用了

browser = Browser('chrome', options=chrome_options, executable_path='/root/bin/chromedriver')

browser.visit('https://haofly.net')

print(browser.title)

browser.quit()

vdisplay.stop()


桌面環(huán)境

如果直接在本地有桌面環(huán)境的情況下進(jìn)行測(cè)試那么茬射,直接這樣子:

from splinter import Browser

from selenium.webdriver.chrome.options import Options

chrome_options = Options()

browser = Browser('chrome', executable_path='/Users/haofly/share/chromedriver', user_agent='User-Agent設(shè)置', options=chrome_options)

browser.driver.set_window_size(1500, 900) # 設(shè)置瀏覽器的size

browser.visit('https://wiki.haofly.net')

print(browser.title)


Options選項(xiàng)

通過(guò)chrome_options.add_argument('')可以設(shè)置非常多的瀏覽器的參數(shù)

disable-infobars // 禁用網(wǎng)頁(yè)上部的提示欄鹦蠕,比如2.28的webdriver開(kāi)始會(huì)提示你Chrome正受到自動(dòng)測(cè)試軟件的控制,這個(gè)特性應(yīng)該是chrome為了安全給加的

option.add_argument('--user-data-dir=/path') # 指定個(gè)人資料路徑躲株,指向自己的瀏覽器片部,這樣,chromedriver的配置就能和自己的一樣了

獲取所有網(wǎng)絡(luò)請(qǐng)求

很多時(shí)候訪問(wèn)一個(gè)頁(yè)面霜定,在該頁(yè)面可能會(huì)同時(shí)訪問(wèn)其他的資源档悠,例如js,css望浩,甚至其他一些關(guān)鍵信息辖所。這時(shí)候就要求我們能夠獲取中間的所有的請(qǐng)求,但是selenium是不帶這個(gè)功能的磨德,只能使用一些代理缘回,例如:browsermob-proxy吆视。其不需要安裝,只需要下載bin包酥宴,然后在使用的時(shí)候指定路徑即可啦吧。例如:

from browsermobproxy import Server

server = Server("~/browsermob-proxy-2.1.4/bin/browsermob-proxy")

server.start()

proxy = server.create_proxy()

chrome_options = Options()

chrome_options.add_argument('--proxy-server={host}:{port}'.format(host='localhost', port=proxy.port))

browser = Browser('chrome', executable_path='~/share/chromedriver2.28', options=chrome_options)

browser.driver.set_window_size(1500, 900) # 設(shè)置瀏覽器的size

proxy.new_har()

browser.visit('https://haofly.net')

print(proxy.har) # 以json的形式打印出中間所有的網(wǎng)絡(luò)請(qǐng)求


瀏覽器操作

browser.windows # 所有打開(kāi)了的窗口

browser.windows[0] # 第一個(gè)窗口

browser.windows.current # 當(dāng)前窗口

browser.windows.current = browser.windows[2] # 切換窗口

browser.window[0].close() # 關(guān)閉窗口

browser.window[0].close_others() # 關(guān)閉其他窗口

browser.window[0].is_current # 序號(hào)為零的窗口是否是當(dāng)前的窗口

browser.window[0].next # 下一個(gè)窗口

browser.window[0].prev # 上一個(gè)窗口


頁(yè)面操作

browser.visit(url) # 訪問(wèn)URL

browser.reload() # 重新加載當(dāng)前頁(yè)

browser.back() # 回退

browser.forward() # 向前

browser.find_by_tag('h1').mouse_over() # 鼠標(biāo)移動(dòng)到某個(gè)元素上

browser.find_by_tag('h1').mouse_out() # 鼠標(biāo)移開(kāi)

browser.find_by_tag('h1').click() # 鼠標(biāo)點(diǎn)擊事件

browser.find_ty_tag('h1').double_click()# 鼠標(biāo)雙擊事件

browser.find_by_tag('h1').right_click() # 鼠標(biāo)右鍵點(diǎn)擊

draggable = browser.find_by_tag('h1') # 鼠標(biāo)拖曳事件

target = browser.find_by_css('.container')

draggable.drag_and_drop(target)

# 點(diǎn)擊鏈接

browser.click_link_by_href('http://www.the_site.com/my_link')

browser.click_link_by_partial_href('my_link')

browser.click_link_by_text()

browser.click_link_by_partial_text('part of link text')

browser.click_link_by_id('link_id')

# 點(diǎn)擊按鈕

browser.find_by_name('send').first.click()

browser.find_link_by_text('my link').first.click()

# 表單填寫

browser.fill('query', 'my name')

browser.attach_file('file', '/path/to/file/somefile.jpg')

browser.choose('some-radio', 'radio-value')

browser.check('check-name') # checkbox

browser.choose('name', 'value') # radio

browser.uncheck('some-check')

browser.select('uf', 'rj')

數(shù)據(jù)獲取

browser.title # 獲取網(wǎng)頁(yè)title

browser.html # 獲取網(wǎng)頁(yè)內(nèi)容

browser.url # 獲取網(wǎng)頁(yè)url

browser.find_by_css('h1').first.value # 獲取元素值

browser.is_text_present('', wait_time=None)? # html里面是否存在某個(gè)字符串

# 查找css元素

browser.find_by_css('h1')

browser.find_by_xpath('//h1')

browser.find_by_tag('h1')

browser.find_by_name('name')

browser.find_by_text('Hello World!')[1]

browser.find_by_id('firstheader').last

browser.find_by_value('query').first

# 尋找網(wǎng)頁(yè)鏈接

browser.find_link_by_text()

browser.find_link_by_partial_text()

browser.find_link_by_href()

browser.find_link_by_partial_href()

# 可以連續(xù)用的

browser.find_by_tag('div').first.find_by_name('name')

TroubleShooting

Chrome driver crashes when opens a new tab

原因可能是服務(wù)器內(nèi)存太低了,需要加大虛擬內(nèi)存

selenium.common.exceptions.WebDriverException: Message: session not created exception拙寡,將webdriver更新到最新版基本上能解決問(wèn)題

相關(guān)文章

Getting Started with Headless Chrome

Setting up a Digital Ocean server for Selenium, Chrome, and Python

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末授滓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子肆糕,更是在濱河造成了極大的恐慌般堆,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诚啃,死亡現(xiàn)場(chǎng)離奇詭異淮摔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)始赎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門和橙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人造垛,你說(shuō)我怎么就攤上這事胃碾。” “怎么了筋搏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵仆百,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我奔脐,道長(zhǎng)俄周,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任髓迎,我火速辦了婚禮峦朗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘排龄。我一直安慰自己波势,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布橄维。 她就那樣靜靜地躺著尺铣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪争舞。 梳的紋絲不亂的頭發(fā)上凛忿,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音竞川,去河邊找鬼店溢。 笑死叁熔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的床牧。 我是一名探鬼主播荣回,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼戈咳!你這毒婦竟也來(lái)了驹马?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤除秀,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后算利,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體册踩,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年效拭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了暂吉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缎患,死狀恐怖慕的,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挤渔,我是刑警寧澤肮街,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站判导,受9級(jí)特大地震影響嫉父,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜眼刃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一绕辖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧擂红,春花似錦仪际、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至变秦,卻和暖如春赴恨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伴栓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工伦连, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雨饺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓惑淳,卻偏偏與公主長(zhǎng)得像额港,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子歧焦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 這篇文章在介紹官網(wǎng)的同時(shí)使用了比較多的腳本示例移斩,示例里遇到的問(wèn)題有部分在本篇文章進(jìn)行了解釋,還有一篇文章專門記錄了...
    顧顧314閱讀 12,923評(píng)論 3 32
  • 最近需要在一個(gè)網(wǎng)站下載一批數(shù)據(jù)。但是輸入一個(gè)查詢舰涌,返回三四萬(wàn)條結(jié)果猖任,每次只能導(dǎo)出500條,而且每次還得輸入下載條目...
    我就愛(ài)思考閱讀 26,524評(píng)論 3 25
  • # Selenium # # 自動(dòng)化測(cè)試工具瓷耙,致辭多種瀏覽器 # 爬蟲(chóng)中主要用來(lái)解決JavaScript渲染的問(wèn)題...
    拾柒丶_8257閱讀 389評(píng)論 0 0
  • Selenium 官網(wǎng)Selenium WebDriver官網(wǎng)webdriver實(shí)用指南python版本 WebD...
    顧顧314閱讀 47,000評(píng)論 0 34
  • 開(kāi)了一天的會(huì)
    wuli元芳閱讀 79評(píng)論 0 0