前言
最近學習了測驗課程部分的自動化測驗,第一次發現這玩意挺有趣的,用 python 語言撰寫自動化腳本,竟然可以直接來操作瀏覽器,徹底解放雙手,這篇文章只是簡單的總結了操作 API 一些常用操作,還請大佬們勿噴!!!
介紹
selenium工具:自動化測驗工具,UI測驗工具,特點是輕量免費,支持多語言多平臺,支持分布式
webdriver:是 selenium2 提供的一種用于操作瀏覽器的 api 介面,要操作那個瀏覽器,就要把那個瀏覽器的版本驅動放到 python 的安裝路徑的 Scripts里
一個簡單腳本介紹
# coding = utf-8
from selenium import webdriver
import time
driver = webdriver.Firefox()
time.sleep(3)
driver.get("http://www.baidu.com")
time.sleep(3)
driver.find_element_by_id("kw").send_keys("周杰倫")
time.sleep(3)
driver.find_element_by_id("su").click()
driver.quit()
決議
- from selenium import webdriver
要想使用selenium 的 webdriver 里的函式,首先把包導進來 - driver = webdriver.Firefox()
我們需要操控哪個瀏覽器呢?Chrome ,當然也可以換成Ie 或Firefox,browser 可以隨便取,但后面要用它操縱各種函式執行, - driver .find_element_by_id(“kw”).send_keys(“selenium”)
一個控制元件有若干屬性id 、name、(也可以用其它方式定位),百度輸入框的 id 叫kw ,我要在輸入框里輸入 周杰倫, - driver .find_element_by_id(“su”).click()
搜索的按鈕的id 叫 su ,我需要點一下按鈕( click() ), - driver .quit()
退出并關閉視窗的每一個相關的驅動程式 - driver .close()
close方法關閉當前的瀏覽器視窗,quit方法不僅關閉視窗,還會徹底的退出webdriver,釋放與driver server之間的連接,所以簡單來說quit是更加徹底的close,quit會更好的釋放資源
1. 元素的定位
使用百度的搜索框包含的屬性資訊為例
<input id=“kw” class=“s_ipt” type=“text” maxlength=“100” name=“wd” autocomplete=“off”>
id 和name 定位
?? id 和 name 是我們最最常用的定位方式,因為大多數控制元件都有這兩個屬性,而且在對控制元件的id 和name 命名時一般使其有意義也會取不同的名字,通過這兩個屬性使我們找一個頁面上的屬性變得相當容易,
-
通過
find_element_by_id("kw")函式就是捕獲到百度輸入框 -
通過
find_element_by_name("wd")函式同樣也可以捕獲百度輸入框
class name 定位 和 tag name 定位
??class name 類名定位,如果類名不是唯一,或者修飾這個屬性的使用了多個類名,也定位不到,不建議使用,tag name 為定位標簽名的定位,比如input,h1,h2,a 等等,
- 通過
find_element_by_class_name("s_ipt")函式捕獲百度輸入框, - 通過
find_element_by_tag_name("s_ipt")
link text 定位
??定位鏈接,有時候不是一個輸入框也不是一個按鈕,而是一個文字鏈接,我們可以通過 link
find_element_by_link_text("視頻")
import time
from selenium import webdriver
drive = webdriver.Chrome()
drive.get("https://www.baidu.com/")
title = drive.title
drive.find_element_by_partial_link_text("視頻").click()
time.sleep(8)
drive.quit()
XPath 定位
??XPath 是一種在XML 檔案中定位元素的語言,因為HTML 可以看做XML 的一種實作,所以selenium 用戶可是使用這種強大語言在web 應用中定位元素,XPATH的獲取可以用chrome的F12開發者模式中Element-右鍵-copy-copy xpath來獲取,
find_element_by_xpath("")
import time
from selenium import webdriver
drive = webdriver.Chrome()
drive.get("https://www.baidu.com/")
# 定位搜索框輸入對應的key
drive.find_element_by_xpath("//*[@id='kw']").send_keys("馬龍")
# 定位"百度一下"這個框,并獲取點擊事件
drive.find_element_by_xpath("//*[@id='su']").click()
# 等待8秒
time.sleep(8)
drive.quit()
CSS 定位
??CSS是一種語言,它被用來描述HTML 和XML 檔案的表現,CSS 使用選擇器來為頁面元素系結屬性,這些選擇器可以被selenium 用作另外的定位策略,CSS 的比較靈活可以選擇控制元件的任意屬性,
find_element_by_css_selector("#kw"),通過find_element_by_css_selector( )函式,選擇取百度輸入框的 id 屬性來定義,CSS的獲取可以用chrome的F12開發者模式中Element-右鍵-copy-copy selector來獲取,
import time
from selenium import webdriver
drive = webdriver.Chrome()
drive.get("https://www.baidu.com/")
drive.find_element_by_css_selector("#kw").send_keys("馬龍")
drive.find_element_by_css_selector("#su").click()
time.sleep(8)
drive.quit()
2. 操作測驗物件
click點擊物件send_keys在物件上模擬按鍵輸入clear清除物件的內容,如果可以的話submit提交表單,text用于獲取元素的文本資訊
2. 添加等待
time.sleep() :固定等待
驅動變數.implicitly_wait():智能等待,implicitly_wait()的用法應該比time.sleep() 更智
能,后者只能選擇一個固定的時間的等待,前者可以在一個時間范圍內智能的等待,
3. 列印資訊
列印 tile 及 url
驅動變數.title
驅動變數.current_url
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
print driver.title # 把頁面title 列印出來
print driver.current_url #列印url
driver.quit()
4. 瀏覽器的操作
maximize_window():瀏覽器最大化set_window_size(480, 800):瀏覽器具體寬高back():瀏覽器回傳(后退)forward():瀏覽器前進- 用 js 控制瀏覽器滾動條
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
# 瀏覽器最大化
driver.maximize_window()
driver.find_element_by_id("kw").send_keys("張家齊")
driver.find_element_by_id("su").click()
# 瀏覽器長400px,寬1000px
time.sleep(3)
driver.set_window_size(400,1000)
time.sleep(3)
# js 實作瀏覽器滾動條到瀏覽器底端
js1 = "var q = document.documentElement.scrollTop=1000"
driver.execute_script(js1)
time.sleep(5)
# js 實作瀏覽器滾動條到瀏覽器頂端
js2 = "var q = document.documentElement.scrollTop=0"
driver.execute_script(js2)
time.sleep(5)
driver.quit()
5. 鍵盤事件
要想呼叫鍵盤按鍵操作需要引入 keys 包:
from selenium.webdriver.common.keys import Keys
通過send_keys()呼叫按鍵,例如:
send_keys(Keys.TAB) :呼叫 TAB 鍵
send_keys(Keys.ENTER) : 呼叫 回車 鍵
6. 滑鼠事件
要想呼叫滑鼠操作需要引入 ActionChains 包:
from selenium.webdriver.common.action_chains import ActionChains
例如表示滑鼠右鍵用法:ActionChains(驅動事件).context_click(定位到的元素).perform()
context_click()右擊double_click()雙擊drag_and_drop()拖動move_to_element()移動
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Chrome()
driver.get("http://news.baidu.com")
qqq =driver.find_element_by_xpath(".//*[@id='s_btn_wr']")
ActionChains(driver).context_click(qqq).perform() #右鍵
ActionChains(driver).double_click(qqq).perform() #雙擊
#定位元素的原位置
element = driver.find_element_by_id("s_btn_wr")
#定位元素要移動到的目標位置
target = driver.find_element_by_class_name("btn")
#執行元素的移動操作
ActionChains(driver).drag_and_drop(element, target).perform()
7. 定位一組元素
??webdriver 可以很方便的使用 findElement 方法來定位某個特定的物件,不過有時候我們卻需要定位一組物件,這時候就需要使用 findElements 方法,
用 python 語法,就是通過選取所有的 input 控制元件,根據它型別的不同,選出我們想要選擇的型別然后獲取點擊事件
from selenium import webdriver
import time
import os
dr = webdriver.Chrome()
file_path = 'file:///' + os.path.abspath('checkbox.html')
dr.get(file_path)
# 選擇頁面上所有的input,然后從中過濾出所有的checkbox 并勾選之
inputs = dr.find_elements_by_tag_name('input')
for input in inputs:
if input.get_attribute('type') == 'checkbox':
input.click()
time.sleep(2)
dr.quit()
注意:get_attribute:獲得屬性值,
8. 多層框架/視窗定位
多層框架或視窗的定位:
switch_to_frame()switch_to_window()
對于一個現代的web 應用,經常會出現框架(frame) 或視窗(window)的應用,這也就給我們的定位帶來了一個難題,
有時候我們定位一個元素,定位器沒有問題,但一直定位不了,這時候就要檢查這個元素是否在一個frame 中,seelnium webdriver 提供了一個switch_to_frame 方法,可以很輕松的來解決這個問題,
switch_to_frame(
nameoridorframe_element):
如果這個frame有name和id屬性那么就用這兩個屬性就好,如果沒有的話可以先用find_element_by_xxx方法找到這個frame元素,然后把這個元素傳進去,這也是可行的,
9. 下拉框處理
??下拉框是我們最常見的一種頁面元素,對于一般的元素,我們只需要一次就定位,但下拉框里的內容需要進行兩次定位,先定位到下拉框,再定位到下拉框內里的選項,
如圖所示,要選中下拉串列的第三個選項

代碼如下:
from selenium import webdriver
import time
import os
driver = webdriver.Chrome()
# 拼 url
url = "file:///" + os.path.abspath("E:\\編程學習\\代碼\\python\\Day1\\selenium2html\\drop_down.html")
driver.get(url)
driver.maximize_window()
time.sleep(3)
# 1.通過 tag name
options = driver.find_elements_by_tag_name("option")
for option in options:
if option.get_attribute('value') == "10.69":
option.click()
time.sleep(6)
# 2.通過 css selector
driver.find_element_by_css_selector("#ShippingMethod > option:nth-child(3)").click()
# 陣列的方式去定位,操作
options[2].click()
time.sleep(6)
driver.quit()
10. alert、confirm、prompt 的處理
- text 回傳alert/confirm/prompt 中的文字資訊
- accept 點擊確認按鈕
- dismiss 點擊取消按鈕,如果有的話
- send_keys 輸入值,這個alert\confirm 沒有對話框就不能用了,不然會報錯
未完待續…
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/293613.html
標籤:python
上一篇:conda環境打包遷移及部署
