python操作网页flash视频_selenium自动化过程中如何操作Flash动画
最近在看python的爬蟲框架(scrapy),一個詞概括就是:"酸爽"!等把selenium自動化版塊講完后,打算寫一寫關于scrapy相關的知識,打算從源碼角度解析下scrapy這個框架。我的想法是它不僅僅是用來爬網(wǎng)頁的,更重要的是如何檢測一個網(wǎng)站所有頁面的健康性...回到正題,我想講講這個話題的起因是同事在自動化過程中遇到了flash的點擊操作,查閱網(wǎng)上的相關資料也得不到有效解決。今天我想想談談這個flash的自動化操作問題!!
隨著頁面做的越來越炫酷,flash被越來越多的嵌入到html網(wǎng)頁中。但是往往由于對flash的簡單操作,卻阻斷了我們整個自動化的測試過程!selenium目前的版本是3.0了對flash操作仍然沒有提出解決方案。其實我覺得,不是selenium不作為,而是它無能為力!!為什么這么說呢?我們知道flash是as語言開發(fā)的,我們想在網(wǎng)頁中操作flash,那么就必須通過js這個媒介來操作,問題是:開發(fā)有沒有開放操作flash的js接口?我們知道js如果要調(diào)用as,那么as源碼中必須使用ExternalInterface.addCallback函數(shù),把as的接口綁定給js,這樣的話我們可以輕松的調(diào)用js以達到控制flash的目的...我們搜索selenium對flash的解決方案:99.99%都是向flex工程注入SeleniumFlexAPI.swc,然后通過調(diào)用js的接口來控制flash。
對于一些IT基礎比較薄弱的同學來說,始終不知道如何按照網(wǎng)上的步驟來進行下去,這里我對這個方案做個簡單的解釋如下:
1.這個是需要原flash工程的,不是你得到的一個簡單的swf文件就能重新編譯的。簡單的說就是找你們開發(fā)吧,讓他把SeleniumFlexAPI.swc加入到被操作Flash(Flex)的工程文件的Build庫中,重新Build Flash,然后重新發(fā)布到web上。這樣你對這個新的flash可能用js進行操作了。
2.SeleniumFlexAPI.swc這個文件以及好久好久沒更新了...不知道是否對現(xiàn)在的flash能否操作有效,所以我在1中用了可能。
3.我總覺得這個方法有點脫褲子放屁的感覺,既然找開發(fā)幫你引入SeleniumFlexAPI.swc這個文件,還不如給你直接開放js接口,不是更好?
吐槽了網(wǎng)上的方法,來說說站在一個測試者角度的解決方案!
一、利用AutoIt
從某種意義上來說,我有點對這個工具產(chǎn)生依賴。當我在自動化過程中絕望的時候,我就會第一時間想到它,而它也往往能帶給我驚喜,就像上篇用fiddler錄制接口一樣(其實還有很多..)!來說說我用這個工具來操作flash。我所操作的Flash圖片如下:
這個Flash是有動畫效果的,經(jīng)過一段動畫后出現(xiàn)上面圖片的效果。我的任務就是點擊上面圖片中的小鼠標。下面貼出來AutoIt的腳本(最終轉(zhuǎn)換成exe程序,在控制臺中執(zhí)行):
#include Example()
Func Example()
Local $win= WinWait("[CLASS:MozillaWindowClass;Title:Mozilla Firefox]","",10)
WinActivate($win);激活當前窗口
$pos=WinGetPos($win)
$high=$pos[3];表示窗口的的實際高度
$weight=$pos[2];表示窗口的實際寬度
$click_x=970*$weight/1382;970表示我在當前電腦分辨率寬度為1382下的X坐標值$click_y=540*$high/744;744表示我再當前電腦分辨率高度為744下的Y坐標值$num=1While 1
$icolor=PixelGetColor($click_x,$click_y)
If $icolor==6671717 Or $icolor==1321236 Or $num==5 Then
ExitLoop
EndIf
Sleep(2000)
$num=$num+1WEnd
MouseClick("left",$click_x,$click_y,1)
EndFunc ;
需要注意的是,由于Firefox中嵌入的flash是非windows標準控件,我們只能用相對坐標來點擊。關于以上坐標值得獲取,依然用Autoit windows info這個工具獲取如下:
而我們當前電腦分辨率下,取得的整個控件的大小信息如下:
上面腳本很簡單很簡單,你應該明白我什么意思。還有一點說明的就是上面標紅的部分。我說過了我的flash是個動畫,經(jīng)過大概5-6后會出現(xiàn)這個小鼠標。那么我們在autoit中如果動態(tài)的判斷這個小鼠標出現(xiàn)了呢?當然你可以在腳本中Sleep(10000)等待10S鐘。但是我覺得這樣不太好,我的做法是:在一個循環(huán)中實時的取得我所點擊區(qū)域的顏色值用PixelGetColor這個函數(shù)取得(返回的是一個十進制的值)。當我們等待的這個控件出現(xiàn)時,即該區(qū)域的顏色值等于某個值時,跳出這個循環(huán),然后對這個控件用坐標進行點擊!這個color的值我在第二張中也圈出了,這是個16進制的值,轉(zhuǎn)換成10進制即可!上面的腳本我在2臺不同的分辨率大小的電腦上測試過,基本能運行成功!!但是用autoit操作flash也是有一點的缺點。最大的缺點就是相對坐標計算的準確性!不過一般我覺得是沒問題的。
上面第一種方案是通過autoit操作flash點擊的,當然autoit也可以模擬其他我們?nèi)藶榈牟僮?#xff0c;比如在輸入框中輸入、雙擊某個按鈕等...注意的是,對于非標準控件你要盡可能的保證相對坐標計算的準確性!
二、利用Sikuli
這個工具也是個神器,關于他的介紹我不多說了,他的原理大概就是:在當前可視窗口中,尋找與你截圖相同的區(qū)域,然后操作該區(qū)域的中心點坐標。說下他的安裝和用法。
1.安裝
一般的安裝教程網(wǎng)上有(https://launchpad.net/sikuli/+download這上面有全部的sikuli包信息)我的補充如下:
第一、最新的下載地址為:這個應用只有32位的,在32位系統(tǒng)上安裝運行應該都沒有問題(需要32位jre6之前的環(huán)境)。
第三、如果你非要在64位系統(tǒng)上安裝sikuli的IDE,直接運行
對于32位系統(tǒng)的要注意jre最好是在jre6(包括)之前的,免得可能會出現(xiàn)閃退的情況。對于64位系統(tǒng)的要保證其運行在32位的jre6下!可能有的同學不高興了,我這已經(jīng)搭建好了java環(huán)境,難不成要卸載了,重新裝個32位的開發(fā)環(huán)境?答案是否定的。我們系統(tǒng)上可以運行多個版本的java環(huán)境。我們要做的只是保證其運行環(huán)境是32位的jre6就可以了。為了避免你在oracel官網(wǎng)上對jre6進行尋找,我直接給出連接:http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html#jre-6u35-oth-JPR這個是jre6第35次編譯的,注意的是:你僅僅需要下載運行環(huán)境,不需要下載開發(fā)環(huán)境。也不需要重新配置環(huán)境變量之類的操作,你需要的僅僅是更改安裝目錄下的Sikuli-IDE-w.bat這個dos腳本,將其中JAVA_EXE指向你新安裝的32位jre6的安裝目錄。
說了這么多你應該明白了環(huán)境搭建方面的問題,當然如果有任何問題,你可以留言!下面說說這個腳本的編寫,首先我們說說java環(huán)境下如何用這個腳本來操作flash;再看看如何在python中如何利用sikuli操作flash。在java中你需要干三件事:
1.將sikuli安裝目錄下的libs文件夾放在系統(tǒng)的環(huán)境變量中。
2.將eclipse的運行環(huán)境設置為32位jre。(不一定jre6只要32位jre就行。上文sikuli IDE需要jre6的原因是這個IDE應該是在jdk6下開發(fā)的,而我們這里只是在eclipse運行sikuli-script.jar包中的相關方法)。
3.引入sikuli-script.jar包
簡單的java測試代碼如下:
/****/
/***@authorPF-211X3
**/
packagecom;import org.sikuli.script.*;public classSTest {public static void main(String[] args) throwsFindFailed, InterruptedException {
Screen s= newScreen();
String imgpath= "D:/img/";
s.wait(imgpath+"firfox.png", 5);
s.doubleClick(imgpath+"firfox.png");
System.out.println("end");
}
}
這個firfox.png就是我們用任何截圖工具截取桌面上firefox快捷圖標的照片。上面的操作就可以點擊桌面上的firefox快捷圖標打開火狐瀏覽器了。是不是很神奇!!所以我上文說了其實不需要安裝sikuli的IDE。只需要sikuli-script.jar包與libs文件下的內(nèi)容即可,相關的函數(shù)的用法你完全可以猜出來不行看看文檔介紹!當然你想安裝個IDE玩玩也是可以的~~
對于1沒問題吧,添加環(huán)境變量大家都會。對于只會python完全沒有接觸過java的同事我給出2,3的步驟,java同學跳過!(我的pc是64位的,且我也已經(jīng)下載好了32位的jre6的環(huán)境。)
如何將eclipse以32位的jre6運行該工程?
一、打開eclipse菜單window-》preferences彈出框,在左邊的樹形圖找到java選項點開后選擇Installed JRES在右邊的選擇框中選擇Add添加我們32位jre我的截圖如下:
上圖大箭頭部分是我們新安裝的32位jre路徑,我們選擇改jre并點擊Apply。
二、右鍵點擊工程選擇Build Path下的子菜單項Add Libraies...添加我們選擇的jre
選擇我們JRE System library-next->Workspace default JRE(jire6)點擊Finish。
3.考慮運行的兼容性(不同版本的jdk與jre配合需要此配置,相同版本的不需要),右擊該工程選擇菜單項Project->Properties。在彈出框中做一下配置:
如何添加外部包?
選中該工程右鍵點擊該工程選擇Build Path->Add? External Archives...后導入本地目錄下的sikuli-script.jar即可
上面我們從sikuli角度來操作flash。總結下這種解決方案遇到的坑和注意點。
1.32系統(tǒng)上sikuli的環(huán)境搭建是問題不大的,除了sikuli ide的運行環(huán)境需要配置成jre6。64位系統(tǒng)上有點坑。上文中我也較詳細的說明了ide的配置以及如何在eclipse中運行sikuli腳本,我相信你肯定能運行起來。
2.注意點:sikuli對我們截圖的匹配查找是在我們當前可視范圍內(nèi)的。這句話怎么理解呢?比如上文中我在桌面上截了一個firefox快捷圖標的圖片,當運行到點擊這個快捷圖標時,突然彈出了一段小廣告擋住了這個快捷圖標,那么我們的sikuli是找不到該圖片的。我的解決辦法是在運行sikuli腳本之前,最好先運行下AutoIt的一個小腳本,就是上文中我們頻繁使用到的WinActivate($hWnd)函數(shù),可以確保某個窗口控件是可視的。
說到這來java部分也就這樣了,但是本篇還沒有結束,因為我們還沒有講python中如何使用sikuli-script.jar這個包!
sikuli-script.jar是java下的包,python使用java的包最先想到的就是jpython。但是就為了操作個flash把python解析器設置為jpython我認為沒人能接受。那么有一種神器可以連接python與java還能保證你的運行環(huán)境是cpython的,那這個包就是jpype。
對于32位系統(tǒng),安裝這個是最簡單的你可以下載jpype.exe程序直接安裝。jpype.exe暫時是沒有64位,我們選擇安裝包安裝。路徑為:https://pypi.python.org/pypi/JPype1。我們下載后運行python setup.py install。發(fā)現(xiàn)可能是有問題的,原因是在windows平臺上無法安裝python c extension的擴展包,我們下載專用的編譯器Microsoft Visual C++ Compiler for Python 2.7就好了下載地址:https://www.microsoft.com/en-us/download/details.aspx?id=44266。
對于jpype的使用也是非常簡單的,對于32位系統(tǒng)操作sikuli-script.jar這個包太簡單就幾行代碼:
#coding=utf-8
import jpype
jvmPath = jpype.getDefaultJVMPath()
jpype.startJVM(jvmPath,"-ea",r"-Djava.class.path=D:\\tutorial\\tutorial\spiders\sikuli-script.jar")#jvmPath為jvm.dll的路徑可以人為指定并指定外部包的加載路徑
JDClass =jpype.JClass("org.sikuli.script.Screen")
s=JDClass()
imgpath = "D:/img/"
s.wait(imgpath + "firfox.png", 5)
s.doubleClick(imgpath + "firfox.png");
jpype.shutdownJVM()
這段代碼與我們上文的java代碼意義是一樣。為什么說對于32位是沒有問題的,難道64位python解析器無法這樣用嗎?
首先,并不是說64位解析器無法通過jpype來啟動一個虛擬機,但是問題是我們只能啟動一個64位的jvm。但是我們上文說了sikuli-script.jar這個包無法在64位的jre中運行的,我們嘗試通過手動給出32位jre下面jvm.dll的路徑來啟用JVM進而運行sikuli-script.jar這個包。我的嘗試代碼:
#coding=utf-8
import jpype
jpype.startJVM(r"C:\Program Files (x86)\Java\jre6\bin\client\jvm.dll","-ea",r"-Djava.class.path=D:\\tutorial\\tutorial\spiders\sikuli-script.jar")#jvmPath為32位jre的jvm.dll路徑
JDClass =jpype.JClass("org.sikuli.script.Screen")
s=JDClass()
imgpath = "D:/img/"
s.wait(imgpath + "firfox.png", 5)
s.doubleClick(imgpath + "firfox.png");
jpype.shutdownJVM()
發(fā)現(xiàn)是無法啟動jvm的,原因可能很簡單我們在64位的python解析器上運行32位jvm.dll多少有點問題。那么我們在64位上如何使用sikuli呢?沒辦法我能想到的就只有曲線救國了...對的,就是用python調(diào)用控制臺來運eclipse里的工程。我的做法如下:
1.導出該工程為jar包。
步驟:選擇該工程選擇菜單的File->Export,選擇JAR File,然后一路向西導出到某個路徑下,我直接放桌面了。
2.修改改jar包中的MANIFEST.MF文件。
步驟一、修改改jar包后綴名為zip。比如將abc.jar變成abc.zip
步驟二、修改里面的META-INF中的MANIFEST.MF文件,添加Main-Class: com.STest
步驟三、保存后修改abc.zip為abc.jar
3.修改完jar包后我們直接編寫運行這個jar的dos腳本如下:
cmd命令:"C:\Program Files (x86)\Java\jre6\\bin\java" -Djava.ext.dirs=C:\lib -jar C:\Users\PF-211X3\Desktop\\abc.jar
這個簡單的說明吧!
一、C:\Program Files (x86)\Java\jre6\\bin\java是我們32位jre的路徑下java命令
二、-Djava.ext.dirs命令參數(shù)如同jpype中的參數(shù)-Djava.class.path一樣為我們外部引用包,我這里是把sikuli-script.jar這個包放在C盤的lib下的
三、-jar參數(shù)后面跟的是我們剛修改過的jar包
以上只是個例子,具體路徑配置按自己個人情況界定。
我們發(fā)現(xiàn)在個在cmd中是能正常運行的,那么我們?nèi)绾卧趐ython中運行這個我相信,不需要我多說了吧
import os
cmd="\"C:\Program Files (x86)\Java\jre6\\bin\java\" -Djava.ext.dirs=C:\lib -jar C:\Users\PF-211X3\Desktop\\abc.jar"
os.popen(cmd)
好吧,我們總算通過曲線救國的方式使得python在64系統(tǒng)上用sikuli操作flash。在32位上還是用jpype吧!
最后我們做個簡單的總結吧:
我們上面使用Autoit與sikuli方法操作flash,2種方法各有特色吧!當然可能還有其他更好更方便的方法操作flash,希望知道的大神們能寫出來~~
總結
以上是生活随笔為你收集整理的python操作网页flash视频_selenium自动化过程中如何操作Flash动画的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分页虚拟存储管理——页面置换算法例题
- 下一篇: python跳一跳编程构造_Python