(67,68,69)
目錄
一、python八大元素定位
正文
一、python八大元素定位方式
id、name、class_name、tag_name、link_text、partial_link_text、xpath、css_selector
1.元素定位
得到的返回值是一個webelement的python對象.------》定位的元素,下面以百度頁面的輸入框為例:
① find_element_by_id("kw")
input_elem=driver.find_elemrnt_by_id("kw") print(input_elem) #webelement對象
得到的結果就是一個webelement
那么如何獲取元素的屬性?------就是獲取webelement的屬性,get_attribute()
attr = input_elem.get_attribute("name") print(attr)
注意:Python中,當前還不能直接修改元素,selenium沒有封裝對應的方法。
②find_element_by_id VS find_elements_by_id
find_element_by_id :
1)查找一個,得到的是一個webelement對象;
2)找不到元素的話,報錯:NoSuchElementException
find_elements_by_id :
1).查找多個,得到一個列表
2.查找不到元素的話,得到的是一個空列表
在實際定位的時候,不知道該元素存不存在,可以用下面的判斷方法:
if not driver.find_elements_by_id("kk") print("該元素不存在") else: print("該元素存在")
③name屬性定位---->find_element_by_name
driver.find_element_by_name("wd")
driver.find_elements_by_name("wd")
④class屬性---->class_name
driver.find_element_by_class_name("s_ipt") driver.find_elements_by_class_name("s_ipt")
⑤link_text :通過超鏈接的文本,進行元素定位(只能定位超鏈接,其他的元素是不能定位的,所以只能定位a標簽)
e = driver.find_element_by_link_text("新聞") e.click() # 如果定位成功,會點擊進入新聞這個鏈接的頁面
⑥partial_link_text:通過超鏈接的文本的一部分進行元素定位
e = driver.find_element_by_partial_link_text("新") e.click()
注意:若果有多個新開頭的超鏈接,永遠定位到的都是第一個。
⑦tagname ---->定位的元素比較多,測試的時候很少用
driver.find_element_by_tagname("input")
總結:以上6種定位方法,用的最多的是id、name、class_name用的最多
id:是唯一的
name:用戶輸入經常會帶name屬性(提前在瀏覽器中,F12,在源代碼中,按ctrl+F,查找元素出現的次數)
class_name:出現次數多
元素定位的坑
1.不要用可能會發生動態變化的屬性進行元素定位。------->屬性是靜態的才能定位
比如說:1)不規則的字符串(比較長可能是加密),就不能用這個屬性進行元素定位
2)有些屬性有數字,純數字的,不能用來定位
3)帶數字的,也要警惕
2.class_name定位的時候,class_name值中間不能有空格-------》class是分組的
下面定位百度,class_name的值中間有空格,是定位不到的
class = "bg s_btn"表示2個class,用空格分開。
所以通過class_name進行定位,只能寫其中一個。
driver.find_element_by_class_name("bg") 或者 driver.find_element_by_class_name("s_btn")
3.如何確定我的元素表達式只能找到一個元素
1).復制表達式到瀏覽器,在F12的源碼中ctrl+F
2).find_element只有一個元素
以上6種 元素定位的方式:通過單屬性定位只能定位特征明顯的元素。
下面介紹xpath,css_selector--------面試題
優勢:組合多個特征、組合多個屬性,能夠更加精准的定位元素;定位元素的時候,因為可以組合,有更大的靈活性。
面試題:八大元素定位有哪些?
先說八種元素定位方式;再說,其實沒有8種元素定位方式:find_element_by_id / by_name / by_tag_name / by class_name等都是在find_element()方法的基礎上,進行二次封裝的。其本質都是使用的find_element()方法,進行元素定位的。
如下:find_element()方法的源碼:
driver.find_element("id","kw") == driver.find_element_by_id("kw")
即上面的語句是等價的。
69節
⑦xpath
1)定義:Xpath即XML路徑語言(XML Path language),用來確定XML文檔中某部分位置的語言。XML跟HTML很相像,所以也可以進行HTML
2)使用xpath進行元素定位
獲取xpath的表達式:
------1.通過瀏覽器,F12定位,在源碼上右擊,copy--》copy xpath 、copy selector、copy full xpath (第三順位)
------2.使用插件 (第二順位)
------3.自己編寫。(第一順位,最重要)
學習的時候:不要使用工具獲取xpath,有時候是不正確的,一般最好是自己寫。
實際項目中,節省時間可以使用插件。
3).絕對定位 相對定位
絕對路徑 VS 相對路徑
在自動化測試中,使用相對路徑,不使用絕對路徑。
面試題:↓↓
絕對路徑:
1)從最開始的位置,一層一層進入對應的元素。
2)冗余,容錯性更差
相對路徑:
1)在某個位置,不需要從最開始的位置
2) 更加簡潔、靈活,容錯性更好
例如:前端工程師,喜歡加層級(多個div),使用絕對路徑就很可能找不到元素。相對路徑則比較靈活。容錯性更好。
3)xpath表達式 解釋
單個屬性定位
//*[@id = "kw"] :查找任意的元素,這個元素的屬性id=kw
// :表示相對路徑
* :表示通配符,所有的標簽名稱 (上面的式子定位百度輸入框,就等價於 //input[@id = "kw"])
[@id="kw" ]:謂語條件 屬性=值,@表示這個屬性。@+屬性。
組合多個條件:如果一個屬性定位不到,就考慮組合多個條件
例如://input[@id= "kw" and name="wd" and class="s_ipt"]
text()文本定位:文本不是屬性,不能加@
//a[text()="新聞”]
xpath函數---contains包含 模糊匹配
常用的語法:// *[contains(text() , " XXX")]
//*[contains(@id,"XX")]
下面的情況就可以用contains進行過濾
---class可能有多個,有空格 《------(class屬性定位,一定不能有空格)
----text()定位一部分
----有空格的情況
舉例:通過xpath定位 新聞 這個文本
e = driver.find_element("xpath",”//a[text() = "新聞“]“) #a標簽
e.click()
上面的例子,通過contains進行元素定位(如果新聞兩個字前后有空格,定位的時候不注意,只定位新聞二字,就定位不到,用contains進行過濾)
e = driver.find_element("xpath",”//a[conatins(text() , "新聞“)]“) e.click()
e = driver.find_element("xpath",”//a[conatins(text() , "新“)]“) e.click()
定位的是屬性
e = driver.find_element("xpath",”//a[conatins(@id , "kw“)]“) e.click()
祖級(//)、父級(/)查找子元素
組合查找,還是定位不到元素,該怎么辦?-----父級元素進行查找
舉例://span[@class="bg s_btn_wr" ]/*[@id="su"]
層級之間加 / :表示父、子級關系
層級之間加 // :表示祖孫關系(可以是兒子,孫子,曾孫、、、、、、后代)
子元素查找父級元素---缺點,不能跨級定位,只能一級一級定位
/../..定位上一級元素(不能跨級)
//input[@id="kw"]/../..定位到爺爺級
特殊手段定位元素
手段1.通過索引查找,索引從1開始。並且索引前面加括號
(//input[1])
如果不加括號,會查找出3個索引為1的元素。
70節
手段2.軸定位 軸運算
--1.靈活設計:子孫元素找祖先
--2.可以找同胞(關系查找)
軸定位表達式
sibling: 當前節點的同胞(姐姐或者哥哥 弟弟或者妹妹)
※ preceding-sibling :當前節點的同胞,只是哥哥或者姐姐 (當前節點的前面)
※following-sibling:當前節點的同胞,只是弟弟或者妹妹 (當前節點的后面)
※ancestor: 祖先
這三個軸運算,是xpath很難實現的,使用軸運算就很方便。
舉例:百度輸入框input
1.查找input元素的同胞節點(哥哥/姐姐)-------> //input[@id="kw"]//preceding-sibling::span
如果直接寫成 //input[@id="kw"]//sibling::span 是查找不到的,因為有同胞有input 前面的跟后面的
2.查找input元素的同胞節點(弟弟/妹妹)-------> //input[@id="kw"]//following-sibling::span
3.祖先 ,當前節點所有的外層元素(從父親級開始查找,父親級找不到再找爺爺級,只要是祖先級別,都可以找到)
舉例:input輸入框的祖先----> //input[@id="kw"]//ancestor::span
4.組合查找:父親的同胞--------> //input[@id="kw"]//ancestor::span//preceding-sibling::input
⑧ css_selector css選擇器
css表達式
1)css選擇器的一般寫法:input[id=kw] ------》對應的xpath的寫法是//input[@id="kw"]
css選擇器的表達式,更加簡潔(//,@,""都可以省略)
2)一個點 . 表示class
查找class_name = s_ipt,用css選擇器來查找,就是.s_ipt
3)#號:表示id
查找id="kw" ,用css選擇器來查找,就是 #kw,也可以直接寫為input#kw
css查找的單向性---只能通過父元素找子元素
總結:
xpath比之前的6種元素定位方式的優勢:
xpath可以進行組合:可以組合元素的標簽、屬性、text文本、上下級關系。
//input[@id = "kd" and text() = "新聞”]
//div/input[@id = "kd" and text() = "新聞”] 父級必須是div,父元素定位子元素
//*[] 任意標簽名
//input[@*="kw"] *表示的是任意屬性
//input[@id] 有id屬性,具體id值不知道也可以。爬蟲(測試中條件要精確,這個表示方法基本不用)
//input[contains(text(),"新聞“)] //input[contains(@class,"value")]
//input[@id= "kw"]/../..子元素找父元素
xpath VS CSS----面試題
css的優勢:
1.表達方式更加簡潔
2.主流瀏覽器,查詢速度快(毫秒級別的差別)
xpath 的優勢:
1.功能更強,支持更多的函數,可以查找父元素、軸元素、(css只能用父元素找子元素)
2.支持用text()文本定位查找的(css不支持)
3.對於復雜的元素,xpath的寫法反而比css簡潔(支持跟多的函數、組合定位)
在find_element()函數中,使用的是css選擇器,而不是xpath的原因:查詢速度快一點點。
平時查找使用xpath,封裝函數建議使用css_seletor.