上回我們介紹了一些常見的網(wǎng)頁元素伴嗡,從這篇文章開始咱們就聊聊對于這些元素的操作话浇。講之前先把測試環(huán)境搭一下。上節(jié)課說過闹究,selenium web driver其實(shí)就是個(gè)類庫幔崖,它也是以jar包的形式存在,打開selenium官網(wǎng)渣淤,找到這兩個(gè)小東西:
一個(gè)叫selenium standalone server赏寇,一個(gè)叫selenium client。前者是1.0時(shí)代selenium RC為了讓程序和瀏覽器之間交互而使用的服務(wù)器价认,現(xiàn)在大多數(shù)人已經(jīng)使用2.0了嗅定,所以這個(gè)可以不用下載,只需要下載selenium client里面的jar包就行了用踩。
下載完我們新建一個(gè)叫SeleniumDriver的java項(xiàng)目 -> 添加com.test包 -> Test.java渠退,帶上main函數(shù):
然后通過build path -> configure build path -> libraries -> Add External jars把下載的jar都加進(jìn)去:
先說驅(qū)動(dòng)忙迁,我們又叫driver。之所以先說driver碎乃,是因?yàn)樗钦麄€(gè)selenium自動(dòng)化的核心之一姊扔,創(chuàng)建driver也是寫測試程序時(shí)最先要做的。上次咱們把瀏覽器比喻成selenium的車梅誓,而把driver比喻成selenium的司機(jī)恰梢,對于車來說,主流的瀏覽器有IE梗掰,chrome和firefox三個(gè)杨耙,那么對應(yīng)我們也得有三種driver熏矿,就好比大部分人只能開小轎車,你不能讓他開火車或是公交車机久,容易出車禍谈跛。司機(jī)一定要跟車對應(yīng)蛔翅,driver類型一定要跟瀏覽器對應(yīng)乘盖。訪問selenium官網(wǎng)读处,我們可以看到有一些類似“xxdriver”這種字樣的東西,它們就是不同瀏覽器的driver猜惋,我們只需要下載給IE,chrome和firefox準(zhǔn)備的就好:
你把driver拿來之后是要告訴你自己的電腦的培愁,因?yàn)樗緳C(jī)再牛也得有公司雇他才行呀著摔,否則你開誰的車呀?你的操作系統(tǒng)就相當(dāng)于是它的公司定续。在自動(dòng)化的世界里驅(qū)動(dòng)可以作為系統(tǒng)的一個(gè)屬性存在谍咆,只要系統(tǒng)把它添加到屬性之中,就相當(dāng)于添加到公司里了私股,語法是
System是java里的一個(gè)類摹察,setProperty是它的靜態(tài)方法。先以chrome為例倡鲸,對于我的電腦來說就是:
driver的位置因人而異供嚎,但只要是用chrome,那driver類型一定要寫成webdriver.chrome.driver峭状,也不難記克滴。
司機(jī)加入公司之后就可以正式上崗了,我們先創(chuàng)建一個(gè)driver對象优床,就好比司機(jī)已經(jīng)是待命狀態(tài):
司機(jī)已經(jīng)準(zhǔn)備好了劝赔,下面就該準(zhǔn)備車了。再強(qiáng)調(diào)一遍胆敞,driver類型必須要跟瀏覽器一致着帽,既然是Chrome的驅(qū)動(dòng)杂伟,那就只能用Chrome瀏覽器。雖然谷歌在咱們國家被禁仍翰,但在國內(nèi)下載Chrome的網(wǎng)站應(yīng)該還是一大把赫粥,找個(gè)靠譜網(wǎng)站下載下來安裝好。
車夫跟車都準(zhǔn)備完了這才差不多了搭好了測試環(huán)境歉备。折騰了這么久終于該開始正題了 --- driver的操作傅是。driver有八種最常見的操作方式,也就是說創(chuàng)建出來的driver對象有八個(gè)最常見的方法蕾羊。你在eclipse里查一下咱們剛創(chuàng)建的driver對象的方法喧笔,可以看到有很多:
第一個(gè)常見方法是get(String url),里面有一個(gè)代表網(wǎng)址的字符串參數(shù)龟再,這句代碼表示打開哪個(gè)網(wǎng)站進(jìn)行測試书闸。咱們用我給大家準(zhǔn)備的[示例網(wǎng)頁]((http://cslm-test.com/webapps/elements/webelements.html),這是我為了演示咱們這個(gè)教程里的事例專門給大家搭建的測試網(wǎng)站:
如果現(xiàn)在運(yùn)行程序利凑,那大家會(huì)看到這個(gè)網(wǎng)頁打開了浆劲。我們通常就是用這個(gè)方法打開被測網(wǎng)站。
第二個(gè)常見方法是getTitle()哀澈,里面不加任何參數(shù)牌借,返回的是當(dāng)前被測網(wǎng)頁的標(biāo)題,也就是在頂端選項(xiàng)卡上寫的字割按。我們也可以用System.out.println()在后臺(tái)打印出來:
第三個(gè)方法是getCurrentUrl()膨报,返回的是當(dāng)前被測網(wǎng)站的網(wǎng)址:
第四個(gè)方法是getPageSource(),這個(gè)方法返回當(dāng)前頁面的源代碼适荣,也就是它的html现柠,css或javascript之類的東西,我們有時(shí)候會(huì)在網(wǎng)頁上鼠標(biāo)右鍵 -> 查看網(wǎng)頁源代碼弛矛,效果是一樣的:
上面四個(gè)方法一起執(zhí)行够吩,會(huì)一一對應(yīng)打印出各種信息,沒毛病丈氓。但我們發(fā)現(xiàn)網(wǎng)頁并不是全屏的周循,看起來不爽。第五個(gè)方法就能解決這個(gè)問題:連續(xù)調(diào)用manage().window().maximize()可以使瀏覽器全屏:
再運(yùn)行一遍万俗,我們發(fā)現(xiàn)還是不爽鱼鼓。為什么?每次運(yùn)行完瀏覽器都開著该编,運(yùn)行兩遍也就是開兩個(gè)頁面迄本,你得自己手動(dòng)給它關(guān)上。運(yùn)行個(gè)十次八次的每次都自己關(guān)實(shí)在太麻煩了课竣。所以第六個(gè)方法close()就是用來自動(dòng)關(guān)閉瀏覽器的:
再運(yùn)行一遍整個(gè)程序嘉赎,我們發(fā)現(xiàn)只有最后一遍運(yùn)行打開的頁面被關(guān)閉了置媳,其它用chrome打開的頁面并沒有被關(guān)閉。注意公条,close()方法只關(guān)閉在自動(dòng)化運(yùn)行時(shí)打開的并且正在控制的網(wǎng)頁拇囊。這句話有點(diǎn)拗口,但理解起來不難靶橱。兩個(gè)要求:首先寥袭,它只關(guān)閉在自動(dòng)化運(yùn)行時(shí)打開的網(wǎng)頁,你自己雙擊電腦桌面上chrome瀏覽器圖標(biāo)然后手動(dòng)敲入網(wǎng)址打開的不算數(shù)关霸,得人家selenium打開的才行传黄。這也沒毛病,人家selenium公司的驅(qū)動(dòng)老司機(jī)只能管到它自己打開的東西队寇,管不到你打開的膘掰。第二,得是正在控制的網(wǎng)頁佳遣,就一個(gè)识埋。如果selenium在運(yùn)行過程中打開了兩個(gè)網(wǎng)頁,那只會(huì)關(guān)一個(gè)零渐。比如咱們在這段程序里再加一句代碼用來在新窗口顯示鏈接內(nèi)容:
現(xiàn)在不理解這句話的朋友先別著急窒舟,后面說元素操作的時(shí)候都會(huì)詳細(xì)講,現(xiàn)在只要知道它是用來點(diǎn)擊一個(gè)鏈接诵盼,并且鏈接內(nèi)容在新窗口里出現(xiàn)就好惠豺。這里我讓它打開新窗口并跳轉(zhuǎn)到百度。后面Thread.sleep(5000)代表driver會(huì)停留5秒鐘拦耐,介紹線程那篇我們也討論過耕腾。Thread經(jīng)常會(huì)用到见剩,因?yàn)榫W(wǎng)頁跳轉(zhuǎn)需要時(shí)間杀糯,而且根據(jù)你家網(wǎng)速不同需要的時(shí)間也不同。但是苍苞,當(dāng)你的網(wǎng)頁跳轉(zhuǎn)的時(shí)候程序并不知道固翰,它還是會(huì)繼續(xù)執(zhí)行,不加停留時(shí)間的話會(huì)直接運(yùn)行到driver.close()羹呵,這樣很有可能driver和網(wǎng)頁都關(guān)了可你新窗口的內(nèi)容還沒顯示出來呢骂际。這個(gè)例子比較簡單,后邊沒操作了冈欢,關(guān)了就關(guān)了沒關(guān)系歉铝。但如果后面還需要你在新窗口做些操作那就肯定fail了。這里有一個(gè)專門的概念叫“異步處理”凑耻,不同步的時(shí)候就得等等太示,咱們后面會(huì)大量使用柠贤,我也會(huì)詳細(xì)講。
我們發(fā)現(xiàn)運(yùn)行完畢只有webelement.html網(wǎng)頁關(guān)上了类缤,百度的沒關(guān)臼勉。因?yàn)殡m然鏈接跳轉(zhuǎn),但driver當(dāng)前控制的還是第一個(gè)網(wǎng)頁餐弱。那要全關(guān)上呢宴霸?這就需要第七個(gè)方法:quit()。把close()改成quit()再執(zhí)行膏蚓,這下全關(guān)上了瓢谢,不留痕跡:
做項(xiàng)目時(shí)具體問題具體分析,看是用close()還是quit()降允。有人說你不是說quit()會(huì)全關(guān)上么恩闻?那講close()方法之前打開的那些網(wǎng)頁呢?不也是自動(dòng)化打開的么剧董?咋還需要手動(dòng)關(guān)呢幢尚?是這樣,每一次程序執(zhí)行完畢的時(shí)候翅楼,driver就算是完成了它的生命周期尉剩,或者叫做完成了它當(dāng)前的會(huì)話(session),不管你寫不寫close()或是quit()毅臊,driver都會(huì)被強(qiáng)行干掉理茎,老司機(jī)都得下班。再運(yùn)行一遍程序時(shí)管嬉,new ChromeDriver()又會(huì)產(chǎn)生了一個(gè)新的driver對象皂林,而新的對象無法關(guān)閉上一個(gè)生命周期遺留下來的瀏覽器。就好比昨天司機(jī)有個(gè)單子沒接蚯撩,今天還能再接相同的單子么础倍?不能。同理胎挎,如果你用了close()或是quit()沟启,后面再想用get(),getCurrentUrl()犹菇,getPageSource()都會(huì)報(bào)錯(cuò)德迹,因?yàn)樯芷诮Y(jié)束,司機(jī)下班了:
quit()之后你再想打開網(wǎng)頁揭芍,對不起報(bào)錯(cuò)了胳搞,說你的會(huì)話已經(jīng)失效了,你得重新再實(shí)例化一個(gè)driver對象。
driver的最后一個(gè)常用方法我們留到說網(wǎng)頁元素操作的時(shí)候再介紹肌毅,此方法用來定位網(wǎng)頁元素币厕,非常重要。此外芽腾,需要注意的是旦装,selenium是個(gè)開源的網(wǎng)站,但維護(hù)得還不錯(cuò)摊滔。但正是因?yàn)殚_源阴绢,里面常有瀏覽器和驅(qū)動(dòng)兼容性問題的出現(xiàn),也就是說司機(jī)跟車不兼容艰躺。經(jīng)常上selenium官網(wǎng)的朋友會(huì)發(fā)現(xiàn)驅(qū)動(dòng)會(huì)經(jīng)常更新呻袭。如果你運(yùn)行不成功,但排錯(cuò)又發(fā)現(xiàn)真沒什么問題腺兴,那就要往兼容性上去想左电。有時(shí)候同一段代碼,之前運(yùn)行沒問題页响,但過幾個(gè)月發(fā)現(xiàn)不行了篓足,中間什么都沒改。仔細(xì)一查闰蚕,發(fā)現(xiàn)電腦重啟的時(shí)候?yàn)g覽器升級了栈拖,跟原來的驅(qū)動(dòng)不匹配了。你自己要是不知道兼容性這么一回事就慢慢調(diào)試吧没陡,反正出不來涩哟。所以查詢錯(cuò)誤信息很重要。你可以把錯(cuò)誤信息復(fù)制粘貼到百度上盼玄,很可能有人跟你一樣遇到過這個(gè)問題贴彼。我推薦過一個(gè)叫stackoverflow的網(wǎng)站,就是專門是解決各種各樣問題的一個(gè)論壇埃儿,雖然都是英文器仗,但讀起來應(yīng)該不費(fèi)勁,就當(dāng)學(xué)英語了蝌箍。
這篇只介紹了chrome driver的操作青灼,下次說firefox和IE的暴心。源代碼是SeleniumDriverChrome項(xiàng)目妓盲。
本篇知識(shí)點(diǎn)及注意事項(xiàng):
1. 自動(dòng)化測試代碼的執(zhí)行需要驅(qū)動(dòng)(driver)和瀏覽器共同配合完成。
2. driver的常用操作有打開瀏覽器专普、獲取網(wǎng)頁標(biāo)題悯衬、源代碼、定位元素等操作。