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()很好用。

会了这几下子,基本上定位就不成问题了。

时间: 2024-12-17 10:04:33

Selenium - CSS Selector的相关文章

Selenium - Css Selector 使用方法

什么是Css Selector? Css Selector定位实际就是HTML的Css选择器的标签定位 工具 Css Selector可以下载火狐浏览器插件,FireFinder 或 FireBug和FirePath组合使用. 使用方法: 1. Css Selector支持ID.Class的定位 与HTML中CSS定位相同 定位ID:id = "navi" -> #navi 定位Class: class = "inner" -> .inner 多个Cla

Selenium彩蛋篇-Css Selector使用方法

转:http://www.imdsx.cn/index.php/2017/07/27/css1/ 什么是Css Selector? Css Selector定位实际就是HTML的Css选择器的标签定位 工具 Css Selector的练习建议大家安装火狐浏览器后,下载插件,FireFinder 或 FireBug和FirePath组合使用. Css Selector使用方法 1.Css Selector支持ID.Class的定位 与HTML中CSS定位相同 # 号表id 定位有id的标签方式更加

关于Selenium.common.exceptions.WebDriverException: Message: Invalid locator strategy: css selector 的问题

在执行脚本时报Selenium.common.exceptions.WebDriverException: Message: Invalid locator strategy: css selector 的错 出现这个问题时请先检查你的selenium版本是否和Appium-Python-Client 的版本互相兼容 如果你的selenium是3.4的版本,需要下载 Appium-Python-Client 2.8的版本 如果selenium是2.53.6的请一定要下载 Appium-Pytho

Selenium之Css Selector使用方法

什么是Css Selector? Css Selector定位实际就是HTML的Css选择器的标签定位 工具 Css Selector的练习建议使用火狐浏览器,下载插件,FireFinder.FireBug.Firepath结合使用. Css Selector的使用方法 1.Css Selector支持ID.Class的定位,与HTML中CSS定位相同 2.Css Selector支持标签定位,但是用处不大 3.Css Selector支持任意属性定位 4.Css Selector支持标签属性组

Selenium学习之==&gt;Css Selector使用方法

一.什么是Css Selector Css Selector定位实际就是HTML的Css选择器的标签定位 工具 Css Selector的练习建议大家安装火狐浏览器后,下载插件,FireFinder 或 FireBug和FirePath组合使用. 二.Css Selector使用方法 1.通过ID.Class定位 1 ID定位 2 #号代表id,定位有id的标签方式更加简洁 3 #i1 4 5 Class定位 6 .代表Class 7 .c1 8 Class定位还提供了多个Class定位,通过连

Jsoup代码解读之五-实现一个CSS Selector

Jsoup代码解读之七-实现一个CSS Selector 当当当!终于来到了Jsoup的特色:CSS Selector部分.selector也是我写的爬虫框架webmagic开发的一个重点.附上一张street fighter的图,希望以后webmagic也能挑战Jsoup! select机制 Jsoup的select包里,类结构如下: 在最开始介绍Jsoup的时候,就已经说过NodeVisitor和Selector了.Selector是select部分的对外facade,而NodeVisito

CSS selector? [class*=“span”]怎么理解

我在Twitter 中有看到如下selector: .show-grid [class*="span"] { background-color: #eee; text-align: center; border-radius: 3px; min-height: 30px; line-height: 30px; } 有哪位童鞋知道这种写法. 答: 这是一个属性通配符selector. 在你提供的例子中, 会在引用了.show-grid 样式的容器内查找包含span样式的任何元素并设置对应

[译文]通过ID, TagName, ClassName, Name, CSS selector 得到element

致谢原文: <http://xahlee.info/js/js_get_elements.html> 通过ID得到element: Document.getElementById(id string) 返回element object, 如果失败,得到null 注意id在页面内应该是唯一的,但在iframe的看作是另一个html页面 通过TagName得到element document.getElementsByTagName(tagname)返回element object集合. tagn

selenium css(转)

如果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