元素定位,顧名思義就是根據元素的特征,來確認元素的條件,然后根據條件去找到唯一的那個元素。
一、八大元素
1、只根據元素的一個屬性來找元素(6大)
1)id、name、class_name(只支持一個class值)、tag_name
2)只針對a元素
link_text、partial_link_text
示例:
1 # class - 只能是class屬性當中的一個值 2 driver.find_element_by_class_name("s_ipt") # 1個元素 - 匹配到的第1個元素 3 driver.find_elements_by_class_name("s_ipt") # 所有匹配多個元素 - 列表 4 5 # name 6 driver.find_element_by_name("wd") 7 driver.find_elements_by_name("wd") 8 # 9 # tag 10 driver.find_element_by_tag_name("input") 11 driver.find_elements_by_tag_name("input") 12 # 13 # link_text 14 driver.find_element_by_link_text("地圖") 15 driver.find_elements_by_link_text("地圖") 16 # 17 # # partial_link_text 18 driver.find_element_by_partial_link_text("hao") 19 driver.find_elements_by_partial_link_text("hao")
2、多個屬性組合來找元素或者通過其它的關系來找元素(2大)-
1)絕對定位: 以/開頭, 父/子
根據繼承順序、同級位置順序一層一層的找,與在windows文件目錄,需要一層一層的打開找到對應的文件(逐層打開)。
示例:
/html/body/div[2]/div[3]/div/div/div[2]/div[3]/i[1]
/*[@id="number-attend"]/div[2]/div[3]/i[1]
//div[@id="number-attend"]//i[@class="ing
2)相對定位(Xpath定位):靠自己的特征來定位,自己唯一的標識,以//開頭
二、Xpath定位
(在當前需定位的頁面按F12下elements當中,按Ctrl +F,彈出表達式確認框)
1、根據元素的唯一屬性(標識來定位)
表達式格式://標簽名[@屬性=值]
示例://i[@class="ing"]
//*[@*="ing"]
2、文本匹配
表達式格式://標簽名[text()=值]
示例://a[text()="公告"]
3、包含
表達式格式://標簽名[contains(@屬性/text(),值)]
示例://a[contains(@href,"/Notify/index/courseid/")]
//a[contains(text(),"公告")]
4、輯運算 來組合更多的元素特征。 and or
表達式格式:
1)//標簽名[@屬性=值 and @屬性=值 and contains(@屬性/text(),值) and text()=值]
2)//標簽名[@屬性=值 or @屬性=值]
示例://a[text()="公告" and contains(@href,"/Notify/index/courseid/")]
5、層級定位://一級元素//二級元素//......
示例://div[@id="number-attend"]//i[@class="ing"]
6、軸定位: 關系 - 分析元素之間的關系,頁面的結構。
1)通過兄弟姐妹找到自己
2)通過后代元素來找到 祖先元素
軸運算:
ancestor:祖先結點 包括父
parent:父結點 給g
preceding: 當前元素節點標簽之前的所有結點。(html頁面先后順序)
preceding-sibling: 當前元素節點標簽之前的所有兄弟結點
following: 當前元素節點標簽之后的所有結點。(html頁面先后順序)
following-sibling:當前元素節點標簽之后的所有兄弟結點
使用語法:
已知的元素/軸名稱::標簽名稱[@屬性=值]
例://div//table//td//preceding::td
//p[@title="余糧"]/preceding-sibling::p[@class="stuno"]
//p[@title=”余糧"]/parent::*/following-sibling::li//p[@class="name"]
1 # 直接寫By,按Alt+Enter進行導入即可 2 from selenium.webdriver.common.by import By
3 element = driver.find_element(By.XPATH,'//p[@title="余糧"]/preceding-sibling::p[@class="stuno"]')
4 element_list = driver.find_elements(By.XPATH,'//p[@title="余糧"]/preceding-sibling::p[@class="stuno"]')