天天看點

python自動化測試應用-第7篇(WEB測試)--Selenium進階篇

篇7                            python自動化測試應用-Selenium進階篇

                                                                                    --lamecho

1.1概要

      大家好!我是lamecho(辣麼醜),本篇文章将是我們介紹selenium使用的最後一篇進階篇,會給大家帶來一些幹貨幫助大家能夠處理在實戰中碰到的實際問題。

1.2 selenium繼續實戰百度頁面

      我們繼續以百度作為實戰的對象。通過上一篇的講解,我們大概知道了網頁元素的基本知識和對一些常見元素類型的操作,比如按鈕,input輸入框,連結等其實隻要大家仔細分析它的tagname(标簽)就能很快的找到并進行輸入或點選操作。那麼今天我将進一步講解有關網頁或是浏覽器的一些操作。比如接下來我們介紹的第一個新類型Select選擇條。

       1.Select和option選項

      在頁面如果碰到彈出的下拉選項該如何操作,如下圖百度首頁的搜尋設定中的紅框位置。

python自動化測試應用-第7篇(WEB測試)--Selenium進階篇

我們首先看看它的頁面源碼

python自動化測試應用-第7篇(WEB測試)--Selenium進階篇

# -*-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