Python Selenium 部分API詳細使用方法(三)

************************************************************************************************javascript

6、獲取頁面的title和url

有時間須要經過頁面的title和url去判斷頁面的狀態。好比測試登陸是否成功和重定向是否成功。css

#得到前面 title,打印
title = driver.title
print title

#得到前面 URL,打印
now_url = driver.current_url
print now_url

************************************************************************************************java

7、設置等待時間

有時候爲了保證腳本運行的穩定性,須要腳本中添加等待時間。node

設置等待時間有如下幾種方法:python

  • sleep(): 設置固定休眠時間。 python 的 time 包提供了休眠方法 sleep() , 導入 time包後就可使用 sleep()進行腳本的執行過程進行休眠。
  • implicitly_wait():是 webdirver 提供的一個超時等待。隱的等待一個元素被發現,或一個命令完成。若是超出了設置時間的則拋出異常。
  • WebDriverWait():一樣也是 webdirver 提供的方法。在設置時間內,默認每隔一段時間檢測一次當前頁面元素是否存在,若是超過設置時間檢測不到則拋出異常。
  • 一、sleep()休眠方法web

    當執行到sleep()方法時會固定休眠必定的時長,而後再往下執行。sleep()方法以秒爲單位,假如休眠時間小於 1 秒,能夠用小數表示。json

    import time
    ....
    time.sleep(5)
    time.sleep(0.5)

    固然,也能夠直接導入 sleep()方法,使腳本中的引用更簡單瀏覽器

    from time import sleep
    ....
    sleep(3)
    sleep(30)

    二、implicitly_wait()cookie

    隱式等待是經過必定的時長等待頁面上某元素加載完成。若是超出了設置的時長元素還沒被加載,則拋出NoSuchElementException異常。implicitly_wait()方法比 sleep() 更加智能,後者只能選擇一個固定的時間的等待,前者能夠在一個時間範圍內智能的等待。以秒爲單位。注意:它並不針對頁面上的某一個元素進行等待,而是從你設定這個隱式等待開始的全部須要定位的元素。當腳本執行到某個元素定位時,若是元素能夠定位,則繼續執行;若是元素定位不到,則它將以輪詢的方式不斷判斷元素是否認位到。超過設定時間拋出異常app

    #添加智能等待30秒
    driver.implicitly_wait(30)

    三、WebDriverWait()

    詳細格式以下:
    WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None),參數解釋以下:

  • driver - WebDriver 的驅動程序(Ie, Firefox, Chrome 或遠程)
  • timeout - 最長超時時間,默認以秒爲單位
  • poll_frequency - 休眠時間的間隔(步長)時間,默認爲 0.5 秒
  • ignored_exceptions - 超時後的異常信息,默認狀況下拋 NoSuchElementException 異常。
  • from selenium.webdriver.support.ui import WebDriverWait
    ....
    element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id(「someId」))
    
    is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).until_not(lambda x: x.find_element_by_id(「someId」).is_displayed())

    WebDriverWai()通常由 unit()或 until_not()方法配合使用,下面是 unit()和 until_not()方法的說明:
    until(method, message=’’)
    調用該方法提供的驅動程序做爲一個參數,直到返回值不爲False。
    until_not(method, message=’’)
    調用該方法提供的驅動程序做爲一個參數,直到返回值爲 False。

************************************************************************************************

8、定位一組對象

須要獲取頁面上的一組元素是的方法:

#find_elements 用於獲取一組元素。
find_elements_by_id(‘xx’)
find_elements_by_name(‘xx’)
find_elements_by_class_name(‘xx’)
find_elements_by_tag_name(‘xx’)
find_elements_by_link_text(‘xx’)
find_elements_by_partial_link_text(‘xx’)
find_elements_by_xpath(‘xx’)
find_elements_by_css_selector(‘xx’)

 可使用for... in ...對這一組元素進行遍歷

for checkbox in checkboxes:
checkbox.click()

咱們獲取到一組元素以後也可使用pop()方法得到這一組元素中的第幾個,而後再對該元素進行操做:

find_elements_by_id(‘xx’).pop().click()
  • pop()或pop(-1)默認獲取一組元素中的最後一個
  • pop(0)   默認獲取一組元素的第一個元素
  • pop(1)   默認獲取一組元素的第二個元素
  • ......以此類推

************************************************************************************************

9、層級定位

在實際的項目測試中,常常會有這樣的需求:頁面上有不少個屬性基本相同的元素 ,如今須要具體
定位到其中的一個。因爲屬性基本至關,因此在定位的時候會有些麻煩,這時候就須要用到層級定位。先
定位父元素,而後再經過父元素定位子孫元素。

好比下拉列表,咱們能夠先點擊彈出下拉框而後再定位下拉列表中的選項

#點擊 Link1 連接(彈出下拉列表)
driver.find_element_by_link_text('Link1').click()
#在父親元件下找到 link 爲 Action 的子元素
menu =
driver.find_element_by_id('dropdown1').find_element_by_link_text('Another
action')

************************************************************************************************

10、多表單切換

在 web 應用中常常會出現 frame/iframe 表單內嵌套的應用,WebDriver只能在一個頁面上進行元素識別定位,對於frame/iframe表單內嵌頁面上的元素沒法直接定位。這是須要經過switch_to.frame()方法將當前定位的主體切換爲frame/iframe表單的內嵌頁面中。

driver.switch_to_frame("f2")

switch_to.frame()默承認以直接去表單的id或name屬性。若是沒有這兩個屬性,能夠經過其餘方式定位,好比:

#先經過xpath定位到iframe
xf=driver.find_element_by_xpath('/*[@class="if"]')
#再將定位對象傳給switch_to.frame()方法
driver.switch_to.frame()

若是完成了在當前表單上的操做,則能夠經過switch_to.parent_content()方法跳出當前一集表單。該方法默認對應於離他最近的switch_to.frame()。若是要跳出最外層的頁面使用switch_to.default_conent().

************************************************************************************************

11、多窗口切換

一、相關方法

current_window_handle:得到當前窗口句柄

window_handles:返回全部窗口的句柄到當前對話

switch_to.window(窗口句柄):切換到對應的窗口。

nowhandle=driver.current_window_handle
 driver.find_element_by_link_text(u"發表話題").click()
 time.sleep(3)
 #因爲發表新話題會新窗口打開,因此要指向新窗口,即發話題窗口
 allhandles=driver.window_handles
  for handle in allhandles:
         if(handle!=nowhandle):
             driver.switch_to.window(handle)

************************************************************************************************

 12、警告窗處理

處理javascript所生成的alert、confirm、prompt,可使用switch_to_alert()方法定位到alert/confirm/prompt,而後使用text/accept/dismiss/send_keys等方法進行操做

  • text     返回 alert/confirm/prompt 中的文字信息。
  • accept      點擊確認按鈕。
  • dismiss     點擊取消按鈕,若是有的話。
  • send_keys     輸入值,這個 alert\confirm 沒有對話框就不能用了,否則會報錯。

************************************************************************************************

十3、上傳文件

 一、查找到input標籤,經過send_keys添加文件路徑

#經過查找到input標籤,而後send進去
driver.find_element_by_id("coverImgSrc").send_keys(u"%s"%tds["coverImgSrc"])

 

************************************************************************************************

十4、調用javascript

當 webdriver 遇到無法完成的操做時,筆者能夠考慮借用 JavaScript 來完成。使用webdriver 提供的execute_script() 接口用來調用 js 代碼。好比要操做頁面上隱藏的元素,能夠用javascript來把它設置爲可見而後進行操做

好比下面這段代碼:

使用javascript:

複製代碼

……
#修改元素的屬性
js = 'document.querySelectorAll("select")[0].style.display="block";'
driver.execute_script(js)

sel = driver.find_element_by_tag_name('select')
Select(sel).select_by_value('opel')

************************************************************************************************

十5、控制瀏覽器滾動條

通常用到操做滾動條的會兩個場景:

  • 註冊時的法律條文的閱讀,判斷用戶是否閱讀完成的標準是:滾動條是否拉到最下方。
  • 要操做的頁面元素不在視覺範圍,沒法進行操做,須要拖動滾動條

用於標識滾動條位置的代碼:

<body onload= "document.body.scrollTop=0 ">
<body onload= "document.body.scrollTop=100000 ">

若是滾動條在最上方的話, scrollTop=0 , 那麼要想使用滾動條在最可下方, 能夠 scrollTop=100000 ,
這樣就可使滾動條在最下方。

#將頁面滾動條拖到底部
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
time.sleep(3)
#將滾動條移動到頁面的頂部
js1="var q=document.documentElement.scrollTop=0"
driver.execute_script(js1)
time.sleep(3)

************************************************************************************************

十6、獲取元素對象的屬性值

有時候咱們定位頁面上的元素髮現經常使用的id、name等屬性是相同的。這個時候咱們只能經過常規的定位方法定位出一組元素,而後觀察經過元素的屬性能夠定位出單個元素。可以使用.get_attribute()方法。

好比:

# 選擇頁面上全部的 tag name 爲 input 的元素
inputs = driver.find_elements_by_tag_name('input')
#而後循環遍歷出 屬性data-node值 爲594434493的元素,單擊勾選
for input in inputs:
if input.get_attribute('data-node') == '594434493':
input.click()
……

 

************************************************************************************************

 十7、獲取驗證碼問題

關於驗證碼的處理,網上有幾種說法:

一、測試時先去掉驗證碼

二、使用驗證碼識別技術

三、使用cookies記錄登陸用戶名密碼,下次自動登陸免去驗證碼輸入環節

咱們本身內部的處理方式是內部提供一個接口得到驗證碼,而後經過js代碼把獲取的驗證碼填寫進去:

#自動獲取驗證碼並填寫
        js="$.getJSON('http://xxx.xxx.com/util/getCode.jsonp?callback=?',function(data){$('.imgcode').val(data.code);})"
        driver.execute_script(js)
相關文章
相關標籤/搜索