目標(biāo)
1、掌握xpath和CSS元素定位方
2簿训、掌握元素及瀏覽器操作
1 xpath元素定位
1.1 什么是xpath
總結(jié):xpath是用來在xml文件中進(jìn)行元素定位的標(biāo)記語言,html是一種特殊的xml,所以xpath也可以用在html中
1.2 Xpath定位策略
- 路徑定位
- 屬性定位
- 屬性與邏輯結(jié)合
- 屬性與層級結(jié)合
1.2.1 路徑定位
-
絕對路徑 表達(dá)式是以 /html開頭趾诗,元素的層級之間是以 / 分隔
相同層級的元素可以使用下標(biāo)恤磷,下標(biāo)是從1開始.
需要列出元素所經(jīng)過的所有層級元素 , 工作當(dāng)中绘雁, 一般不使用絕對路徑
例:/html/body/div/fieldset/form/p[1]/input
-
相對路徑 匹配任意層級的元素牧愁, 是以 //tag_name或者//* 開頭
也可以使用下標(biāo),下標(biāo)是從1開始红淡。
例子://p[5]/button
# 通過xpath的絕對路徑定位用戶名輸入框并輸入admin
driver.find_element_by_xpath("/html/body/div/fieldset/form/p/input").send_keys("admin")
# 等待3S
time.sleep(3)
# 通過xapth的相對路徑定位密碼輸入框并輸入123
driver.find_element_by_xpath("http://form/p[2]/input").send_keys("123")
1.2.2 元素屬性定位
- //*或者//tag_name //*[@attribute='value'] # attribute表示的是元素的屬性名不狮,value表示的是元素對應(yīng)屬性值
driver.find_elemet_by_xpath("http://*[@placehoulder ='請輸入用戶名']").send_keys('admin')
1.2.3 屬性與邏輯結(jié)合定位
- //* 或者//tag_name 開頭 //*[@attribute1='value1' and @attribute2='value2']
driver.find_element_by_xpath("http://input[@name ='user' and @class= 'login']").sendkeys('admin')
1.2.4 屬性與層級結(jié)合定位
-
是以//*或者//tag_name開頭 //p[@id='pa']/input
在任意層級當(dāng)中,都可以結(jié)合屬性來使用
driver.find_element_by_xpath("http://p[@id='p1']/input").send_keys("admin")
1.2.5 XPATH擴(kuò)展
//*[text() = 'value'] value表示的是要定位的元素的全部文本內(nèi)容.
-
//*[contains(@attribute,'value')] attribute表示的屬性名稱, value表示的是字符串
要定位的元素中锉屈,attribute屬性的屬性值包含了value的內(nèi)容荤傲。
-
//*[starts-with(@attribute,'value')] attribute表示的屬性名稱, value表示的是字符串
要定位的元素,attribute屬性的屬性值是以value開頭
2颈渊、CSS定位
2.1 什么是CSS
總結(jié):css是可以用來在selenium中定位元素的
CSS定位元素的方法: find_element_by_css_selector(css_selector) # css_selector表示的是CSS選擇器表達(dá)式
2.2 CSS定位策略
- id選擇器
- class選擇器
- 元素選擇器
- 屬性選擇器
- 層級選擇器
2.2.1 id選擇器
- 表達(dá)式: #id # 表示通過元素的ID屬性進(jìn)行元素選擇 id 表示的的id屬性的屬性值
driver.find_element_by_css_selector('#user').send_keys('admin')
2.2.2 class選擇器
- 表達(dá)式: .class # .表示通過元素的class屬性進(jìn)行元素選擇, class表示的class屬性的其中一個屬性值
driver.find_element_by_css_selector('.email').send_keys('123@qq.com')
2.2.3 元素選擇器
- 就是通過元素標(biāo)簽名稱來選擇元素 终佛。表達(dá)式: tag_name 不推薦使用
2.2.4 屬性選擇器
- 就是通過元素的屬性來選擇元素俊嗽。 表達(dá)式:[attribute='value'] #attribute 表示的是屬性名稱,value表示的是屬性值
如果使用的是class屬性铃彰,需要帶上class的全部屬性值
driver.find_element_by_css_selector("input").send_keys("admin")
# 通過css的屬性選擇器定位電子郵箱輸入框绍豁,輸入123@qq.com
driver.find_element_by_css_selector("[class='emailA dzyxA']").send_keys("123@qq.com")
-
父子層級關(guān)系選擇 器
- 表達(dá)式: element1>element2 通過element1來找element2并且element2是element1的直接子元素
-
隔代層級關(guān)系選擇器
- 表達(dá)式: element1 element2 通過element1來找element2并且element2是element1的后代元素
driver.find_element_by_css_selector('.zc #userA').send_keys('admin')
2.2.6CSS擴(kuò)展
-
input[type^='value'] input表示標(biāo)簽名稱,type表示屬性名稱牙捉, value表示的文本內(nèi)容
查找元素type屬性值是以value開頭的元素
-
input[type$='value'] input表示標(biāo)簽名稱竹揍,type表示屬性名稱, value表示的文本內(nèi)容
查找元素type屬性值以value結(jié)尾的元素
-
input[type*='value'] input表示標(biāo)簽名稱邪铲,type表示屬性名稱芬位, value表示的文本內(nèi)容
查找元素type屬性值包含value的元素
4、定位元素的另外一種寫法
- find_element(By.ID, id) 需要導(dǎo)入By類带到。
二昧碉、元素操作及瀏覽器操作方法
1、元素操作
- 點擊操作 element.click() element表示的是元素對象
- 輸入操作 element.send_keys("value") element表示的是元素對象, value表示的是要輸入的內(nèi)容
- 清除操作 element.clear() element表示的是元素對象. 將輸入框里面的內(nèi)容全部清除
import time
from selenium import webdriver
frome senlenium,webdriver.common.by import By
driver = webdriver.Chrome()
# 打開測試網(wǎng)站
driver.get('' ")
driver.find_element(By.ID,'userA').send_keys('admin')
driver.find_element(By.ID, 'passwordA').send_kes('123456')
driver.find_element(By.XPATH, "http://*[@class='emailA dzyxA']").send_keys("123@qq.com")
# 2).間隔3秒被饿,修改電話號碼為:18600000000
time.sleep(3)
driver.find_element(By.CSS_SELECTOR, ".telA").clear()
time.sleep(3)
driver.find_element(By.CSS_SELECTOR, ".telA").send_keys("18600000000")
# 等待3S
time.sleep(3)
# 退出
driver.quit()
2四康、瀏覽器操作
- 瀏覽器常用操作方法
maximize_window() 最大化瀏覽器窗口 --> 模擬瀏覽器最大化按鈕 實例化瀏覽器驅(qū)動之后,就可以調(diào)用窗口最大化的方法
set_window_size(width, height) 設(shè)置瀏覽器窗口大小 --> 設(shè)置瀏覽器寬狭握、高(像素點)
-
set_window_position(x, y) 設(shè)置瀏覽器窗口位置 --> 設(shè)置瀏覽器位置
x,y是一個坐標(biāo)點闪金,通過此坐標(biāo)點確定瀏覽器最左上角的位置,以此確定瀏覽器在屏幕上的位置论颅。
x, y不能超過屏幕的分辨率大小
# 導(dǎo)包
import timefrom selenium import webdriver
# 創(chuàng)建瀏覽器驅(qū)動對象
from selenium.webdriver.common.by
import By
driver = webdriver.Chrome()
# 窗口最大化
driver.maximize_window()
# 打開測試網(wǎng)站
driver.get("file:///D:/software/UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/web%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html")time.sleep(3)
# 設(shè)置窗口大小
driver.set_window_size(500, 500)
time.sleep(3)
# 設(shè)置窗口位置
driver.set_window_position(300, 300
)# 等待
3Stime.sleep(3)
# 退出
driver.quit()
- back() 后退 --> 模擬瀏覽器后退按鈕
- forward() 前進(jìn) --> 模擬瀏覽器前進(jìn)按鈕
- refresh() 刷新 --> 模擬瀏覽器F5刷新
- close() 關(guān)閉當(dāng)前窗口 --> 模擬點擊瀏覽器關(guān)閉按鈕
- quit() 關(guān)閉瀏覽器驅(qū)動對象 --> 關(guān)閉所有程序啟動的窗口
driver.back()
driver.forward()
driver.find_element(By.XPATH, "http://*[text()='訪問 新浪 網(wǎng)站']").click()
driver.close()
driver.quit()
- title 獲取頁面title
- current_url 獲取當(dāng)前頁面URL
3哎垦、獲取元素信息
-
為什么要學(xué)習(xí)獲取元素信息的方法
主要為了獲取相關(guān)的信息進(jìn)行斷言,判斷自動化用例最終的執(zhí)行結(jié)果嗅辣。
-
獲取元素常用的方法:
- size 獲取元素的大小 返回的是一個字典撼泛,里面包含 元素高度和寬度的值
- text 獲取元素的文本內(nèi)容
- get_attribute("attribute") 獲取元素對應(yīng)屬性名稱的屬性值 , attribute表示的是屬性名
#1. 獲取用戶名輸入框的大小
driver.find_element(By.ID,'userA').size
#2. 獲取頁面上第一個超鏈接文本的內(nèi)容
driver.find_element(By.LINK_TEXT,'新浪').text
#3. 獲取第一個超鏈接的地址
driiver.find_element(By.LINK_TEXT.'新浪').get_attribute('href')
- is_displaye() 判斷元素是否可見 返回值為true 或者false
- is_enabled() 判斷元素是否可用澡谭,返回值true或者false
- is_selected() 判斷復(fù)選框或者單選框是否被選中愿题,返回值為true或者false
# 4. 判斷span元素是否可見,
print(driver.find_element(By.Name, 'sp1').is_dispalyed())
# 判斷取消按鈕是否可用
print(driver.find_element(By.ID, 'cancelA').is_enabled())
# 判斷頁面中’旅游‘對應(yīng)的復(fù)選框是否選中狀態(tài)
print(driver.find_element(By.ID, 'lyA').is_selected())