Maven專案
前兩篇文章我們完成了 eclipse maven 插件的配置,今天我們來講解Maven專案的配置開發一個簡單的腳本,
maven專案的配置開發一個簡單的腳本
大家可以在文末找到輔導員要安裝包,只要裝了github就可以匯入享受新的服務,

匯入的maven專案如上圖appiumtraining專案,我們打開pom.xml檔案,
上面這段以后在代碼中有中文情況下可以在jenkins job運作下正常顯示中文,
appium需要的jar如下是io.appium,這個是我們需要的,它同時也會去下載selenium對應版本的,如果要最新的可以在version中用LATEST;

你在本地倉庫中也會看到目前最新的版本是什么,如果下載不了的話可以聯系輔導員,
然后解壓替換到自己的本地maven路徑,如圖:
自此以上環境都配置完畢,不過鑒于現在流行的模擬器,這里也可以試用真機,本文中是使用Genymotion,
接下來我們用一個計算器開始我們的自動化之旅
打開我們的appium server然后鎖定package和activity名,
注意android自動化要了解被測物件的package和activity名,但不知道package和activity怎么辦?
安裝apk后打開,用%android_home%/tools下的hierachyviewer.bat來查看,


然后重要的一點是怎么樣抓到元素呢?
我們可以使用%ANDROID_HOME%/tools/UIAutomator Viewer來抓取
腳本中需要設定很多capabilities;
在這里推薦一個軟體測驗交流群,QQ:624830685,群中會不定期的分享軟體測驗資源和測驗面試題以及行業資訊,大家可以在群中積極交流技術,另外還有技術大佬為你解答疑問,
起因
Selenium本身是不支持HTTP請求抓取的,因為其團隊認為這個不是selenium要解決的問題(確實也是),所以推薦使用一個相關聯的專案 – BrowserMobProxy,
具體專案首頁見相關GitHub,
嘗試
因為專案需要,所以就研究了下BrowserMobProxy,它其實是一個java實作的開源代理專案,它與普通的代理不同之處在于:
它支持REST API介面(可以通過http請求來動態創建代理服務)
默認啟動的是一個代理Manager,它會管理N多個代理服務(我們真正使用的就是這個代理服務)
可以支持動態的代理配置
一張圖看懂BrowserMobProxy的業務邏輯,
即在使用代理之前,需要先啟動代理Manager;而這個Manager提供了REST API介面,支持動態創建代理服務,(它會維護一批申請過的代理服務)之后我們使用的其實都是新申請的代理服務,(所以它并不是一個代理實體,而是一個代理管理服務)
在這里向大家推薦一個學習資料群:175317069
使用
要使用BrowserMobProxy首先你需要啟動它的代理Manager,有3種方式:
直接通過bin目錄下的腳本檔案啟動(如:browsermob-proxy.bat)
在程式中動態執行腳本檔案
JAVA專案可以匯入到專案中通過SDK啟動
BrowserMobProxy的代理Manager啟動后,就可以向它申請具體的代理服務了,主要有2種方式:
REST API方式
JAVA的SDK方式
由于這里是講Python相關的,所以后面只講REST API方式,啟動代理Manager和申請代理服務的代碼如下:
BROWSERMOBPROXY = r"D:\browsermob-proxy-2.1.1\bin\browsermob-proxy.bat"
server = browsermobproxy.Server(BROWSERMOBPROXY, {'port': 8080}) # 初始化一個代理Manager服務,并監聽8080埠
server.start() # 啟動代理Manager服務
proxy = server.create_proxy() # 向代理Manager服務申請一個代理服務,會使用默認埠8081
print(proxy.port)
- 1
- 2
- 3
- 4
- 5
上述代碼是在程式中執行了BrowserMobProxy的啟動腳本,然后申請了一個代理服務,當然,你還可以先手動啟動BrowserMobProxy,接著在程式中就可以直接申請代理服務即可,(也可以是遠程服務器上的地址)
proxy = browsermobproxy.Client('http://localhost:8080') # 向已有代理Manager服務申請一個代理服務
DEMO
- 1
- 2
光有上面的代碼還不夠,我們需要和Selenium代理整合之后,才能知道是否可以滿足我們的需求,在具體執行代碼之前你需要安裝2個前提庫:
pip install selenium
pip install browsermob
- 1
- 2
然后就可以執行如下代碼了,
def set_proxy_for_ff():
profile = webdriver.FirefoxProfile()
driver = webdriver.Firefox(firefox_profile=profile, proxy=proxy.selenium_proxy()) # 配置selenium使用指定的代理服務
proxy.new_har("test", options={'captureContent': True, 'captureHeaders': True}) # 開啟代理監控,如果不監控會拿不到請求內容
driver.get("http://www.baidu.cn") # 訪問頁面
# TODO:其它頁面操作
proxy.wait_for_traffic_to_stop(1000, 6000) # 停止代理監控
print(proxy.har) # 列印請求日志資訊
def set_proxy_for_chrome():
dc = webdriver.DesiredCapabilities
proxy.add_to_capabilities(dc)
driver = webdriver.Chrome(desired_capabilities=dc) # 配置selenium使用指定的代理服務
proxy.new_har("test", options={'captureContent': True, 'captureHeaders': True}) # 開啟代理監控,如果不監控會拿不到請求內容
driver.get("http://www.baidu.cn") # 訪問頁面
# TODO:其它頁面操作
proxy.wait_for_traffic_to_stop(1000, 6000) # 停止代理監控
print(proxy.har) # 列印請求日志資訊
def set_proxy_for_phantomjs():
dc = webdriver.DesiredCapabilities
proxy.add_to_capabilities(dc)
driver = webdriver.PhantomJS(desired_capabilities=dc) # 配置selenium使用指定的代理服務
proxy.new_har("test", options={'captureContent': True, 'captureHeaders': True}) # 開啟代理監控,如果不監控會拿不到請求內容
driver.get("http://www.baidu.cn") # 訪問頁面
# TODO:其它頁面操作
proxy.wait_for_traffic_to_stop(1000, 6000) # 停止代理監控
print(proxy.har)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
如果一切正常的話,這3個函式都是可以執行的,前提是對應的Webdriver和瀏覽器得先配置好了,如果你是在遠程服務器上啟動的代理Manager,記得關掉防火墻,
填坑
這個是針對Python用戶的,如果你是java用戶則沒有這樣的苦惱,因為這些功能jar包的SDK中都已經支持了,
啟動代理Manager時指定引數
由于支持BrowserMobProxy的Python庫只有一個在pypi上,而該庫雖然可以支持基本的使用,但是如果你希望配置更多的引數,則需要自己動手來解決,因為在Python的browsermobproxy庫中啟動代理Manager時未提供指定啟動引數的選項,所以如果你需要在程式里啟動代理Manager時帶上引數,則有3種方式可以實作:
在啟動腳本中添加固定引數
修改Python庫支持指定引數
提供一個帶引數的命令
接著,就來逐一看下如何去實作,如果是第一種則需修改對應的啟動腳本(linux或windows),并設定固定的引數,
@REM -- Regular WinNT shell
set CMD_LINE_ARGS=%* -proxyPortRange 9000-9999 -ttl 600
goto WinNTGetScriptDir
上面是windows啟動腳本browsermob-proxy.bat的修改之處,在第二行內容后追加了 -proxyPortRange 9000-9999 -ttl 600引數,如果是linux系統,則修改browsermob-proxy檔案,具體修改的內容如下:
exec "$JAVACMD" $JAVA_OPTS \
$EXTRA_JVM_ARGUMENTS \
-classpath "$CLASSPATH" \
-Dapp.name="browsermob-proxy" \
-Dapp.pid="$$" \
-Dapp.repo="$REPO" \
-Dbasedir="$BASEDIR" \
net.lightbody.bmp.proxy.Main \
"$@" -proxyPortRange 9000-9999 -ttl 600
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
同樣是在最后一行追加了指定的引數內容,如果選擇第二種方式則需要修改Python的browsermobproxy庫(這里不建議),因為第三種方式可以更好的解決這個問題,即把啟動字串修改為一個串列即可,
# 原來的啟動腳本路徑
BROWSERMOBPROXY = r"D:\browsermob-proxy-2.1.1\bin\browsermob-proxy.bat"
# 修改為如下
BROWSERMOBPROXY = [r"D:\browsermob-proxy-2.1.1\bin\browsermob-proxy.bat", '-proxyPortRange 9000-9999', '-ttl 600']
- 1
- 2
- 3
- 4
- 5
申請代理服務時指定引數
可以指定代理Manager的啟動引數后,還需要可以指定代理的啟動引數,比如:忽略HTTPS的認證錯誤,而這里就真的需要修改Python庫了,具體的代碼修改如下:
# browsermobproxy\client.py 第32行
resp = requests.post('%s/proxy%s' % self.host, urlparams)
# 修改為
resp = requests.post('%s/proxy' % self.host, data=https://www.cnblogs.com/zhaoyingying123456/p/params)
- 1
- 2
- 3
- 4
這個可能是作者開發的失誤,因為POST正常是不支持URL引數接收,作者可能是希望能列印出來,所以拼接成url串,只是在POST時忘記轉回了,
完整代碼
from selenium import webdriver
import browsermobproxy
Required:
pip install selenium
pip install browsermob
BROWSERMOBPROXY = r"D:\browsermob-proxy-2.1.1\bin\browsermob-proxy.bat"
server = browsermobproxy.Server(BROWSERMOBPROXY, {‘port’: 8080}) # 初始化一個代理Manager服務,并監聽8080埠
server.start() # 啟動代理Manager服務
proxy = server.create_proxy() # 向代理Manager服務申請一個代理服務,會使用默認埠8081
print(proxy.port)
#proxy = browsermobproxy.Client(‘http://localhost:8080’) # 向已有代理Manager服務申請一個代理服務
def set_proxy_for_ff():
profile = webdriver.FirefoxProfile()
driver = webdriver.Firefox(firefox_profile=profile, proxy=proxy.selenium_proxy()) # 配置selenium使用指定的代理服務
proxy.new_har(“test”, options={‘captureContent’: True, ‘captureHeaders’: True}) # 開啟代理監控,如果不監控會拿不到請求內容
driver.get(“http://www.baidu.cn”) # 訪問頁面
# TODO:其它頁面操作
proxy.wait_for_traffic_to_stop(1000, 6000) # 停止代理監控
print(proxy.har) # 列印請求日志資訊
def set_proxy_for_chrome():
dc = webdriver.DesiredCapabilities
proxy.add_to_capabilities(dc)
driver = webdriver.Chrome(desired_capabilities=dc) # 配置selenium使用指定的代理服務
proxy.new_har(“test”, options={‘captureContent’: True, ‘captureHeaders’: True}) # 開啟代理監控,如果不監控會拿不到請求內容
driver.get(“http://www.baidu.cn”) # 訪問頁面
# TODO:其它頁面操作
proxy.wait_for_traffic_to_stop(1000, 6000) # 停止代理監控
print(proxy.har) # 列印請求日志資訊
def set_proxy_for_phantomjs():
dc = webdriver.DesiredCapabilities
proxy.add_to_capabilities(dc)
driver = webdriver.PhantomJS(desired_capabilities=dc) # 配置selenium使用指定的代理服務
proxy.new_har(“test”, options={‘captureContent’: True, ‘captureHeaders’: True}) # 開啟代理監控,如果不監控會拿不到請求內容
driver.get(“http://www.baidu.cn”) # 訪問頁面
# TODO:其它頁面操作
proxy.wait_for_traffic_to_stop(1000, 6000) # 停止代理監控
print(proxy.har) # 列印請求日志資訊
if ‘main’ == name:
set_proxy_for_ff()
set_proxy_for_chrome()
set_proxy_for_phantomjs()
在這里推薦一個我自己創建的軟體測驗交流群 ,QQ:642830685,群中會不定期的分享軟體測驗資源,測驗面試題以及行業資訊,大家可以在群中積極交流技術,風里雨里我在群中等你,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/252496.html
標籤:其他
下一篇:資料庫詳解
