1 webwebdriver API
1.1 元素的定位
對象的定位應該是自動化測試的核心,要想操作一個對象,首先應該識別這個對象,一個對象有很多的屬性,我們可以通過這些屬性找到對象。
注意:不管用那種方式,必須保證頁面上該屬性的唯一性
webdriver 提供了一系列的對象定位方法,常用的有以下幾種
- id
- name
- class name
- link text
- partial link text
- tag name
- xpath
- css selector
我們可以看到,一個百度的輸入框,可以用這么多種方式去定位
<input id="kw" class="s_ipt" type="text" maxlength="100" name="wd"
autocomplete="off">
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
#########百度輸入框的定位方式##########
#通過id 方式定位
browser.find_element(By.ID,"kw").send_keys("selenium")
#通過name 方式定位
browser.find_element(By.NAME,"wd").send_keys("selenium")
#通過tag name 方式定位
browser.find_element(By.TAG_NAME,"input").send_keys("selenium")
# 不能成功,因為input太多了不唯一。
#通過class name 方式定位
browser.find_element(By.CLASS_NAME,"s_ipt").send_keys("selenium")
#通過CSS 方式定位
browser.find_element(By.CSS_SELECTOR,"#kw").send_keys("selenium")
#通過xphan 方式定位
browser.find_element(By.XPATH,"http://*[@id='kw']").send_keys("selenium")
############################################
browser.find_element(By.ID,"su").click()
time.sleep(3)
browser.quit()
注意:使用find_element方法時需要導入selenium.webdriver.common.by包
- id 定位
id是頁面元素的屬性,我們最常用元素定位方式,但是不是所有的元素都有id的。如果一個元素有id屬性,那么一般在整個頁面是唯一的。所以我們一般可以用id來唯一的定位到這個元素
通過前端工具,例如Chrome瀏覽器的F12,找到了百度輸入框的屬性信息,如下:
<input id="kw" class="s_ipt" type="text" maxlength="100" name="wd"
autocomplete="off">
屬性 id=”kw”
通過find_element(By.ID,“kw”) 函數(shù)就可以定位到百度輸入框
- name 定位
如果這個元素有name,并且元素的name命名在整個頁面是唯一的,那么我們可以用name來定位這個元素。
用上面百度輸入框的例子,其中元素的屬性name=”wd”
通過find_element(By.NAME,“wd”)函數(shù)同樣也可以定位到百度輸入框
- tag name 定位和class name 定位
從上面的百度輸入框的屬性信息中,我們看到,不單單只有id 和name 兩個屬性, 比如class 和tagname(標簽名)
input 就是一個標簽的名字,可以通過find_element(By.TAG_NAME,“input”)函數(shù)來定位。
class=“s_ipt”,通過find_element(By.CLASS_NAME,“s_ipt”)函數(shù)定位百度輸入框。
在這里要注意的是,不是所有的元素用 tag name或者 class name來定位元素,首先要保證該元素的這兩種屬性在頁面上是唯一的,才能夠準確的定位
- CSS 定位
CSS(Cascading Style Sheets)是一種語言,它被用來描述HTML 和XML 文檔的表現(xiàn)。
CSS 使用選擇器來為頁面元素綁定屬性。這些選擇器可以被selenium 用作另外的定位策略
CSS 的比較靈活可以選擇控件的任意屬性,上面的例子中:
find_element(By.CSS_SELECTOR,“#kw”)
通過find_element(By.CSS_SELECTOR," ")函數(shù),選擇取百度輸入框的id 屬性來定義
CSS的獲取可以用chrome的F12開發(fā)者模式中Element-右鍵-copy-copy selector來獲取
- XPath 定位
XPath 是一種在XML 文檔中定位元素的語言。因為HTML 可以看做XML 的一種實現(xiàn),所以selenium 用戶可是使用這種強大語言在web 應用中定位元素。
XPath 擴展了上面id 和name 定位方式,提供了很多種可能性。
XPATH的獲取可以用chrome的F12開發(fā)者模式中Element-右鍵-copy-copy xpath來獲取
- link text 定位
有時候不是一個輸入框也不是一個按鈕,而是一個文字鏈接,我們可以通過鏈接內(nèi)容,也就是 link text來定位。
需要注意的是鏈接內(nèi)容必須為這個頁面唯一,否則會報錯。
#coding=utf-8
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
browser.find_element(LINK_TEXT,"hao123").click()
browser.quit()
1.2 操作測試對象
前面講到了不少知識都是定位元素,定位只是第一步,定位之后需要對這個元素進行操作。是鼠標點擊還是鍵盤輸入,或者清除元素的內(nèi)容,或者提交表單等。這個取決于定位元素需要進行的下一步操作。
webdriver 中比較常用的操作對象的方法有下面幾個:
- click 點擊對象
- send_keys 在對象上模擬按鍵輸入
- clear 清除對象輸入的文本內(nèi)容
- submit 提交
- text 用于獲取元素的文本信息
- 鼠標點擊和鍵盤輸入
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(2)
driver.find_element(By.ID,"kw").send_keys("test")
time.sleep(2)
driver.find_element(By.ID,"kw").clear()
driver.find_element(By.ID,"kw").send_keys("selenium")
time.sleep(2)
#通過submit() 來操作
driver.find_element(By.ID,"su").submit()
time.sleep(3)
driver.quit()
send_keys(“xx”) 用于在一個輸入框里輸入xx 內(nèi)容。
click() 用于點擊一個按鈕。
clear() 用于清除輸入框的內(nèi)容,比如百度輸入框里默認有個“請輸入關(guān)鍵字”的信息,再比如我們的登陸框一般默認會有“賬號”“密碼”這樣的默認信息。clear 可以幫助我們清除這些信息。
- submit 提交表單
打開百度搜索頁面,按鈕“百度一下”元素的類型type=“submit”,所以把“百度一下”的操作從click 換成submit 可以達到相同的效果:
driver.find_element(By.ID,"su").submit()
- text 獲取元素文本
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(2)
#id = cp 元素的文本信息
data=driver.find_element(By.ID,"bottom_layer").text
print (data) #打印信息
time.sleep(3)
driver.quit()
輸出:
關(guān)于百度About Baidu使用百度前必讀幫助中心企業(yè)推廣京公網(wǎng)安備11000002000001號京ICP證030173號信息網(wǎng)絡(luò)傳播視聽節(jié)目許可證 0110516
1.3 添加等待
- sleep休眠
添加休眠非常簡單,我們需要引入time 包,就可以在腳本中自由的添加休眠時間了,這里的休眠指固定休眠
import time
time.sleep(3)
- 隱式等待
通過添加implicitly_wait() 方法就可以方便的實現(xiàn)智能等待;implicitly_wait(30)的用法比time.sleep()更智能,后者只能選擇一個固定的時間的等待,前者可以在一個時間范圍內(nèi)智能的等待。
selenium.webdriver.remote.webdriver.implicitly_wait(time_to_wait)
time_to_wait 設(shè)置的等待時長。
隱式地等待并非一個固定的等待時間,當腳本執(zhí)行到某個元素定位時,如果元素可以定位,則繼續(xù)執(zhí)行;如果元素定位不到,則它以輪詢的方式不斷的判斷元素是否被定位到。直到超出設(shè)置的時長
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
browser.implicitly_wait(30) #隱式等待30秒
browser.find_element(By.ID,"kw").send_keys("selenium")
browser.find_element(By.ID,"su").click()
browser.quit()
1.4 打印信息
- 打印title
#coding = utf-8
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
print(driver.title) # 把頁面title 打印出來
- 打印url
#coding = utf-8
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
print(driver.current_url) #打印url
1.5 瀏覽器的操作
-
瀏覽器最大化
我們知道調(diào)用啟動的瀏覽器不是全屏的,這樣不會影響腳本的執(zhí)行,但是有時候會影響我們“觀看”腳本的執(zhí)行。
browser.maximize_window()
- 設(shè)置瀏覽器寬、高
browser.set_window_size(width, high)
- 操作瀏覽器的前進、后退
#瀏覽器的前進
browser.forward()
#瀏覽器的后退
browser.back()
示例:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
browser = webdriver.Chrome()
#訪問百度首頁
first_url= 'http://www.baidu.com'
print("now access %s" %(first_url))
browser.get(first_url)
time.sleep(2)
#訪問新聞頁面
second_url='http://news.baidu.com'
print("now access %s" %(second_url))
browser.get(second_url)
time.sleep(2)
#返回(后退)到百度首頁
print("back to %s "%(first_url))
browser.back()
time.sleep(1)
#前進到新聞頁
print("forward to %s"%(second_url))
browser.forward()
time.sleep(2)
browser.quit()
-
控制瀏覽器滾動條
瀏覽器滾動條的控制需要依靠js腳本
#將瀏覽器滾動條滑到最頂端
document.documentElement.scrollTop=0
#將瀏覽器滾動條滑到最底端
document.documentElement.scrollTop=10000
#將瀏覽器滾動條滑到最底端, 示例
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
其中,execute_script(script, *args),在當前窗口/框架同步執(zhí)行javaScript
1.6 鍵盤事件
- 鍵盤按鍵用法
要使用鍵盤按鍵,必須引入keys 包:
from selenium.webdriver.common.keys import Keys
通過send_keys()調(diào)用按鍵:
send_keys(Keys.TAB) # TAB
send_keys(Keys.ENTER) # 回車
send_keys(Keys.SPACE) #空格鍵
send_keys(Keys.ESCAPE) #回退鍵(Esc)
示例:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get("http://demo.zentao.net/user-login-Lw==.html")
time.sleep(3)
driver.maximize_window() # 瀏覽器全屏顯示
driver.find_element(By.ID,"account").clear()
time.sleep(3)
driver.find_element(By.ID,"account").send_keys("demo")
time.sleep(3)
#tab 的定位相當于清除了密碼框的默認提示信息,等同上面的clear()
driver.find_element(By.ID,"account").send_keys(Keys.TAB)
time.sleep(3)
#通過定位密碼框,enter(回車)來代替登陸按鈕
driver.find_element(By.NAME,"password").send_keys(Keys.ENTER)
time.sleep(3)
driver.quit()
- 鍵盤組合鍵用法
send_keys(Keys.CONTROL,‘a(chǎn)’) #全選(Ctrl+A)
send_keys(Keys.CONTROL,‘c’) #復制(Ctrl+C)
send_keys(Keys.CONTROL,‘x’) #剪貼(Ctrl+X)
send_keys(Keys.CONTROL,‘v’) #粘貼(Ctrl+V)
示例:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#輸入框輸入內(nèi)容
driver.find_element(By.ID,"kw").send_keys("selenium")
time.sleep(3)
#ctrl+a 全選輸入框內(nèi)容
driver.find_element(By.ID,"kw").send_keys(Keys.CONTROL,'a')
time.sleep(3)
#ctrl+x 剪切輸入框內(nèi)容
driver.find_element(By.ID,"kw").send_keys(Keys.CONTROL,'x')
time.sleep(3)
#輸入框重新輸入內(nèi)容,搜索
driver.find_element(By.ID,"kw").send_keys("webdriver")
driver.find_element(By.ID,"su").click()
time.sleep(3)
driver.quit()
1.7 鼠標事件
要使用鼠標事件需要導入工具包:
from selenium.webdriver.common.action_chains import ActionChains
#鼠標拖動事件
ActionChains(driver).move_to_element(element).perform()
ActionChains(driver):生成用戶的行為。所有的行動都存儲在actionchains 對象。通過perform()存儲的行為。
move_to_element(element):移動鼠標到一個元素中,menu 上面已經(jīng)定義了他所指向的哪一個元素
perform():執(zhí)行所有存儲的行為
ActionChains 類
- context_click() 右擊
- double_click() 雙擊
- drag_and_drop() 拖動
- move_to_element() 移動
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.common.action_chains import ActionChains
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")
#執(zhí)行元素的移動操作
ActionChains(driver).drag_and_drop(element, target).perform()
1.8 定位一組元素
webdriver 可以很方便的使用findElement 方法來定位某個特定的對象,不過有時候我們卻需要定位一組對象,這時候就需要使用findElements 方法。
定位一組對象一般用于以下場景:
- 批量操作對象,比如將頁面上所有的checkbox 都勾上
- 先獲取一組對象,再在這組對象中過濾出需要具體定位的一些對象。比如定位出頁面上所有的checkbox,然后選擇最后一個
#coding=utf-8
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()
1.8 多層框架的定位
switch_to.frame(name/id/frame_element):通過frame的id或者name或者frame自帶的其它屬性來定位框架,這里switch_to.frame()把當前定位的主體切換了frame里。
switch_to.default_content:從frame中嵌入的頁面里跳出,跳回到最外面的默認頁面中。
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import os
browser = webdriver.Chrome()
file_path = 'file:///' + os.path.abspath('frame.html')
browser.get(file_path)
browser.implicitly_wait(30)
#先找到到ifrome1(id = f1)
browser.switch_to.frame("f1")
#再找到其下面的ifrome2(id =f2)
browser.switch_to.frame("f2")
#下面就可以正常的操作元素了
browser.find_element(By.ID,"kw").send_keys("selenium")
browser.find_element(By.ID,"su").click()
time.sleep(3)
browser.quit()
1.8 多層窗口的定位
有可能嵌套的不是框架,而是窗口,還有針對窗口的方法:switch_to.window
用法與switch_to.frame 相同:
driver.switch_to.window(“windowName”)
1.9 層級定位
有時候我們需要定位的元素沒有直接在頁面展示,而是需要對頁面的元素經(jīng)過一系列操作之后才展示出來,這個時候我們就需要一層層去定位
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import os
dr = webdriver.Chrome()
file_path = 'file:///' + os.path.abspath('level_locate.html')
dr.get(file_path)
#點擊Link1鏈接(彈出下拉列表)
dr.find_element(By.LINK_TEXT,'Link1').click()
#在父親元件下找到link 為Action 的子元素
menu = dr.find_element(By.ID,'dropdown1').find_element(By.LINK_TEXT,'Action')
#鼠標定位到子元素上
webdriver.ActionChains(dr).move_to_element(menu).perform()
time.sleep(2)
dr.quit()
1.10 下拉框處理
下拉框是我們最常見的一種頁面元素,對于一般的元素,我們只需要一次就定位,但下拉框里的內(nèi)容需要進行兩次定位,先定位到下拉框?qū)ο吕蜻M行操作后,再定位到下拉框內(nèi)里的選項。
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import os
driver= webdriver.Chrome()
file_path = 'file:///' + os.path.abspath('drop_down.html')
driver.get(file_path)
time.sleep(2)
#先定位到下拉框
m=driver.find_element(By.ID,"ShippingMethod")
#再點擊下拉框下的選項
m.find_element(By.XPATH,"http://option[@value='10.69']").click()
time.sleep(3)
driver.quit()
1.11 alert、confirm、prompt 的處理
- text 返回alert/confirm/prompt 中的文字信息
- accept 點擊確認按鈕
- dismiss 點擊取消按鈕,如果有的話
- send_keys 輸入值,如果alert 沒有對話框就不能用了,不然會報錯
注意:switch_to.alert()只能處理原生的alert
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import os
import selenium.webdriver.support.ui as ui
dr = webdriver.Chrome()
file_path = 'file:///' + os.path.abspath('alert.html')
dr.get(file_path)
# 點擊鏈接彈出alert
dr.find_element(By.ID,'tooltip').click()
time.sleep(2)
alert = dr.switch_to.alert()
alert.accept()
time.sleep(2)
dr.quit()
1.12 DIV對話框的處理
如果頁面元素比較多,利用元素的屬性無法準確的定位這個元素的時候,我們可以先定位元素所在的div塊,再去定位這個元素。
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import os
import selenium.webdriver.support.ui as ui
dr = webdriver.Chrome()
file_path = 'file:///' + os.path.abspath('modal.html')
dr.get(file_path)
# 打開對話框
dr.find_element(By.ID,'show_modal').click()
time.sleep(3)
# 點擊對話框中的鏈接
link = dr.find_element(By.ID,'myModal').find_element(By.ID,'click')
link.click()
#dr.execute_script('$(arguments[0]).click()', link)
time.sleep(4)
# 關(guān)閉對話框
buttons =dr.find_element(By.CLASS_NAME,'modalfooter').find_elements(By.TAG_NAME,'button')
buttons[0].click()
time.sleep(2)
dr.quit()
#接受警告信息
alert = dr.switch_to.alert()
alert.accept()
#得到文本信息打印
alert = dr.switch_to.alert()
print alert.text
#取消對話框(如果有的話)
alert = dr.switch_to.alert()
alert.dismiss()
#輸入值
alert = dr.switch_to.alert()
alert.send_keys("hello word")
當alert中有對話框時文章來源:http://www.zghlxwxcb.cn/news/detail-657995.html
#coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.common.exceptions import NoSuchElementException,UnexpectedTagNameException
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.alert import Alert
from time import sleep
import os
driver=webdriver.Chrome()
driver.implicitly_wait(30)
file_path = 'file:///' + os.path.abspath('send.html')
driver.get(file_path)
#driver.get('file:///D:/PycharmProjects/test/send.html')
#點擊“請點擊”
driver.find_element(By.XPATH,"html/body/input").click()
#輸入內(nèi)容
driver.switch_to.alert().send_keys('webdriver')
driver.switch_to.alert().accept()
sleep(5)
driver.quit()
1.13 上傳文件操作
定位上傳按鈕,通過send_keys 添加本地文件路徑就可以了。絕對路徑和相對路徑都可以,關(guān)鍵是上傳的文件存在。文章來源地址http://www.zghlxwxcb.cn/news/detail-657995.html
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
import os,time
driver = webdriver.Chrome()
#腳本要與upload_file.html 同一目錄
file_path = 'file:///' + os.path.abspath('upload.html')
driver.get(file_path)
#定位上傳按鈕,添加本地文件
driver.find_element(By.NAME,"file").send_keys('D:\\PycharmProjects\\test\\upload.txt')
time.sleep(2)
driver.quit()
到了這里,關(guān)于自動化測試框架selenium之webdriver的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!