您的位置:軟件測(cè)試 > 開(kāi)源軟件測(cè)試 > 開(kāi)源功能測(cè)試工具 > Selenium
Selenium自動(dòng)化過(guò)程中如何操作Flash動(dòng)畫(huà)
作者:不再有的年月 發(fā)布時(shí)間:[ 2017/4/7 16:06:42 ] 推薦標(biāo)簽:功能測(cè)試 Selenium 自動(dòng)化測(cè)試

  近在看python的爬蟲(chóng)框架(scrapy),一個(gè)詞概括是:"酸爽"!等把selenium自動(dòng)化版塊講完后,打算寫(xiě)一寫(xiě)關(guān)于scrapy相關(guān)的知識(shí),打算從源碼角度解析下scrapy這個(gè)框架。我的想法是它不僅僅是用來(lái)爬網(wǎng)頁(yè)的,更重要的是如何檢測(cè)一個(gè)網(wǎng)站所有頁(yè)面的健康性...回到正題,我想講講這個(gè)話題的起因是同事在自動(dòng)化過(guò)程中遇到了flash的點(diǎn)擊操作,查閱網(wǎng)上的相關(guān)資料也得不到有效解決。我想想談?wù)勥@個(gè)flash的自動(dòng)化操作問(wèn)題!
  隨著頁(yè)面做的越來(lái)越炫酷,flash被越來(lái)越多的嵌入到html網(wǎng)頁(yè)中。但是往往由于對(duì)flash的簡(jiǎn)單操作,卻阻斷了我們整個(gè)自動(dòng)化的測(cè)試過(guò)程!selenium目前的版本是3.0了對(duì)flash操作仍然沒(méi)有提出解決方案。其實(shí)我覺(jué)得,不是selenium不作為,而是它無(wú)能為力!!為什么這么說(shuō)呢?我們知道flash是as語(yǔ)言開(kāi)發(fā)的,我們想在網(wǎng)頁(yè)中操作flash,那么必須通過(guò)js這個(gè)媒介來(lái)操作,問(wèn)題是:開(kāi)發(fā)有沒(méi)有開(kāi)放操作flash的js接口?我們知道js如果要調(diào)用as,那么as源碼中必須使用ExternalInterface.addCallback函數(shù),把a(bǔ)s的接口綁定給js,這樣的話我們可以輕松的調(diào)用js以達(dá)到控制flash的目的...我們搜索selenium對(duì)flash的解決方案:99.99%都是向flex工程注入SeleniumFlexAPI.swc,然后通過(guò)調(diào)用js的接口來(lái)控制flash。
  對(duì)于一些IT基礎(chǔ)比較薄弱的同學(xué)來(lái)說(shuō),始終不知道如何按照網(wǎng)上的步驟來(lái)進(jìn)行下去,這里我對(duì)這個(gè)方案做個(gè)簡(jiǎn)單的解釋如下:
  1.這個(gè)是需要原flash工程的,不是你得到的一個(gè)簡(jiǎn)單的swf文件能重新編譯的。簡(jiǎn)單的說(shuō)是找你們開(kāi)發(fā)吧,讓他把SeleniumFlexAPI.swc加入到被操作Flash(Flex)的工程文件的Build庫(kù)中,重新Build Flash,然后重新發(fā)布到web上。這樣你對(duì)這個(gè)新的flash可能用js進(jìn)行操作了。
  2.SeleniumFlexAPI.swc這個(gè)文件以及好久好久沒(méi)更新了...不知道是否對(duì)現(xiàn)在的flash能否操作有效,所以我在1中用了可能。
  3.我總覺(jué)得這個(gè)方法有點(diǎn)脫褲子放屁的感覺(jué),既然找開(kāi)發(fā)幫你引入SeleniumFlexAPI.swc這個(gè)文件,還不如給你直接開(kāi)放js接口,不是更好?
  吐槽了網(wǎng)上的方法,來(lái)說(shuō)說(shuō)站在一個(gè)測(cè)試者角度的解決方案!
  一、利用AutoIt
  從某種意義上來(lái)說(shuō),我有點(diǎn)對(duì)這個(gè)工具產(chǎn)生依賴(lài)。當(dāng)我在自動(dòng)化過(guò)程中絕望的時(shí)候,我會(huì)第一時(shí)間想到它,而它也往往能帶給我驚喜,像上篇用fiddler錄制接口一樣(其實(shí)還有很多..)!來(lái)說(shuō)說(shuō)我用這個(gè)工具來(lái)操作flash。我所操作的Flash圖片如下:

  這個(gè)Flash是有動(dòng)畫(huà)效果的,經(jīng)過(guò)一段動(dòng)畫(huà)后出現(xiàn)上面圖片的效果。我的任務(wù)是點(diǎn)擊上面圖片中的小鼠標(biāo)。下面貼出來(lái)AutoIt的腳本(終轉(zhuǎn)換成exe程序,在控制臺(tái)中執(zhí)行):
#include <MsgBoxConstants.au3>
Example()
Func Example()
Local $win = WinWait("[CLASS:MozillaWindowClass;Title:Mozilla Firefox]","",10)
WinActivate($win);激活當(dāng)前窗口
$pos =WinGetPos($win)
$high=$pos[3];表示窗口的的實(shí)際高度
$weight=$pos[2];表示窗口的實(shí)際寬度
$click_x=970*$weight/1382;970表示我在當(dāng)前電腦分辨率寬度為1382下的X坐標(biāo)值
$click_y=540*$high/744;744表示我再當(dāng)前電腦分辨率高度為744下的Y坐標(biāo)值
$num=1
While 1
$icolor=PixelGetColor($click_x,$click_y)
If $icolor==6671717 Or $icolor==1321236 Or $num==5 Then
ExitLoop
EndIf
Sleep(2000)
$num=$num+1
WEnd
MouseClick("left",$click_x,$click_y,1)
EndFunc ;
  需要注意的是,由于Firefox中嵌入的flash是非windows標(biāo)準(zhǔn)控件,我們只能用相對(duì)坐標(biāo)來(lái)點(diǎn)擊。關(guān)于以上坐標(biāo)值得獲取,依然用Autoit windows info這個(gè)工具獲取如下:

  而我們當(dāng)前電腦分辨率下,取得的整個(gè)控件的大小信息如下:

  上面腳本很簡(jiǎn)單很簡(jiǎn)單,你應(yīng)該明白我什么意思。還有一點(diǎn)說(shuō)明的是上面標(biāo)紅的部分。我說(shuō)過(guò)了我的flash是個(gè)動(dòng)畫(huà),經(jīng)過(guò)大概5-6后會(huì)出現(xiàn)這個(gè)小鼠標(biāo)。那么我們?cè)赼utoit中如果動(dòng)態(tài)的判斷這個(gè)小鼠標(biāo)出現(xiàn)了呢?當(dāng)然你可以在腳本中Sleep(10000)等待10S鐘。但是我覺(jué)得這樣不太好,我的做法是:在一個(gè)循環(huán)中實(shí)時(shí)的取得我所點(diǎn)擊區(qū)域的顏色值用PixelGetColor這個(gè)函數(shù)取得(返回的是一個(gè)十進(jìn)制的值)。當(dāng)我們等待的這個(gè)控件出現(xiàn)時(shí),即該區(qū)域的顏色值等于某個(gè)值時(shí),跳出這個(gè)循環(huán),然后對(duì)這個(gè)控件用坐標(biāo)進(jìn)行點(diǎn)擊!這個(gè)color的值我在第二張中也圈出了,這是個(gè)16進(jìn)制的值,轉(zhuǎn)換成10進(jìn)制即可!上面的腳本我在2臺(tái)不同的分辨率大小的電腦上測(cè)試過(guò),基本能運(yùn)行成功。〉怯胊utoit操作flash也是有一點(diǎn)的缺點(diǎn)。大的缺點(diǎn)是相對(duì)坐標(biāo)計(jì)算的準(zhǔn)確性!不過(guò)一般我覺(jué)得是沒(méi)問(wèn)題的。
  上面第一種方案是通過(guò)autoit操作flash點(diǎn)擊的,當(dāng)然autoit也可以模擬其他我們?nèi)藶榈牟僮,比如在輸入框中輸入、雙擊某個(gè)按鈕等...注意的是,對(duì)于非標(biāo)準(zhǔn)控件你要盡可能的保證相對(duì)坐標(biāo)計(jì)算的準(zhǔn)確性!
  二、利用Sikuli
  這個(gè)工具也是個(gè)神器,關(guān)于他的介紹我不多說(shuō)了,他的原理大概是:在當(dāng)前可視窗口中,尋找與你截圖相同的區(qū)域,然后操作該區(qū)域的中心點(diǎn)坐標(biāo)。說(shuō)下他的安裝和用法。
  1.安裝
  一般的安裝教程網(wǎng)上有(https://launchpad.net/sikuli/+download這上面有全部的sikuli包信息)我的補(bǔ)充如下:
  第一、新的下載地址為: Sikuli-X-1.0rc3 (r905)-win32.exe 。這個(gè)應(yīng)用只有32位的,在32位系統(tǒng)上安裝運(yùn)行應(yīng)該都沒(méi)有問(wèn)題(需要32位jre6之前的環(huán)境)。
  第二、如果你對(duì)這個(gè)較為熟悉不需要IDE,你可以?xún)H僅下載 Sikuli-X-1.0rc3 (r905)-win32.zip
  第三、如果你非要在64位系統(tǒng)上安裝sikuli的IDE,直接運(yùn)行 Sikuli-X-1.0rc3 (r905)-win32.exe無(wú)視彈出的錯(cuò)誤信息,不過(guò)終要運(yùn)行在32位的jre6環(huán)境下。
  對(duì)于32位系統(tǒng)的要注意jre好是在jre6(包括)之前的,免得可能會(huì)出現(xiàn)閃退的情況。對(duì)于64位系統(tǒng)的要保證其運(yùn)行在32位的jre6下!可能有的同學(xué)不高興了,我這已經(jīng)搭建好了java環(huán)境,難不成要卸載了,重新裝個(gè)32位的開(kāi)發(fā)環(huán)境?答案是否定的。我們系統(tǒng)上可以運(yùn)行多個(gè)版本的java環(huán)境。我們要做的只是保證其運(yùn)行環(huán)境是32位的jre6可以了。為了避免你在oracel官網(wǎng)上對(duì)jre6進(jìn)行尋找,我直接給出連接:http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html#jre-6u35-oth-JPR這個(gè)是jre6第35次編譯的,注意的是:你僅僅需要下載運(yùn)行環(huán)境,不需要下載開(kāi)發(fā)環(huán)境。也不需要重新配置環(huán)境變量之類(lèi)的操作,你需要的僅僅是更改安裝目錄下的Sikuli-IDE-w.bat這個(gè)dos腳本,將其中JAVA_EXE指向你新安裝的32位jre6的安裝目錄。
  說(shuō)了這么多你應(yīng)該明白了環(huán)境搭建方面的問(wèn)題,當(dāng)然如果有任何問(wèn)題,你可以留言!下面說(shuō)說(shuō)這個(gè)腳本的編寫(xiě),首先我們說(shuō)說(shuō)java環(huán)境下如何用這個(gè)腳本來(lái)操作flash;再看看如何在python中如何利用sikuli操作flash。在java中你需要干三件事:
  1.將sikuli安裝目錄下的libs文件夾放在系統(tǒng)的環(huán)境變量中。
  2.將eclipse的運(yùn)行環(huán)境設(shè)置為32位jre。(不一定jre6只要32位jre行。上文sikuli IDE需要jre6的原因是這個(gè)IDE應(yīng)該是在jdk6下開(kāi)發(fā)的,而我們這里只是在eclipse運(yùn)行sikuli-script.jar包中的相關(guān)方法)。
  3.引入sikuli-script.jar包
  簡(jiǎn)單的java測(cè)試代碼如下:
/**
*
*/
/**
* @author PF-211X3
*
*/
package com;
import org.sikuli.script.*;
public class STest {
public static void main(String[] args) throws FindFailed, InterruptedException {
Screen s = new Screen();
String imgpath = "D:/img/";
s.wait(imgpath+"firfox.png", 5);
s.doubleClick(imgpath+"firfox.png");
System.out.println("end");
}
}
  這個(gè)firfox.png是我們用任何截圖工具截取桌面上firefox快捷圖標(biāo)的照片。上面的操作可以點(diǎn)擊桌面上的firefox快捷圖標(biāo)打開(kāi)火狐瀏覽器了。是不是很神奇!!所以我上文說(shuō)了其實(shí)不需要安裝sikuli的IDE。只需要sikuli-script.jar包與libs文件下的內(nèi)容即可,相關(guān)的函數(shù)的用法你完全可以猜出來(lái)不行看看文檔介紹!當(dāng)然你想安裝個(gè)IDE玩玩也是可以的~~
  對(duì)于1沒(méi)問(wèn)題吧,添加環(huán)境變量大家都會(huì)。對(duì)于只會(huì)python完全沒(méi)有接觸過(guò)java的同事我給出2,3的步驟,java同學(xué)跳過(guò)。ㄎ业膒c是64位的,且我也已經(jīng)下載好了32位的jre6的環(huán)境。)
  如何將eclipse以32位的jre6運(yùn)行該工程?
  一、打開(kāi)eclipse菜單window-》preferences彈出框,在左邊的樹(shù)形圖找到j(luò)ava選項(xiàng)點(diǎn)開(kāi)后選擇Installed JRES在右邊的選擇框中選擇Add添加我們32位jre我的截圖如下:

  上圖大箭頭部分是我們新安裝的32位jre路徑,我們選擇改jre并點(diǎn)擊Apply。

上一頁(yè)12下一頁(yè)
軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd