篇7 python自動化測試應用-Selenium進階篇
--lamecho
1.1概要
大家好!我是lamecho(辣麼醜),本篇文章将是我們介紹selenium使用的最後一篇進階篇,會給大家帶來一些幹貨幫助大家能夠處理在實戰中碰到的實際問題。
1.2 selenium繼續實戰百度頁面
我們繼續以百度作為實戰的對象。通過上一篇的講解,我們大概知道了網頁元素的基本知識和對一些常見元素類型的操作,比如按鈕,input輸入框,連結等其實隻要大家仔細分析它的tagname(标簽)就能很快的找到并進行輸入或點選操作。那麼今天我将進一步講解有關網頁或是浏覽器的一些操作。比如接下來我們介紹的第一個新類型Select選擇條。
1.Select和option選項
在頁面如果碰到彈出的下拉選項該如何操作,如下圖百度首頁的搜尋設定中的紅框位置。
我們首先看看它的頁面源碼
# -*-encoding:utf-8 -*-
from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.action_chains import ActionChains
browser=webdriver.Firefox()
browser.maximize_window()
browser.get("https://www.baidu.com/")
browser.implicitly_wait(10)
el=browser.find_element_by_link_text(u'設定')
ActionChains(browser).move_to_element(el).release().perform()
browser.implicitly_wait(10)
browser.find_element_by_link_text(u'搜尋設定').click()
browser.implicitly_wait(10)
sel=browser.find_element_by_id('nr')
Select(sel).select_by_value('50')
sleep(2)
Select(sel).select_by_index(1)
sleep(10)
browser.quit()
這裡主要分析最後幾行腳本,在開始我們首先要導入Select子產品
from selenium.webdriver.support.select import Select
sel=browser.find_element_by_id('nr')
#通過id将找到的select指派給sel
Select(sel).select_by_value('50')
#用Select(sel)轉化sel為Select,然後就可以用Select的方法去做選擇。常用的方法有兩個select_by_value和select_by_index。這裡要注意value值是标簽裡的value值不是text,index下标從0開始計數。
sleep(2)
Select(sel).select_by_index(1)
2.執行腳本指令
有時候selenium提供給我們的方法不足以完成一些複雜的操作,這時候我們可以借助腳本指令去在頁面上完成相應的動作。比如說怎麼操作浏覽器的滾動條操作頁面上劃下劃呢?
我們先來看看腳本執行的方法是怎麼寫的
js='window.scrollTo(0,document.body.scrollHeight);'#下劃到頁面底部
browser.execute_script(js)
我們要執行的js語句放到execute_script裡就可以了,這裡隻是有關腳本的一個應用展示,其實通過腳本指令我們還可以幹很多事情。這裡就要大家去多了解一些javascript相關的一些知識。比如
‘var bj=document.getElementsByTagName(\"a\");return obj[3].text=500;’
将找到的a标簽的text值修改成500,那麼最後網頁上對應的這個元素的text值會變成500。還有這樣js="return document.readyState",将會傳回目前網頁的加載情況,依據腳本執行的傳回值,我們可以判斷頁面是否加載完成。
3.iframe标簽
當我們遇到這樣的标簽時,該怎麼辦呢?它類似與頁面内嵌了一個頁面,這時我們要去在新彈出的架構頁面上定位操作元素,其實也非常簡單,我們要将browser切換到這個架構頁面中去,使用語句
browser.switch_to.frame(frame_ID)
frame_ID擷取可以在元素iframe中的源碼中擷取它的id。當我們在frame中操作完成後,要繼續在原頁面執行的話,需要使用語句
browser.switch_to_default_content()
也就是再切換回原頁面内容。這裡再說一種情況,如果我們遇到iframe架構的id是動态的,也就是每次頁面加載都會動态指定id,我們可以在python中這樣處理:
frame_ID=browser.find_element_by_tag_name('iframe').get_attribute('id')
browser.switch_to.frame(frame_ID)
這樣寫就不需要考慮iframe架構的id問題,因為我們也是動态擷取目前頁面的id值。
4.讓頁面執行鍵盤操作
首先我們要導入一些新的包
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
同樣的在百度搜尋框中輸入,最後操作鍵盤的回車進行檢索。
browser.implicitly_wait(10)
el=browser.find_element_by_id('kw')
ActionChains(browser).send_keys_to_element(el,'lamecho').key_down(Keys.ENTER).key_up(Keys.ENTER).perform()
主要看最後一行send_keys_to_element(el,'lamecho')向el元素中輸入字元,緊接着key_down和key_up就是操作按下彈起Keys.ENTER(回車)。這樣寫是不是很友善,一行搞定幾個動作。另外它也可以實作組合鍵的操作,隻要我們将按鍵的key_down,key_up順序寫對就ok了。
5.浏覽器的新标簽
目前浏覽器都會支援在一個視窗中打開多個頁面,也就是我們常說的标簽頁。那麼當我們在執行操作時,新的頁面是在新的标簽頁中打開的,我們要怎麼樣去在新的頁面中執行元素的查找呢?曾經在網絡上看到過有網友是通過鍵盤的實體按鍵Ctrl+tab去切換到新标簽,誠然我們看到頁面是做了切換,但是這樣我們是無法繼續在這個新頁面去做元素查找的,因為我們的browser還是在原頁面,這個和frame切換一個道理。隻有将我們的browser切換到新新頁面,才能繼續在新的頁面裡去查找元素。我們看在python腳本中怎麼去做這樣的操作。
browser.implicitly_wait(10)
browser.find_element_by_id('TANGRAM__PSP_8__userName').send_keys('test')
browser.find_element_by_id('TANGRAM__PSP_8__password').send_keys('test')
#browser.find_element_by_id('TANGRAM__PSP_8__submit').click()
browser.find_element_by_link_text(u'立即注冊').click()
while 1:
h=browser.window_handles
if len(h)==2:
name=h[1]
break
sleep(1)
browser.switch_to_window(name)
browser.implicitly_wait(10)
browser.find_element_by_id('TANGRAM__PSP_3__verifyCode').send_keys('1234')
繼續我們百度頁面的實戰,當我們打開登入框後,我們最後一步是點選的“登入”按鍵,我們将其注釋掉,改成點選“立即注冊”按鍵。實際執行是百度頁面是在新的标簽頁面中打開的注冊頁面,接着往下看我們的腳本,使用到了循環去執行browser.window_handles,去查找浏覽器視窗的handle,當新的标簽打開後自然我們的視窗會變成兩個,它的長度自然也就會等于2,跳出循環,然後我們再通過browser.switch_to_window(name),将我們的browser切換到新頁面中繼續我們的元素查找工作。大家執行一下效果是不是最後在校驗碼的input中輸入了1234。
1.3進階篇—結束
Selenium的進階篇終于完稿了,其實也就是講述了實際項目中碰到的一點棘手問題,操作稍微複雜一些而已。而我在文章中所能涉及的内容其實在selenium的使用上所能涵蓋的十之隻有一二,大家要多多練習,共勉。
感謝大家耐心讀完,我是lamecho辣麼醜。
原創文章,轉載請注明出處。新浪微網誌搜尋 “lamecho好棒” 歡迎大家來撩。
微網誌:https://weibo.com/u/6017986584
部落格:http://blog.sina.com.cn/u/6017986584