UI自動化- senlenium中的元素定位(二)

目標(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的元素

image-20200622150415134.png

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四康、瀏覽器操作

  • 瀏覽器常用操作方法
  1. maximize_window() 最大化瀏覽器窗口 --> 模擬瀏覽器最大化按鈕 實例化瀏覽器驅(qū)動之后,就可以調(diào)用窗口最大化的方法

  2. set_window_size(width, height) 設(shè)置瀏覽器窗口大小 --> 設(shè)置瀏覽器寬狭握、高(像素點)

  3. 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()
  1. back() 后退 --> 模擬瀏覽器后退按鈕
  2. forward() 前進(jìn) --> 模擬瀏覽器前進(jìn)按鈕
  3. refresh() 刷新 --> 模擬瀏覽器F5刷新
  4. close() 關(guān)閉當(dāng)前窗口 --> 模擬點擊瀏覽器關(guān)閉按鈕
  5. quit() 關(guān)閉瀏覽器驅(qū)動對象 --> 關(guān)閉所有程序啟動的窗口
driver.back()
driver.forward()
driver.find_element(By.XPATH, "http://*[text()='訪問 新浪 網(wǎng)站']").click()
driver.close()
driver.quit()
  1. title 獲取頁面title
  2. 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())
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛙奖,一起剝皮案震驚了整個濱河市潘酗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雁仲,老刑警劉巖仔夺,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異攒砖,居然都是意外死亡缸兔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門吹艇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惰蜜,“玉大人,你說我怎么就攤上這事受神∨撞” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵鼻听,是天一觀的道長财著。 經(jīng)常有香客問我,道長撑碴,這世上最難降的妖魔是什么撑教? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮灰羽,結(jié)果婚禮上驮履,老公的妹妹穿的比我還像新娘鱼辙。我一直安慰自己,他們只是感情好玫镐,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布倒戏。 她就那樣靜靜地躺著,像睡著了一般恐似。 火紅的嫁衣襯著肌膚如雪杜跷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天矫夷,我揣著相機(jī)與錄音葛闷,去河邊找鬼。 笑死双藕,一個胖子當(dāng)著我的面吹牛淑趾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忧陪,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼扣泊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嘶摊?” 一聲冷哼從身側(cè)響起延蟹,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎叶堆,沒想到半個月后阱飘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡虱颗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年沥匈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忘渔。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡咐熙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辨萍,到底是詐尸還是另有隱情,我是刑警寧澤返弹,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布锈玉,位于F島的核電站,受9級特大地震影響义起,放射性物質(zhì)發(fā)生泄漏拉背。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一默终、第九天 我趴在偏房一處隱蔽的房頂上張望椅棺。 院中可真熱鬧犁罩,春花似錦、人聲如沸两疚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诱渤。三九已至丐巫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間勺美,已是汗流浹背递胧。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留赡茸,地道東北人缎脾。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像占卧,于是被迫代替她去往敵國和親遗菠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容