Selenium-webdriver+八种元素定位
進(jìn)行Web頁(yè)面自動(dòng)化測(cè)試,對(duì)頁(yè)面上的元素進(jìn)行定位和操作是核心。而操作又是以定位為前提的,因此,對(duì)頁(yè)面元素的定位是進(jìn)行自動(dòng)化測(cè)試的基礎(chǔ)。
頁(yè)面上的元素就像人一樣,有各種屬性,比如元素名字,元素id,元素屬性(class屬性,name屬性)等等。webdriver就是利用元素的這些屬性來進(jìn)行定位的。(本文以百度首頁(yè)為例)
- Friebug
- Chrome開發(fā)者工具(F12)
這樣可以成功的查看元素的屬性。
圖中顯示輸入框的屬性為:<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
selenium的webdriver提供了八種基本的元素定位方法,前面六種是通過元素的屬性來直接定位的,后面的xpath和css定位更加靈活,需要重點(diǎn)掌握其中一個(gè)。
1.通過id定位:find_element_by_id()
從上面的元素屬性中,可以看到有個(gè)id屬性:id="kw",所以可以通過它的id屬性單位到這個(gè)元素。定位到搜索框后,可以用send_keys()方法輸入內(nèi)容到搜索框。
eg:driver.find_element_by_id("kw").send_keys("by_id")
2.通過name定位:find_element_by_name()
同理:name屬性:name="wd",通過它的name屬性單位到這個(gè)元素。
說明:這里運(yùn)行后會(huì)報(bào)錯(cuò),說明這個(gè)搜索框的name屬性不是唯一的,無法通過name屬性直接定位到輸入框
eg:driver.find_element_by_name("wd").send_keys("by_name")
3.通過class定位:find_element_by_class_name()
同理:class屬性:class="s_ipt",通過它的class屬性單位到這個(gè)元素。
eg:driver.find_element_by_class_name("s_ipt").send_keys("by_class_name")
4.通過tag定位:find_element_by_tag_name()
從元素屬性中,可以看到每個(gè)元素都有tag(標(biāo)簽)屬性,就是最前面的input
在一個(gè)頁(yè)面中,相同的標(biāo)簽有很多,所以一般不用標(biāo)簽來定位。以下例子,僅供參考和理解,運(yùn)行肯定報(bào)錯(cuò)
eg:driver.find_element_by_tag_name("input").send_keys("by_tag_name")
通過上圖可以獲取超鏈接hao123的屬性:<a name="tj_trhao123" class="mnav">hao123</a>
5.通過link定位:find_element_by_link_text()
對(duì)于超鏈接的元素我們通過超鏈接上的文字信息來定位元素。并用方法click()點(diǎn)擊進(jìn)入鏈接。
eg:driver.find_element_by_link_text("hao123").click()
6.通過partial_link定位:find_element_by_partial_link_text()
這個(gè)方法是上一個(gè)方法的擴(kuò)展。當(dāng)你不能準(zhǔn)確知道超鏈接上的文本信息或者只想通過一些關(guān)鍵字進(jìn)行匹配時(shí),可以使用這個(gè)方法來通過部分鏈接文字進(jìn)行匹配。
eg:driver.find_element_by_partial_link_text("ao123").click()
7.通過xpath定位:find_element_by_xpath()
這個(gè)方法是非常強(qiáng)大的元素查找方式,使用這種方法幾乎可以定位到頁(yè)面上的任意元素。
在正式開始使用XPath進(jìn)行定位前,我們先了解下什么是XPath。XPath是XML Path的簡(jiǎn)稱,由于HTML文檔本身就是一個(gè)標(biāo)準(zhǔn)的XML頁(yè)面,所以我們可以使用XPath的語法來定位頁(yè)面元素。
我們以圖中HTML代碼為例,要引用對(duì)應(yīng)的對(duì)象,XPath語法如下:
Xpath功能很強(qiáng)大,所以也可以寫得更加復(fù)雜一些。
8.通過css定位:find_element_by_css_selector()
# 第一步導(dǎo)入需要的模塊
from selenium import webdriver
import time # 第二步打開瀏覽器
driver = webdriver.Chrome() # 第三步打開百度
driver.get("http://www.baidu.com") # 1. 操作瀏覽器對(duì)象-id
driver.find_element_by_id("kw").send_keys("by_id")
time.sleep(1)
# 清空文本框
driver.find_element_by_id("kw").clear() # 2. 操作瀏覽器對(duì)象-name
driver.find_element_by_name("wd").send_keys("by_name")
time.sleep(1)
driver.find_element_by_id("kw").clear() # 3. 操作瀏覽器對(duì)象-class_name
driver.find_element_by_class_name("s_ipt").send_keys("by_class_name")
time.sleep(1)
driver.find_element_by_id("kw").clear()
driver.refresh()
# 4. 操作瀏覽器對(duì)象-tag_name, tag同名的很多,運(yùn)行肯定報(bào)錯(cuò),所以注釋掉不運(yùn)行。
#driver.find_element_by_tag_name("input").send_keys("by_tag_name") # 5. 操作瀏覽器對(duì)象-link_text
driver.find_element_by_link_text("hao123").click()
time.sleep(1)
# 回退到上一個(gè)頁(yè)面
driver.back()
time.sleep(1) # 6. 操作瀏覽器對(duì)象-partial_link_text
driver.find_element_by_partial_link_text("ao123").click()
time.sleep(1)
driver.back()
time.sleep(1) # 7. 操作瀏覽器對(duì)象-xpath
driver.find_element_by_xpath(".//*[@id='kw']").send_keys("by_xpath")
time.sleep(1)
driver.find_element_by_id("kw").clear() # 8. 操作瀏覽器對(duì)象-xpath
driver.find_element_by_css_selector("#kw").send_keys("by_css_selector")
time.sleep(1) # 退出, close用于關(guān)閉當(dāng)前窗口,quit用于結(jié)束進(jìn)程,關(guān)閉所有窗口,當(dāng)測(cè)試結(jié)束時(shí),要用quit
driver.close()
driver.quit()
總結(jié)
以上是生活随笔為你收集整理的Selenium-webdriver+八种元素定位的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用scrapy-redis 搭建分布式
- 下一篇: Java多线程学习——join方法的使用