有時候我們需要先定位到父元素,再去定位某個元素
注意:當你使用 父元素.find_element_by_xpath 這種方式定位的時候,元素定位表達式必須以點開頭,如
ele = driver.find_elements_by_xpath("//div[@id='category-block']//ol/li") #父元素
b = ele.find_elements_by_xpath('.//li[@class=\'subcate-item\']//span')
如果不用點,會從整個文檔開始找,即使你前邊使用了父元素也沒有效果
絕對路徑定位
絕對路徑定位 從頂層 html 開始往下找,像文件夾一樣寫的完整路徑, 缺點:一旦頁面結構發生改變,路徑也隨之失效,必須重新定位。 所以不推薦使用絕對路徑的寫法
以 "/" 開頭, 讓xpath 從文檔的根節點開始解析
相對路徑定位
以"//" 開頭, 讓xpath 從文檔的任何元素節點開始解析(也就是說每個節點都作為起點找一下)
索引定位
//input[2] 任意節點下的第二個 input 標簽

屬性定位
//input[@type="submit"] 任意節點下type 屬性為 submit 的 input 標簽

其他定位方式
parent 選取當前節點的父節點
//*[@id="content_views"]/p[51]/span[1]/parent::p

后面的就不一個一個舉例了
ancestor 選取當前節點的所有先輩(父、祖父等)
//*[@id="content_views"]/p[51]/span[1]/ancestor::div
ancestor-or-self 選取當前節點的所有先輩(父、祖父等)以及當前節點本身(不包含叔叔伯伯
//*[@id="content_views"]/p[51]/span[1]/ancestor-or-self::div
descendant選取當前節點的所有后代元素(子、孫等)
//*[@id="content_views"]/descendant::span
descendant-or-self選取當前節點的所有后代元素(子、孫等)以及當前節點本身
//*[@id="content_views"]/p[51]/descendant-or-self::p
preceding 選取文檔中當前節點的開始標簽之前的所有節點
//*[@id="content_views"]/p[51]/preceding::p
preceding-sibling選取當前節點之前的所有同級節點
//*[@id="content_views"]/p[51]/span[2]/preceding-sibling::span
following 選取文檔中當前節點的結束標簽之后的所有節點(包括自己及自己的后代元素
//*[@id="content_views"]/p[51]/following::p
following-sibling選取當前節點之后的所有同級節點
//*[@id="content_views"]/p[51]/span[2]/following-sibling::span
注意這個::后面跟的是對應的父、子、同級等標簽
