API講解
-
coding = utf-8
可加可不加,開發人員喜歡加一下,防止亂碼。 -
from selenium import webdriver
要想使用selenium 的webdriver 裏的函數,首先把包導進來 -
browser = webdriver.Firefox()
我們需要操控哪個瀏覽器呢?Chrome ,當然也可以換成Ie 或Firefox。browser 可以隨便取,但後面要用它操縱各種函數執行。 -
browser.find_element_by_id(“kw”).send_keys(“selenium”)
一個控件有若干屬性id 、name、(也可以用其它方式定位),百度輸入框的id 叫kw ,我要在輸入框裏輸入selenium 。 -
browser.find_element_by_id(“su”).click()
搜索的按鈕的id 叫su ,我需要點一下按鈕( click() )。 -
browser.quit()
退出並關閉窗口的每一個相關的驅動程序。 -
browser.close()
關閉當前窗口。
close方法關閉當前的瀏覽器窗口,quit方法不僅關閉窗口,還會徹底的退出webdriver,釋放與driver server之間
的連接。所以簡單來說quit是更加徹底的close,quit會更好的釋放資源
元素的定位
對象的定位應該是自動化測試的核心,要想操作一個對象,首先應該識別這個對象。一個對象就是一個人一樣,他
會有各種的特徵(屬性),如比我們可以通過一個人的身份證號,姓名,或者他住在哪個街道、樓層、門牌找到這
個人。
那麼一個對象也有類似的屬性,我們可以通過這個屬性找到這對象。
webdriver 提供了一系列的對象定位方法,常用的有以下幾種
1.id
2.name
3.class name
4.link text
5.partial link text
6.tag name
7.xpath
8.css selector
這是一個百度輸入框的html
<input id="kw" class="s_ipt" type="text" maxlength="100" name="wd" autocomplete="off">
#coding=utf-8
from selenium import webdriver
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("//[@id='kw']").send_keys("selenium")
############################################
browser.find_element_by_id("su").click()
time.sleep(3)
browser.quit()
id 和name 定位
id 和name 是我們最最常用的定位方式,因爲大多數控件都有這兩個屬性,而且在對控件的id 和name 命名時一般使其有意義也會取不同的名字。通過這兩個屬性使我們找一個頁面上的屬性變得相當容易。
tag name 和class name 定位
從上面的百度輸入框的屬性信息中,我們看到,不單單隻有id 和name 兩個屬性, 比如class 和tag name(標籤名)
input 就是一個標籤的名字,可以通find_element_by_tag_name(“input”) 函數來定位。
class=“s_ipt”,通過find_element_by_class_name(“s_ipt”)函數捕獲百度輸入框。
XPath 定位
XPath 是一種在XML 文檔中定位元素的語言。因爲HTML 可以看做XML 的一種實現,所以selenium 用戶可是使用這種強大語言在web 應用中定位元素。
link text定位
有時候不是一個輸入框也不是一個按鈕,而是一個文字鏈接,我們可以通過link。
#coding=utf-8
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
browser.find_element_by_link_text("hao123").click()
browser.quit()
Partial link text 定位
通過部分鏈接定位,這個有時候也會用到,我還沒有想到很好的用處。拿上面的例子,我可以只用鏈接的一部分文字進行匹配。
coding=utf-8
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
browser.find_element_by_partial_link_text("hao").click()
browser.quit()
操作測試對象
一般來說,webdriver 中比較常用的操作對象的方法有下面幾個:
- click 點擊對象
- send_keys 在對象上模擬按鍵輸入
- clear 清除對象的內容,如果可以的話
- submit 提交表單
- text 用於獲取元素的文本信息
driver.find_element_by_id("su").submit()
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").submit()
data=driver.find_element_by_id("cp").text
print(data)
time.sleep(3)
driver.quit()
添加等待
- time.sleep(5)
- driver.implicitly_wait(5) 智能等待
瀏覽器的操作
瀏覽器最大化
browser.maximize_window()
設置瀏覽器寬、高
browser.set_window_size(480, 800)
操作瀏覽器的前進、後退
# 後退到上一個頁面
browser.back()
# 前進到下一個頁面
browser.forward()
控制瀏覽器滾動條
#將頁面滾動條拖到底部
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
time.sleep(3)
#將滾動條移動到頁面的頂部
js="var q=document.documentElement.scrollTop=0"
driver.execute_script(js)
鍵盤事件
鍵盤按鍵用法
driver.find_element_by_id("account").send_keys(Keys.TAB)
driver.find_element_by_name("password").send_keys(Keys.ENTER)
鍵盤組和用法
#ctrl+a 全選輸入框內容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
time.sleep(3)
#ctrl+x 剪切輸入框內容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
time.sleep(3)
鼠標事件
ActionChains 類:
- context_click() 右擊
- double_click() 雙擊
- drag_and_drop() 拖動
- move_to_element() 移動
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()
定位一組元素
inputs = dr.find_elements_by_tag_name('input')
for input in inputs:
if input.get_attribute('type') == 'checkbox':
input.click()
多層框架/窗口定位
switch_to_frame()
switch_to_window()
#先找到到ifrome1(id = f1)
browser.switch_to_frame("f1")
#再找到其下面的ifrome2(id =f2)
browser.switch_to_frame("f2")
#下面就可以正常的操作元素了
多層窗口定位
有可能嵌套的不是框架,而是窗口,還有真對窗口的方法:switch_to_window
用法與switch_to_frame 相同:
driver.switch_to_window(“windowName”)
層級定位
具體思路是:先點擊顯示出1個下拉菜單,然後再定位到該下拉菜單所在的ul,再定位這個ul 下的某個具體的link。
在這裏,我們定位第1個下拉菜單中的Action 這個選項
#點擊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()
下拉框處理
#先定位到下拉框
m=driver.find_element_by_id("ShippingMethod")
#再點擊下拉框下的選項
m.find_element_by_xpath("//option[@value='10.69']").click()
alert、confirm、prompt 的處理
- text 返回alert/confirm/prompt 中的文字信息
- accept 點擊確認按鈕
- dismiss 點擊取消按鈕,如果有的話
- send_keys 輸入值,這個alert\confirm 沒有對話框就不能用了,不然會報錯
alert = dr.switch_to_alert()
alert.accept()
alert.dismiss()
alert.send_keys("hello word")
DIV對話框的處理
# 打開對話框
dr.find_element_by_id('show_modal').click()
sleep(3)
# 點擊對話框中的鏈接
link = dr.find_element_by_id('myModal').find_element_by_id('click')
link.click()
sleep(4)
# 關閉對話框
buttons =dr.find_element_by_class_name('modal-footer').find_elements_by_tag_name('button')
buttons[0].click()
上傳文件操作
#定位上傳按鈕,添加本地文件
driver.find_element_by_name("file").send_keys('D:\\PycharmProjects\\test\\upload.txt')