擇一個目前比較好的Web應(yīng)用驗收測試工具,有一定了解的人都會想到OpenQA Selenium,它能按照你設(shè)置的步驟逐步執(zhí)行所有按鍵操作并給出執(zhí)行結(jié)果,最終達到測試的目的。
將Selenium這樣的Web測試框架引入到你的Web項目里,可以使你的Web功能實現(xiàn)可重復(fù)級測試。 在引入過程中,你不必擔(dān)心編程語言或瀏覽器問題,因為Selenium RC支持Java、C#、Ruby等語言和IE、Firefox、Mozilla Suite等瀏覽器,同時還提供了一個Firefox插件Selenium IDE,它不僅能幫你記錄你在頁面上的操作步驟,還能執(zhí)行你錄制的步驟并顯示執(zhí)行結(jié)果了,它也可以生成相應(yīng)語言的測試代碼,供你在持續(xù)集成里執(zhí)行。
內(nèi),Selenium也確實火了一段時間,首先是徐昊的一篇文章,引起的大家廣泛關(guān)注;然后江南白衣也加入其中,并在SpringSide2。0已經(jīng)全面應(yīng)用Selenium(在example里有幾個簡單的功能測試);接下來就是Tin組織并推動的Selenium中文化項目;大半年過去了,Selenium中文化從最開始的強勢出擊到現(xiàn)在的停滯不前,其間遇到的波折和問題,我是不太了解的,不過我還是從中學(xué)到了很多東西,也開始嘗試在項目中使用Selenium進行功能測試。
在使用Selenium過程中,越發(fā)發(fā)現(xiàn)它并不像大家吹噓的那么強大,問題和局限性都比較多,并結(jié)合自身的實際情況,最終放棄使用Selenium。下面是本人總結(jié)出來的一些問題點,希望能作為大家選擇和使用Selenium時的參考。
Selenium適合比較專業(yè)的團隊使用 Selenium所提供的命令非常強大(這是緣于它有強大的XPath表達式),要讓開發(fā)人員、測試人員和用戶理解和應(yīng)用這些常用的命令也不是易事,雖然Selenium提供了支持Firefox的IDE,但目前國內(nèi)公司的內(nèi)部使用的主流瀏覽器還是IE,外加部分遺留系統(tǒng)的JS存在問題(不支持Firefox),這使得推廣和應(yīng)用時存在阻力。 Selenium不支持動態(tài)鏈接按鈕處理 這個問題十分煩人,導(dǎo)致很多地方的測試都不連貫,也無法驗證一些操作是否正確,也就無法談及自動化了;也可能是我沒有掌握到Selenium處理動態(tài)鏈接按鈕的方法。
Selenium對特別復(fù)雜的頁面支持不好 如果用Selenium來測試類似登錄或注冊這樣簡單的頁面時,它的確是我們的一個很好的幫手,能幫助我們處理得很好,而在處理復(fù)雜的企業(yè)應(yīng)用系統(tǒng)頁面時,它卻顯示是那樣的弱不禁風(fēng)和脆弱;同時在處理包含有大量組件需要測試的頁面時,也是相當(dāng)恐怖的,如果要測試10組件的相符作用關(guān)系的話,排列組合出來也是一個不小的數(shù)字,雖不復(fù)雜,但很麻煩 Selenium社區(qū)不活躍 最后,Selenium的社區(qū)不夠活躍,也是我們放棄使用Selenium的原因之一。 即使Selenium Core和RC最近才發(fā)布了新版本,我也不得不說這個社區(qū)不怎么樣,得不到很好的支持和幫助。
新版本也沒有來帶特別有效和值得一提的功能。 Selenium還需要時間來不斷成長和完善,想依靠Selenium這樣的工具來實現(xiàn)系統(tǒng)驗收的自動化更是需要時間。
當(dāng)這一天真的到來之時,我們的部分同行可能會因使用上自動驗收工具而減輕工作負擔(dān),而另外部分同行可能會面臨失業(yè)危機,因為他們所做的工作將會被計算機所替代。
很奇怪你為什么要問這個問題,你用selenium的話,你肯定預(yù)先知道用的是什么瀏覽器,因為不同的瀏覽器,調(diào)用的方法都不一樣
#coding=utf-8
'''
Created on 2014-11-10
@author: Neo
'''
from selenium import webdriver
import os
def openBrowser():
chromedriver = "C:\Users\Sigma\AppData\Local\Google\Chrome\Application\chromedriver.exe"
if not os.path.exists(chromedriver):
chromedriver = 'C:\Program Files\Google\Chrome\Application\chromedriver.exe'
os.environ["webdriver.chrome.driver"] = chromedriver
browser1 = webdriver.Chrome(chromedriver)
browser2 = webdriver.Firefox()
return browser1, browser2
def closeBrowser(browser):
browser.close()
cmd = 'taskkill /F /IM chromedriver.exe'
os.system(cmd)
b1, b2 = openBrowser()
print b1, b2
closeBrowser(b1)
b2.close()如上面的,chrome和Firefox 完全不一樣的
當(dāng)然結(jié)果print出來也能看得出用的是 什么瀏覽器
<selenium.webdriver.chrome.webdriver.WebDriver object at 0x028536F0> <selenium.webdriver.firefox.webdriver.WebDriver object at 0x02853750>
1. selenium中如果去尋找元素,而元素不存在的話,通常會拋出 導(dǎo)致測試失敗,但有時候,我們需要去確保頁面元素不存在,才是我們正確的驗收條件下面的方法可以用來判定頁面元素是否存在
1 public boolean doesWebElementExist(WebDriver driver, By selector)
2 {
3
4 try
5 {
6 driver.findElement(selector);
7 return true;
8 }
9 catch ( e)
10 {
11 return false;
12 }
13 }
2.一般有這樣的應(yīng)用場合,例如我們要驗證在一個網(wǎng)站是否登錄成功,那么可以通過判斷登錄之后是否顯示相應(yīng)元素:
WebElement linkUsername = driver.findElement(By.xpath("http://a[contains(text(),"+username+")]"));
return linkUsername.isDisplayed();
這一方法的前提是:該元素之前已經(jīng)存在,僅僅需要判斷是否被顯示。
現(xiàn)在存在另一種場合,頁面元素并不存在,即通過driver.findElement只能在超時之后得到的異常。
因此只好通過如下方法解決:
1 boolean ElementExist (By Locator )
2 {
3 try
4 {
5 driver.findElement( Locator );
6 return true;
7 }
8 catch(org.openqa.selenium. ex)
9 {
10 return false;
11 }
12 }
但這一方法仍然不理想,有這樣兩個問題:
1、這一方法不屬于任何一個page頁,因此需要額外進行框架上的變更以支持這些功能函數(shù),否則就必須在每一個用到該函數(shù)的page類寫一遍。
2、仍然需要等到超時才能得知結(jié)果,當(dāng)需要頻繁使用該函數(shù)的時候會造成相當(dāng)?shù)臅r間浪費。
3.
類似于seleniumRC中的isTextPresent 方法
用xpath匹配所有元素(//*[contains(.,'keyword')]),判斷是否存在包含期望關(guān)鍵字的元素。
使用時可以根據(jù)需要調(diào)整參數(shù)和返回值。
4. Xpath 多重判斷
1 while(currentPageLinkNumber<MaxPage)
2 {
3 WebElement PageLink;
4 PageLink = driver.findElement(By.xpath("http://a[@class = 'PageLink' and @title ='"+Integer.toString(currentPageLinkNumber+1)+"']"));
5 PageLink.click();
6 currentPageLinkNumber++;
7 //OtherOperation();
8 }
望采納,謝謝。
讀取短信需要在相應(yīng)的手機上讀取呀 由于工作需要,登錄網(wǎng)站需要用到驗證碼。
最初是研究過驗證碼識別的,但是總是不能獲取到我需要的那個驗證碼。直到這周五,才想起這事來,昨天順利的解決了。
下面正題:Python版本:3.4.3 所需要的代碼庫:PIL,selenium,tesseract 先上代碼:#coding:utf-8 import subprocess from PIL import Image from PIL import ImageOps from selenium import webdriver import time,os,sys def cleanImage(imagePath):image = Image.open(imagePath) #打開圖片 image = image.point(lambda x: 0 if x<143 else 255) #處理圖片上的每個像素點,使圖片上每個點“非黑即白” borderImage = ImageOps.expand(image,border=20,fill='white') borderImage.save(imagePath) def getAuthCode(driver, url="mon/random" driver.get(captchaUrl) time.sleep(0.5) driver.save_screenshot("captcha.jpg") #截屏,并保存圖片#urlretrieve(captchaUrl, "captcha.jpg") time.sleep(0.5) cleanImage("captcha.jpg") p = subprocess.Popen(["tesseract", "captcha.jpg", "captcha"], stdout=\ subprocess.PIPE,stderr=subprocess.PIPE) p.wait() f = open("captcha.txt", "r")#Clean any whitespace characters captchaResponse = f.read().replace(" ", "").replace("\n", "") print("Captcha solution attempt: " + captchaResponse) if len(captchaResponse) == 4:return captchaResponse else:return False def withoutCookieLogin(url=""):driver = webdriver.Chrome() driver.maximize_window() driver.get(url) while True:authCode = getAuthCode(driver, url) if authCode:driver.back() driver.find_element_by_xpath("//input[@id='orgCode' and @name='orgCode']").clear() driver.find_element_by_xpath("//input[@id='orgCode' and @name='orgCode']").send_keys("orgCode") driver.find_element_by_xpath("//input[@id='account' and @name='username']").clear() driver.find_element_by_xpath("//input[@id='account' and @name='username']").send_keys("username") driver.find_element_by_xpath("//input[@type='password' and @name='password']").clear() driver.find_element_by_xpath("//input[@type='password' and @name='password']").send_keys("password") driver.find_element_by_xpath("//input[@type='text' and @name='authCode']").send_keys(authCode) driver.find_element_by_xpath("//button[@type='submit']").click() try:time.sleep(3) driver.find_element_by_xpath("//*[@id='side-menu']/li[2]/ul/li/a").click() return driver except:print("authCode Error:", authCode) driver.refresh() return driver driver = withoutCookieLogin("http://localhost/") driver.get("http://localhost/enterprise/add/") 怎么獲取我們需要的驗證碼 在這獲取驗證碼的道路上,我掉了太多的坑,看過太多的文章,很多都是教你驗證碼的識別方法,但是沒有說明,怎么獲取你當(dāng)前需要的驗證碼圖片。我的處理方法是:1.先用selenium打開你需要的登錄的頁面地址url12.通過審核元素獲取驗證碼的地址url2(其實最簡單的是右鍵打開新頁面)3:在url1頁面,輸入地址url2進入url2頁面,然后截屏保存驗證碼頁面4:處理驗證碼得到驗證碼字符串。
然后點擊瀏覽器后退按鈕,返回url1登錄頁面5:輸入登錄需要的信息和驗證碼6:點擊登錄7:驗證登錄后的頁面,判斷是否成功,若不成功則需要重新1-7的操作。為了保護公司的信息,這個頁面是我本地搭的服務(wù),我在伯樂在線注冊頁面進行測試過這個驗證碼獲得方法,可以通過。
(這個驗證碼的處理方法,僅限驗證碼背景是像素點,若驗證碼有橫線需額外處理。) 第一篇博文,不喜勿噴。
驗證碼處理方法參考文獻:Web Scraping with python.pdf。
聲明:本網(wǎng)站尊重并保護知識產(chǎn)權(quán),根據(jù)《信息網(wǎng)絡(luò)傳播權(quán)保護條例》,如果我們轉(zhuǎn)載的作品侵犯了您的權(quán)利,請在一個月內(nèi)通知我們,我們會及時刪除。
蜀ICP備2020033479號-4 Copyright ? 2016 學(xué)習(xí)鳥. 頁面生成時間:2.634秒