************************************************************************************************javascript
有時間須要經過頁面的title和url去判斷頁面的狀態。好比測試登陸是否成功和重定向是否成功。css
#得到前面 title,打印 title = driver.title print title #得到前面 URL,打印 now_url = driver.current_url print now_url
************************************************************************************************java
有時候爲了保證腳本運行的穩定性,須要腳本中添加等待時間。node
設置等待時間有如下幾種方法:python
一、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),參數解釋以下:
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。
************************************************************************************************
須要獲取頁面上的一組元素是的方法:
#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()
************************************************************************************************
在實際的項目測試中,常常會有這樣的需求:頁面上有不少個屬性基本相同的元素 ,如今須要具體
定位到其中的一個。因爲屬性基本至關,因此在定位的時候會有些麻煩,這時候就須要用到層級定位。先
定位父元素,而後再經過父元素定位子孫元素。
好比下拉列表,咱們能夠先點擊彈出下拉框而後再定位下拉列表中的選項
#點擊 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')
************************************************************************************************
在 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().
************************************************************************************************
一、相關方法
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)
************************************************************************************************
處理javascript所生成的alert、confirm、prompt,可使用switch_to_alert()方法定位到alert/confirm/prompt,而後使用text/accept/dismiss/send_keys等方法進行操做
************************************************************************************************
一、查找到input標籤,經過send_keys添加文件路徑
#經過查找到input標籤,而後send進去 driver.find_element_by_id("coverImgSrc").send_keys(u"%s"%tds["coverImgSrc"])
************************************************************************************************
當 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')
************************************************************************************************
通常用到操做滾動條的會兩個場景:
用於標識滾動條位置的代碼:
<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)
************************************************************************************************
有時候咱們定位頁面上的元素髮現經常使用的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() ……
************************************************************************************************
關於驗證碼的處理,網上有幾種說法:
一、測試時先去掉驗證碼
二、使用驗證碼識別技術
三、使用cookies記錄登陸用戶名密碼,下次自動登陸免去驗證碼輸入環節
咱們本身內部的處理方式是內部提供一個接口得到驗證碼,而後經過js代碼把獲取的驗證碼填寫進去:
#自動獲取驗證碼並填寫 js="$.getJSON('http://xxx.xxx.com/util/getCode.jsonp?callback=?',function(data){$('.imgcode').val(data.code);})" driver.execute_script(js)