本文轉載自: http://www.lemfix.com/topics/971css
近期有同窗在作web自動化的時候,發現頁面上有些元素,在selenium中沒法經過xpath來定位,各類緣由找了半天,都沒找到解決方案,最後發現元素在一個叫作shadow-root的節點下面,以下所示:html
問題:shadow-root是什麼?爲何下面的節點在selenium沒法經過xapth來定位?
接下來咱們來先了解一下shawod-root到究竟是什麼!前端
上面所看到的shadow-root標籤其實就是一個shadowDOM,那麼什麼是shadowDOM呢?html5
它是前端的一種頁面封裝技術,您能夠將shadow DOM視爲「DOM中的DOM」(能夠當作一個隱藏的DOM)。web
它是一個獨立的DOM樹,具備本身的元素和樣式,與原始文檔DOM徹底隔離。瀏覽器
ShadowDOM 必須附在一個HTML元素中,存放shadowDOM的元素,咱們能夠把它稱爲宿主元素。工具
在HTML5中有不少的標籤樣式都是經過shadowDOM來實現的,好比:日期選擇框,音頻播放標籤,視頻播放標籤都自帶了樣式;測試
這邊以音頻播放標籤audio爲例:在html文件中寫入一個audio標籤,頁面上顯示出來的內容就會出現一個音頻播放器,以下圖:ui
<audio src="file/123.mp3" controls="controls"></audio>
咱們沒有給aduio標籤作任何的css樣式設置,那麼上面播放器樣式是怎麼實現的呢?url
答案就是瀏覽器在解析audio標籤的時候,會自動在audio下添加一個shadowDOM(這個播放器的樣式都是在這裏設置的),而audio就是這個shadowDOM的宿主標籤,shadowDOM中封裝好了全部內容和樣式,只要定義一個宿主標籤就能顯示shadowDOM中的全部內容。
咱們按F12打開瀏覽器的調試工具,點擊audio標籤,就能看到以下信息:
注意:須要調試工具中勾選顯示瀏覽器設置的shadowDOM節點,看能看到如上信息(默認看不到瀏覽器的shadowDOM),以下:
經過上面的案例咱們大體的瞭解了一下shadowDOM的做用,它其實就是瀏覽器提供的一種「封裝」功能,提供了一種強大的技術去隱藏一些實現細節,前面列舉的幾個html5中的元素就是這樣來作的。如今有部分項目的前端頁面,開發人員也使用了這一技術來進行封裝,固然本身封裝的shadowDOM,在使用F12調試工具打開的時候,是能夠清楚的的看到內部的節點和樣式和代碼的。
這種封裝對於前端開發來講雖好,可是咱們測試人員在作web自動給的時候就會遇到一些問題,shadowDOM中的標籤沒法定位。ShadowDom 是遊離在 DOM 樹以外的節點樹,可是他的建立基於普通 DOM 元素(並不文檔的DOM樹),全部沒有辦法基於整個文檔的DOM樹來直接進行操做。
關於shawomDOM中的節點,selenium中並無提供相關操做的方法,咱們要操做的話就只能經過JS代碼來實現,接下來給你們演示一個案例:
需求:修改 shawom-root下span標籤中的元素內容爲 666
1 import time 2 from selenium import webdriver 3 driver = webdriver.Chrome() 4 driver.get(url="http:127.0.0.1:5000/test") 5 js = 'document.getElementById("box").shadowRoot.children[0].children[0].innerText=666' 6 res = driver.execute_script(js)