擇一個(gè)目前比較好的Web應用驗收測試工具,有一定了解的人都會(huì )想到OpenQA Selenium,它能按照你設置的步驟逐步執行所有按鍵操作并給出執行結果,最終達到測試的目的。
將Selenium這樣的Web測試框架引入到你的Web項目里,可以使你的Web功能實(shí)現可重復級測試。 在引入過(guò)程中,你不必擔心編程語(yǔ)言或瀏覽器問(wèn)題,因為Selenium RC支持Java、C#、Ruby等語(yǔ)言和IE、Firefox、Mozilla Suite等瀏覽器,同時(shí)還提供了一個(gè)Firefox插件Selenium IDE,它不僅能幫你記錄你在頁(yè)面上的操作步驟,還能執行你錄制的步驟并顯示執行結果了,它也可以生成相應語(yǔ)言的測試代碼,供你在持續集成里執行。
內,Selenium也確實(shí)火了一段時(shí)間,首先是徐昊的一篇文章,引起的大家廣泛關(guān)注;然后江南白衣也加入其中,并在SpringSide2。0已經(jīng)全面應用Selenium(在example里有幾個(gè)簡(jiǎn)單的功能測試);接下來(lái)就是Tin組織并推動(dòng)的Selenium中文化項目;大半年過(guò)去了,Selenium中文化從最開(kāi)始的強勢出擊到現在的停滯不前,其間遇到的波折和問(wèn)題,我是不太了解的,不過(guò)我還是從中學(xué)到了很多東西,也開(kāi)始嘗試在項目中使用Selenium進(jìn)行功能測試。
在使用Selenium過(guò)程中,越發(fā)發(fā)現它并不像大家吹噓的那么強大,問(wèn)題和局限性都比較多,并結合自身的實(shí)際情況,最終放棄使用Selenium。下面是本人總結出來(lái)的一些問(wèn)題點(diǎn),希望能作為大家選擇和使用Selenium時(shí)的參考。
Selenium適合比較專(zhuān)業(yè)的團隊使用 Selenium所提供的命令非常強大(這是緣于它有強大的XPath表達式),要讓開(kāi)發(fā)人員、測試人員和用戶(hù)理解和應用這些常用的命令也不是易事,雖然Selenium提供了支持Firefox的IDE,但目前國內公司的內部使用的主流瀏覽器還是IE,外加部分遺留系統的JS存在問(wèn)題(不支持Firefox),這使得推廣和應用時(shí)存在阻力。 Selenium不支持動(dòng)態(tài)鏈接按鈕處理 這個(gè)問(wèn)題十分煩人,導致很多地方的測試都不連貫,也無(wú)法驗證一些操作是否正確,也就無(wú)法談及自動(dòng)化了;也可能是我沒(méi)有掌握到Selenium處理動(dòng)態(tài)鏈接按鈕的方法。
Selenium對特別復雜的頁(yè)面支持不好 如果用Selenium來(lái)測試類(lèi)似登錄或注冊這樣簡(jiǎn)單的頁(yè)面時(shí),它的確是我們的一個(gè)很好的幫手,能幫助我們處理得很好,而在處理復雜的企業(yè)應用系統頁(yè)面時(shí),它卻顯示是那樣的弱不禁風(fēng)和脆弱;同時(shí)在處理包含有大量組件需要測試的頁(yè)面時(shí),也是相當恐怖的,如果要測試10組件的相符作用關(guān)系的話(huà),排列組合出來(lái)也是一個(gè)不小的數字,雖不復雜,但很麻煩 Selenium社區不活躍 最后,Selenium的社區不夠活躍,也是我們放棄使用Selenium的原因之一。 即使Selenium Core和RC最近才發(fā)布了新版本,我也不得不說(shuō)這個(gè)社區不怎么樣,得不到很好的支持和幫助。
新版本也沒(méi)有來(lái)帶特別有效和值得一提的功能。 Selenium還需要時(shí)間來(lái)不斷成長(cháng)和完善,想依靠Selenium這樣的工具來(lái)實(shí)現系統驗收的自動(dòng)化更是需要時(shí)間。
當這一天真的到來(lái)之時(shí),我們的部分同行可能會(huì )因使用上自動(dòng)驗收工具而減輕工作負擔,而另外部分同行可能會(huì )面臨失業(yè)危機,因為他們所做的工作將會(huì )被計算機所替代。
很奇怪你為什么要問(wèn)這個(gè)問(wèn)題,你用selenium的話(huà),你肯定預先知道用的是什么瀏覽器,因為不同的瀏覽器,調用的方法都不一樣
#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 完全不一樣的
當然結果print出來(lái)也能看得出用的是 什么瀏覽器
<selenium.webdriver.chrome.webdriver.WebDriver object at 0x028536F0> <selenium.webdriver.firefox.webdriver.WebDriver object at 0x02853750>
1. selenium中如果去尋找元素,而元素不存在的話(huà),通常會(huì )拋出 導致測試失敗,但有時(shí)候,我們需要去確保頁(yè)面元素不存在,才是我們正確的驗收條件下面的方法可以用來(lái)判定頁(yè)面元素是否存在
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.一般有這樣的應用場(chǎng)合,例如我們要驗證在一個(gè)網(wǎng)站是否登錄成功,那么可以通過(guò)判斷登錄之后是否顯示相應元素:
WebElement linkUsername = driver.findElement(By.xpath("http://a[contains(text(),"+username+")]"));
return linkUsername.isDisplayed();
這一方法的前提是:該元素之前已經(jīng)存在,僅僅需要判斷是否被顯示。
現在存在另一種場(chǎng)合,頁(yè)面元素并不存在,即通過(guò)driver.findElement只能在超時(shí)之后得到的異常。
因此只好通過(guò)如下方法解決:
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 }
但這一方法仍然不理想,有這樣兩個(gè)問(wèn)題:
1、這一方法不屬于任何一個(gè)page頁(yè),因此需要額外進(jìn)行框架上的變更以支持這些功能函數,否則就必須在每一個(gè)用到該函數的page類(lèi)寫(xiě)一遍。
2、仍然需要等到超時(shí)才能得知結果,當需要頻繁使用該函數的時(shí)候會(huì )造成相當的時(shí)間浪費。
3.
類(lèi)似于seleniumRC中的isTextPresent 方法
用xpath匹配所有元素(//*[contains(.,'keyword')]),判斷是否存在包含期望關(guān)鍵字的元素。
使用時(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 }
望采納,謝謝。
讀取短信需要在相應的手機上讀取呀 由于工作需要,登錄網(wǎng)站需要用到驗證碼。
最初是研究過(guò)驗證碼識別的,但是總是不能獲取到我需要的那個(gè)驗證碼。直到這周五,才想起這事來(lái),昨天順利的解決了。
下面正題: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) #打開(kāi)圖片 image = image.point(lambda x: 0 if x<143 else 255) #處理圖片上的每個(gè)像素點(diǎn),使圖片上每個(gè)點(diǎn)“非黑即白” 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/") 怎么獲取我們需要的驗證碼 在這獲取驗證碼的道路上,我掉了太多的坑,看過(guò)太多的文章,很多都是教你驗證碼的識別方法,但是沒(méi)有說(shuō)明,怎么獲取你當前需要的驗證碼圖片。我的處理方法是:1.先用selenium打開(kāi)你需要的登錄的頁(yè)面地址url12.通過(guò)審核元素獲取驗證碼的地址url2(其實(shí)最簡(jiǎn)單的是右鍵打開(kāi)新頁(yè)面)3:在url1頁(yè)面,輸入地址url2進(jìn)入url2頁(yè)面,然后截屏保存驗證碼頁(yè)面4:處理驗證碼得到驗證碼字符串。
然后點(diǎn)擊瀏覽器后退按鈕,返回url1登錄頁(yè)面5:輸入登錄需要的信息和驗證碼6:點(diǎn)擊登錄7:驗證登錄后的頁(yè)面,判斷是否成功,若不成功則需要重新1-7的操作。為了保護公司的信息,這個(gè)頁(yè)面是我本地搭的服務(wù),我在伯樂(lè )在線(xiàn)注冊頁(yè)面進(jìn)行測試過(guò)這個(gè)驗證碼獲得方法,可以通過(guò)。
(這個(gè)驗證碼的處理方法,僅限驗證碼背景是像素點(diǎn),若驗證碼有橫線(xiàn)需額外處理。) 第一篇博文,不喜勿噴。
驗證碼處理方法參考文獻:Web Scraping with python.pdf。
聲明:本網(wǎng)站尊重并保護知識產(chǎn)權,根據《信息網(wǎng)絡(luò )傳播權保護條例》,如果我們轉載的作品侵犯了您的權利,請在一個(gè)月內通知我們,我們會(huì )及時(shí)刪除。
蜀ICP備2020033479號-4 Copyright ? 2016 學(xué)習?shū)B(niǎo). 頁(yè)面生成時(shí)間:2.634秒