selenium中有八種元素定位,分別是:id,name,class_name,tag_name,link_text、partial_link_text、xpath、css
簡單的定位可以用 id、name、class_name、tag_name等,如果遇到復雜的元素需要定位則要使用xpath、或者css定位
下面是每種定位的用法——拿百度來說
1、id——定位到百度的輸入框,可以看到百度的輸入框id是唯一的,具體可以看下圖
在pycharm中,語句是:driver.find_element_by_id("kw").send_keys("selenium")
send_keys 表示在輸入框中輸入文本
2、name——還是以百度輸入框為例,可以看出百度輸入框的name屬性也是唯一的
在pycharm 中語句是:
driver.find_element_by_name("wd").send_keys("selenium")
3、class_name——“百度一下”按鈕,可以看出這個的class_name 是唯一的
在pycharm中的語句是:driver.find_element_by_class_name("bg s_btn").click()
4、tag_name——標簽名稱
這個方法很少用到,一般用xpath/css比較多
5、link_text——用來定位文本鏈接的
比如定位百度中的新聞:driver.find_element_by_link_text("新聞").click()
6、partial_link_text:和link_text 相似,唯一不同的是定位部分文本
如:點擊hao123——driver.find_element_by_partial_link_text("hao").click()
7、xpath
(1)用xpath對標簽內的屬性進行定位(id、name、class)
方法://標簽名[@屬性="屬性名"] 雙引號也可以用單引號表示
當某個元素的屬性不是唯一的時候,需要采用組合的方式定位:"//標簽名[@屬性='屬性名' and @屬性='屬性名']"
(2)用text()方法定位
//標簽名[text()="XXXX"]
(3)模糊定位——contains()方法定位
//標簽名[contains(@屬性,"屬性值")]
(4)軸定位(下圖來自http://www.runoob.com/xpath/xpath-axes.html)
軸名稱 | 結果 |
---|---|
ancestor | 選取當前節點的所有先輩(父、祖父等)。 |
ancestor-or-self | 選取當前節點的所有先輩(父、祖父等)以及當前節點本身。 |
attribute | 選取當前節點的所有屬性。 |
child | 選取當前節點的所有子元素。 |
descendant | 選取當前節點的所有后代元素(子、孫等)。 |
descendant-or-self | 選取當前節點的所有后代元素(子、孫等)以及當前節點本身。 |
following | 選取文檔中當前節點的結束標簽之后的所有節點。 |
following-sibling | 選取當前節點之后的所有兄弟節點 |
namespace | 選取當前節點的所有命名空間節點。 |
parent | 選取當前節點的父節點。 |
preceding | 選取文檔中當前節點的開始標簽之前的所有節點。 |
preceding-sibling | 選取當前節點之前的所有同級節點。 |
self | 選取當前節點。 |
通過軸定位定位“百度一下”按鈕 首先定位到這個按鈕,可以看到這是個input標簽,input標簽的父元素是span標簽,span標簽的父元素是form標簽,那么我們可以從form標簽開始定位然后通過descendant來找到它的后代input
//form[@id='form']/descendant::input[@id='su']
通過following 來定位——following 表示標簽節點之后
//span[@id='s_kw_wrap']/following::input[@id='su']
//span[@id='s_kw_wrap']表示定位到id屬性為s_kw_wrap的<span>標簽,/following::input[@id='su']表示找到<span>結束標簽(即</span>)后的所有input標簽,然后通過[@id='su']精准定位到id屬性為'su'的<input>標簽
parent::可指定要查找的當前節點的直接父節點,例如,父節點是個div,即可寫成parent::div,如果要找的元素不是直接父元素,則不可使用parent,可使用ancestor,代表父輩、祖父輩等節點;
child::表示直接子節點元素
following-sibling只會標識出當前節點結束標簽之后的兄弟節點,而不包含其他子節點