python3+selenium3.13的簡單操做

1.瀏覽器javascript

  1.1 瀏覽器窗口大小位置css

 driver.set_window_size(self, width, height, windowHandle) 將某個窗口設置爲固定大小html

 driver.set_window_position(self, x, y, windowHandle) 將某個窗口移動到指定的位置前端

 driver.set_window_rect(self, x, y, width, height, windowHandle) 將某個窗口設置爲固定的大小移動到指定的位置java

 driver.maximize_window() 窗口最大化python

   driver.minimize_window() 窗口最小化web

from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
driver.set_window_size(480, 800)
driver.set_window_rect(300, 300, 480, 800)
driver.set_window_position(300, 300)
driver.maximize_window()
driver.minimize_window()

  1.2 控制瀏覽器的後退、前進ajax

   driver.back()windows

   driver.forward()瀏覽器

from selenium import webdriver
import time
driver = webdriver.Firefox()
f_url = "https://www.baidu.com"
s_url = "https://news.baidu.com"
driver.get(f_url)
time.sleep(1)
driver.get(s_url)
time.sleep(1)
driver.back()
assert f_url in driver.current_url, "current url not first url"
print(driver.current_url)
time.sleep(1)
driver.forward()
assert s_url in driver.current_url, "current url not second url"
print(driver.current_url)
driver.close()

  1.3 模擬瀏覽器刷新

   driver.refresh()

2.元素操做

  clear  清除文本

  send_keys(value)  模擬按鍵輸入

  click()  單擊

  submit()  提交表單,如搜索框輸入內容後的回車操做,就能夠經過submit()方法模擬

  size  返回元素的尺寸

  text  獲取元素的文本

  get_attribute(name)  得到屬性值

  is_displayed()  返回該元素是否可見,布爾類型

from selenium import webdriver
import time
driver = webdriver.Firefox()
f_url = "https://www.baidu.com"
driver.get(f_url)
driver.find_element_by_id("kw").send_keys("hello")
print(driver.find_element_by_id("cp").text)
driver.find_element_by_id("kw").clear()
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("kw").submit()
print(size)
print(driver.find_element_by_id("kw").get_attribute("name"))
print(driver.find_element_by_id("kw").is_displayed())
driver.close()

 

 

3.鼠標事件

  perform()  執行全部ActionChains中存儲的行爲

  context_click()  右擊

  double_click()  雙擊

  drag_and_drop()  拖動

  move_to_element()  鼠標懸停

  右擊沒有實現
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Firefox()
f_url = "https://www.baidu.com"
driver.get(f_url)
driver.find_element_by_link_text("地圖").click()
driver.find_element_by_xpath("//span[@class='success']").click()
nowPos = driver.find_element_by_xpath("//*[@class=\"normal\"][1]")
ActionChains(driver).context_click(nowPos).perform()
time.sleep(1)
try:
driver.find_element_by_xpath("//span[@id=\"cmitem_start\"]").click()
except Exception as e:
print("not found")

time.sleep(1)
driver.close()

  鼠標懸停

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Firefox()
f_url = "https://www.baidu.com"
driver.get(f_url)
bdMore = driver.find_element_by_link_text("設置")
ActionChains(driver).move_to_element(bdMore).perform()
driver.find_element_by_link_text("搜索歷史").click()
time.sleep(2)
driver.close()
  鼠標雙擊
沒有找到適用的場景,沒有嘗試
element = driver.find_element_by_link_text("xx")
ActionChains(driver).double_click(element).perform()

  鼠標拖放
沒有找到適用的場景,沒有嘗試
e1 = driver.find_element_by_xpath("") #源位置
e2 = driver.find_element_by_xpath("") #目標位置
ActionChains(driver).drag_and_drop(e1, e2).perform()  #執行拖放
  
 

4.鍵盤事件 

  sendkeys能夠模擬鍵盤輸入,也能夠用來模擬鍵盤上的按鍵,甚至是組合鍵

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep,ctime
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
el = driver.find_element(By.ID, "kw")
el.send_keys("seleniumm")
el.send_keys(Keys.BACK_SPACE)
el.send_keys(Keys.SPACE)
el.send_keys("教程")
el.send_keys(Keys.CONTROL, 'a')
el.send_keys(Keys.CONTROL, 'x')
el.send_keys(Keys.CONTROL, 'v')
el.send_keys(Keys.ENTER)
driver.close()


send_keys(Keys.BACK_SPACE) 刪除鍵BackSpace
send_keys(Keys.SPACE) 空格鍵Space
send_keys(Keys.TAB) 製表鍵Tab
send_keys(Keys.ESPACE) 回退鍵Esc
send_keys(Keys.ENTER) 回車鍵Enter
send_keys(Keys.CONTROL,'a') 全選Ctrl+A
send_keys(Keys.CONTROL,'c') 複製CTRL+C
send_keys(Keys.CONTROL,'x') 剪切CTRL+X
send_keys(Keys.CONTROL,'v') 粘貼Ctrl+V
send_keys(Keys.F1) 鍵盤F1
send_keys(Keys.F12) 鍵盤F12  

 

 

 

 

 

 

 

 

 

問題:若是遇到如下錯誤,是沒有導入Keys致使的
from selenium.webdriver.common.keys import Keys

5.得到驗證信息

  title  獲取頁面標題 

  current_url   當前的URL

  text   獲取標籤對之間的文本信息

driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
print(driver.title)
print(driver.current_url)
driver.close()

6.設置等待

  6.1 顯式等待

  顯示等待使web driver等待某個條件成立時繼續執行,不然跑出超時異常TimeoutException。WebDriverWait類是WebDriver提供的等待方法。在設置時間內,默認每隔一段時間檢測一次當前頁面元素是否存在,若是超過設置時間檢測不到就拋出異常。

  WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

  driver:瀏覽器驅動

  timeout:最長超時時間,默認以秒爲單位

  poll_frequency:檢測的間隔時間,默認0.5秒

  ignored_exceptions:超時後的異常信息,默認拋NoSuchElementException異常

  WebDriverWait通常由until()或until_not()方法配合使用

  until(method, message='') 調用該方法提供的驅動程序做爲一個參數,直到返回值爲true

  until_not(method, message='') 調用該方法提供的驅動程序做爲一個參數,直到返回值爲false

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep,ctime
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC #將expected_condtions重命名爲EC
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
el = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, "kw")))#將EC方法做爲參數傳入
el.send_keys('selenium')
driver.close()
expected_conditions類提供的預期條件判斷方法:
title_is 判斷當前頁面的標題是否等於預期
title_contains 判斷當前頁面的標題是否包含預期字符串
presence_of_element_located 判斷元素是否被加在DOM樹裏,並不表明該元素必定可見
visibility_of_element_located 判斷元素可見(元素非隱藏,且元素寬和高都不等於0)
visibility_of 與上一個方法相同,只是上一個方法參數爲定位;該方法接收的參數爲定位後的元素
presenece_of_all_elements_located 判斷是否至少有一個元素存在於DOM樹中。例如,在百度首頁有n個元素的class爲mnav,那麼只要有一個存在,就返回true
text_to_be_present_in_element 判斷某個元素的text是否包含了預期的字符串
text_to_be_present_in_element_value 判斷某個元素的value屬性是否包含了預期的字符串
frame_to_be_available_and_switch_to_it 判斷該表單是否能夠切換進去,若是能夠,返回true而且switch進去,不然返回false
invisibility_of_element_located 判斷某個元素是否不存在與DOM樹或不可見
invisibility_to_be_clickable 判斷元素是否可見且能夠點擊
staleness_of 等到一個元素從DOM樹中移除
element_to_be_selected 判斷某個元素是否被選中,通常用在下拉列表
element_selection_state_to_be 判斷某個元素的選中狀態是否符合預期
element_located_selection_state_to_be 與上一個方法做用相同,只是上一個方法參數爲定位後的元素,該方法接收的參數爲定位
alert_is_present 判斷頁面上是否存在alert





 

 

 

 

 

 

 

 

 

  6.2 隱式等待

  隱式等待是經過必定的時長等待頁面上某元素加載完成。若是超出了設置的時長元素尚未被加載,則拋出NoSuchElementException異常。Web Driver提供了implictly_wait()方法來實現隱式等待,默認設置爲0.

implicitly_wait(seconds)

from selenium import webdriver
from time import ctime
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.implicitly_wait(10) #設置隱式等待時間爲10秒
try:
print(ctime())
driver.find_element_by_id("kw22").send_keys("selenium")
except Exception as e:
print(e)
finally:
print(ctime())
driver.close()

  6.3 休眠 time.sleep(seconds)

7.定位一組元素

  定位一組元素與定位單個元素方法相似,惟一的區別是在element爲複數。

  定位一組元素的場景:

    1.批量操做元素,例如勾選頁面上的全部的複選框

    2.先獲取一組元素,再從這組對象中過濾出須要操做的元素。例如定位出頁面上全部的checkbox,而後選擇其中的一個進行操做。

driver.find_element_by_id()
driver.find_elements_by_id()
driver.find_element_by_class_name()
driver.find_elements_by_class_name()
driver.find_element_by_name()
driver.find_elements_by_name()
driver.find_element_by_link_text()
driver.find_elements_by_link_text()
driver.find_element_by_partial_link_text()
driver.find_elements_by_partial_link_text()
driver.find_element_by_tag_name()
driver.find_elements_by_tag_name()
driver.find_element_by_xpath()
driver.find_elements_by_xpath()
driver.find_element_by_css_selector()
driver.find_elements_by_css_selector()

 

 

 

 

 

 

 

 

 

 

 

  操做複選框 len()計算元素的個數 pop()用來取消勾選

  pop() pop(-1)默認獲取最後一個

  pop(index) 獲取下標爲index的元素

例子:該頁面的選擇框爲單選,選擇後再次點擊不能取消選擇。

 

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep,ctime
driver = webdriver.Firefox()
driver.get("https://www.12321.cn/web")
styleN = driver.find_elements_by_class_name("bllxCheck")
print(len(styleN)) #打印長度4
for i in styleN:
i.click()
sleep(1)
styleN.pop(2).click() #選擇第3個選框
driver.close()

8.多表單切換

存在多個iframe時,能夠經過獲取1組元素再進行操做,操做完必定要返回上一層。

from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://sahitest.com/demo/iframesTest.htm")
ifrN = driver.find_elements_by_css_selector("iframe")
for i in ifrN:
driver.switch_to.frame(i)
driver.find_element_by_css_selector("a[href=\"linkTest.htm\"]").click()
time.sleep(1)
driver.switch_to.parent_frame()
driver.close()

9.多窗口切換

  在頁面操做過程當中,若是彈出新的窗口,此時須要切換到新打開的窗口進行操做。不然driver依然停留在原來的頁面,針對新窗口的操做會出現錯誤。

  設計的方法:獲取全部句柄(window_handles)、當前窗口句柄(current_window_handle)、切換到相應到窗口(switch_to_handle(句柄))

from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://baidu.com")
search_window = driver.current_window_handle
driver.find_element_by_css_selector("div[id='u1']>a[name='tj_login']").click()
time.sleep(1)
driver.find_element_by_link_text("當即註冊").click()
time.sleep(1)
all_handle = driver.window_handles
for handle in all_handle:
print(handle)
if handle != search_window:
print("not search window")
if handle == search_window:
print("search window")
driver.quit()

 

10.警告框處理

警告框有3種,依次爲alert、confirm、prompt。操做有accept(),dismiss(),send_keys(value)

from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://sahitest.com/demo/alertTest.htm")
driver.find_element_by_name("t1").send_keys("alert test")
alert_button = driver.find_elements_by_css_selector("input[type=\"button\"]")
print(len(alert_button))
for al in alert_button:
al.click()
time.sleep(1)
driver.switch_to.alert.accept()
time.sleep(1)
driver.quit()

from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://sahitest.com/demo/confirmTest.htm")
driver.find_element_by_name("b1").click()
time.sleep(1)
driver.switch_to.alert.dismiss()
time.sleep(1)
driver.find_element_by_name("b1").click()
time.sleep(1)
driver.switch_to.alert.accept()
time.sleep(1)
driver.quit()

from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://sahitest.com/demo/promptTest.htm")
driver.find_element_by_name("b1").click()
driver.switch_to.alert.send_keys("hello world")
driver.switch_to.alert.dismiss()
driver.find_element_by_name("b1").click()
driver.switch_to.alert.send_keys("hello world")
driver.switch_to.alert.accept()
driver.quit()

10.上傳文件 

  通常web頁面上傳須要打開本地的window窗口,而webdriver是不能操做windows控件的。

  對於web頁面的上傳功能實現通常有如下2中方式:

  普通上傳:普通的附件上傳是將本地文件的路徑做爲一個值放在input標籤中,經過form表單將這個值提交給服務器

  插件上傳:通常是基於flash、JavaScript、ajax等技術所實現的上傳功能

  1.send_keys實現上傳

  沒有找到合適的網站使用send_keys上傳

  2.沒有找到適合mac的插件上傳文件

  此處等待往後補充

  

11.下載文件

  下載文件對照表http://tool.oschina.net/commons

13. 操做cookie

  有時須要驗證cookie是否正確,由於基於真是cookie的測試是沒法經過白盒和集成測試進行的。

  cookie的使用場景:開發人員開發一個功能,當用戶登錄後,會將用戶的用戶名寫入瀏覽器cookie,指定的key爲username,咱們就能夠經過username找到對應的value。若是找不到username或value,就說明cookie沒有成功的保存到瀏覽器。

  get_cookies()  得到全部cookie信息

  get_cookie(name)  返回字典key爲name的cookie信息

  add_cookie(cookie_dict) 此處的dict注意格式,name、value要分別指定 

  delete_cookie(name,optionsString)

  delete_all_cookies()

from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
print(driver.get_cookies())
driver.add_cookie({'name': 'money', 'value': 'shield'})
print(driver.get_cookie('money'))
#print(driver.get_cookie('team2'))
driver.delete_cookie('money')
driver.delete_all_cookies()
driver.close()

14.調用javascript
雖然web driver提供了操做瀏覽器的前進和後退方法,但對於瀏覽器滾動條並無提供相應的操做方法。在這種狀況下,須要藉助JavaScript來控制瀏覽器的滾動。web driver提供了execute_script()的方法來執行JavaScript代碼。
  1.調整瀏覽器滾動條
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
driver.set_window_size(600, 600)
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
time.sleep(2)
js = "window.scrollTo(100,450)"
driver.execute_script(js)
time.sleep(3)
driver.close()

  2.向富文本框輸如內容
向頁面中的textarea輸入內容。文本框的前端代碼:
<textarea id="id" style="width:98%" cols="50' rows="5" class="textarea" />
text = "input text"
js = "var sum=document.getElementByOd('id'); sum.value='" + text + "';"
driver.executes_script(js)
沒有找到合適的場景,沒有測試
15.處理HTML的視頻播放
https://v.autohome.com.cn/v-1930327.html#pvareaid=3311300

return arguments[0].currentSrc; 獲取視頻文件的網絡存儲地址
return arguments[0].duration;獲取視頻時長
return arguments[0].play();播放視頻
return arguments[0].pause();暫停視頻
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("https://v.autohome.com.cn/v-1930327.html#pvareaid=3311300")
print("video title:", driver.find_element_by_css_selector("div>h1").text)
video = driver.find_element_by_css_selector("video")
print('pause')
driver.execute_script("return arguments[0].pause();", video)
time.sleep(2)
url = driver.execute_script("return arguments[0].currentSrc;", video)
print("video times:", driver.execute_script("return arguments[0].duration;", video))
print("video url:", url)
print('play')
driver.execute_script("return arguments[0].play()", video)
time.sleep(2)
driver.close()

16.窗口截圖
get_screenshot_as_file("路徑") 將截圖保存爲文件
get_screenshot_as_png() 這個是獲取屏幕截圖,保存的是二進制數據,不多用到

 get_screenshot_as_base64()

這個方法也是獲取屏幕截圖,保存的是base64的編碼格式,在HTML界面輸出截圖的時候,會用到。

好比,想把截圖放到html測試報告裏。
driver.get_screenshot_as_base64()

river = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
actureText = driver.find_element_by_css_selector("span.nums_text").text
expectText = "百度爲您找到相關結果約"
print(actureText)
assert expectText in actureText, "結果未找到"
driver.get_screenshot_as_file("/Users/chenshanju/Desktop/test.png")
driver.get_screenshot_as_png()
time.sleep(2)
driver.close()

17.關閉窗口
driver.close()  關閉當前窗口
driver.quit()  退出瀏覽器

18.驗證碼的處理
  
18.1 去掉驗證碼
只要把驗證碼的相關代碼註釋掉便可。若是測試環境,會很方便;若是線上環境,風險很高。
18.2 設置萬能驗證碼
在程序中留一個後門,設置一個萬能驗證碼。只要用戶輸入萬能驗證碼,程序就認爲驗證經過,不然就判斷用戶輸入的驗證碼是否正確。
from random import randint
verify = randint(1000, 9999)
number = int(input("input a number:"))
if number == verify :
print("login success")
elif number == 123456 : #設置萬能驗證碼
print("login success")
else:
print("uncorrect verify")

18.3 驗證碼識別技術
能夠經過python-tesseract來識別圖片驗證碼。不過,驗證碼形式繁多,大多驗證碼識別技術,識別率很難達到100%

18.4 記錄cookie
driver.get("http://www.test.com")driver.add_cookie({'name': 'Login_UserNumber', 'value': 'username'})driver.add_cookie({'name': 'Login_password', 'value': 'password'})driver.get("http://www.test.com")
相關文章
相關標籤/搜索