Selenium - CSS Selector

用CSS(即層疊樣式表Cascading Stylesheet) Selector來定位(locate)頁面上的元素(Elements)。Selenium官網的Document裏極力推薦使用CSS locator,而不是XPath來定位元素,緣由是CSS locator比XPath locator速度快,特別是在IE下面(IE沒有本身的XPath 解析器(Parser))。有不少跟Selenium相關的Blog文章都有提到使用CSS Selector的技術。以前我不會CSS Selector,甚至一看到CSS就頭疼。但我相信用CSS Selector能很是精準的定位到我想測試的Elements。由於前端開發人員就是用CSS Selector設定頁面上每個元素的樣式,不管那個元素的位置有多複雜,他們能定位到,那我也能定位到。
讀一下這個文檔就能明白大部分的CSS Selector了
http://www.w3.org/TR/css3-selectors/

若是button上有class屬性的,如:
  <button id="ext-eng=1026" class="x-right-button"...>
能夠這樣寫:
css=button.x-right-button
.表明class

若是class裏帶的空格,用.來代替空格如:
<button class="x-btn-text module_picker_icon">...
能夠這樣寫:
css=button.x-btn-text.module_picker_icon


若是想用別的屬性值定位,用方括號【屬性名=屬性值】的方式,如:
<abbr>Abc<abbr/>
css=abbr[title="Abc"]

若是button上有id屬性的,如:
<input id="ag_name" type="text"...>
能夠這樣寫:
css=input#ag_name 
或者直接寫 
css=#ag_name
#表明id
可是在實際應該中,若是有元素固定id的,能夠直接用id locator,這樣寫:
id=ag_name
這一般是在Form裏的input元素, 須要用戶填寫內容而後提交的部分,也是最簡單的部分。

沒有固定id的,一般是由javascript框架自動生成的id如,每次加載頁面都會改變的,如:
<button id="ext-eng-1026" >,下回可能就是<button id="ext-eng-2047">
這種狀況不能使用id屬性來定位。

若是你想定位一個顯示OK的Button,但頁面上有幾個Button,id是自動生成的,class是同樣的,我又想用一個簡單點的CSS locator的時候,
<button id="ext-eng-1026" class="x-right-button">OK</button>
<button id="ext-eng-1027" class="x-right-button">Cancel</button>

能夠這樣寫: 
css=button.x-right-button:contains("OK")
:contains是個Pseudo-class,用冒號開頭,括號裏是內容。
Pseudo-classes是CSS提供的僞類,用來訪問頁面上DOM tree以外的信息,還有Pseudo-elements 用來最精準的定位頁面上的某一行文字,甚至某一行文字的第一個字母。我也是昨天頭一回據說有這玩意兒,具體能夠研究一下css3 selector文檔的Chapter 6.6 Pseudo-classes 和 Chapter 7 Pseudo-elements


基本上用XPath能定位的元素,都能用CSS Selector定位到。
它兩最類似的是這樣寫: 
<table><tr><td><div><span>abcd</span><span>1234</span></div></td></tr></table>
xpath=//table/tr/td/div/span[1]
css=table>tr>td>div>span:nth-child(1)
*xpath沒在頁面上測試過。
一個很是好的blog,不看惋惜了。
http://saucelabs.com/blog/index.php/2009/10/selenium-tip-of-the-week-start-improving-your-locators/

綜上所述,就是:
有固定id的用id selector, 
沒有固定id的用css selector。 
Pseudo-selements :contains()很好用。
會了這幾下子,基本上定位就不成問題了。
相關文章
相關標籤/搜索