Webdriver 定位页面元素方式

网页自动化最基本的要求就是要定位到各个元素,然后才能对该元素进行各种操作(输入,点击,清除,提交等),webdriver提供了一系列的对象定位方法,常用的有以下几种:

id选择器

HTML id属性 -- 唯一标识一个元素的属性。可能有以下几种原因使用到id属性

1、想链接到一个页面的指定位置

2、要在某个HTML元素上使用特定的css样式

3、要为每个HTML元素使用script(比如javascript)

4、要区分两个相同的HTML元素

id属性在整个页面与CSS样式表中一定要是唯一的,在整个网站中最好也唯一。如

<input

id="kw" name="wd" class="s_ipt"

value="" maxlength="255" autocomplete="off"><--!百度搜索输入框-->

使用python代码定位上述id属性的元素

fromselenium import webdriver

browser=webdriver.Firefox()

browser.get("https://www.baidu.com")

browser.find_element_by_id("kw").send_keys('python')          #通过id选择器定位,并在文本框输入python字符

注意点:有些id值是动态变化的,则不能使用该方法定位。如下:id就是动态的,每次进入页面,该id都会改变。

<label

style="display: block;" id="auto-id-1469758879170"

class="u-label f-dn">邮箱帐号或手机号

name选择器

name属性 -- 标识一个HTML元素的属性,可能有以下几种原因使用到name属性

1、使用meta标签

2、在表单中标识一个表单元素

3、使用在frame上定义其名字

W3C的XHTML1.0标准明确,在a、applet、form、frame、iframe、img、map元素中应弃用name属性,并明确在将来版本XHTML的上述元素中将删除此属性。W3C的XHTML1.0标准明确,唯一标记一个片段(fragment)应使用id,而非name。但考虑到对老式客户端浏览器的兼容可以按下列方式定义:

...

JavaScript需要HTML文档中的元素有一个唯一的名称,以便于访问这些元素,但是HTML标准中并没有明确name必须唯一,因此W3C发明了id属性,并明确其必须唯一。可惜的是,一些老式浏览器不支持id

为了提高兼容性我们目前仍需要在上述元素中使用name,同时部分元素仍需使用name,这些元素包括:button、input、meta、object、param、select、textarea。

         <tr height="32px"><--!ITM用户名、密码框-->

<td width="178px"><input name="usrname" class="style4" maxlength="25" tabindex="1" type="text"></td>

</tr>

<tr height="31px">

<td><input name="pass" class="style4" maxlength="25" tabindex="2" autocomplete="off" type="password"></td>

</tr>

使用python代码定位上述name属性的元素

fromselenium import webdriver

browser=webdriver.Firefox()

browser.get("https://10.203.10.51")

browser.find_element_by_name("usrname").send_keys('admin')       #通过name选择器属性定位,并输入admin字符

browser.find_element_by_name("pass").send_keys('tc090331')

LinkText

这个方法比较直接,即通过超文本链接上的文字信息来定位元素,这种方式一般专门用于定位页面上的超文本链接。通常一个超文本链接会长成这个样子:

<a

href="#" id="logout">退出

</li>

使用python代码实现点击退出按钮

logoutlink=browser.find_element_by_link_text("退出");        #点击“退出”链接按钮

logoutlink.click()                                    #

注:因web使用utf-8编码,在python环境中,脚本应使用utf-8无BOM格式编码。

ClassName

ClassName属性是利用元素的css样式表所引用的类名称来进行元素查找的方法。对于任何HTML页面的元素来说,一般程序员或页面设计师会给元素直接赋予一个样式属性或者利用css文件里的类来定义元素样式,使元素在页面上显示时能够更加美观。

<input id="submit" value="登录" class="login_form_submit"tabindex="3" type="button">

<div><a

href="/main/license/index" class="forgot-password-link">更新授权

使用python代码实现点击登录按钮

fromselenium import webdriver

browser=webdriver.Firefox()

browser.get("https://10.203.10.115")

browser.find_element_by_xpath("//input[@tabindex=string(1)]").send_keys('admin')

browser.find_element_by_class­_name("login_form_submit").click()               #模拟点击登录按钮

 

使用className来进行元素定位时,有时会碰到一个元素指定了若干个class属性值的“复合样式”的情况,如下面这个button:

<button

id="J_sidebar_login" class=" btn_big btn_submit"

type="submit">登录</button>

这个button元素指定了两个不同的css类名作为它的样式属性值

Ifyou try to find the element by CSS path as below.

driver.find_element_by_class_name("btn_bigbtn_submit")

Youwill get the error :

InvalidSelectorException:Message: invalid selector: Compound class names not permitted

Theissue is because of the way find by Class name works.in your code class nameis class="btn_big btn_submit"

Asright now selenium doesn't support multiple class name.If your class nameincludes a space, WebDriver will see it as a "compound selector". Youcan simply get rid of the issue by using Id, CSS, Xpath, regular expression orany other element finder method.

You can use

driver.find_element_by_class_name("btn_big")

or

driver.find_element_by_class_name("btn_submit")

youcan select anyone class name from two or more class names separated by spaces ,it'llwork just fine.

XPath路径定位

XPath语言的核心是给出用于从XML文件中查找标记的语法规则,即编写XPath路径表达式,以便使应用程序更加方便、快捷地从XML文件中检索到所需要的数据。我们处理XML文档时可以一层层地查找所需的XML节点,在XPath路径中,我们使用反斜杠符号来分隔各个层次的XML元素的名称。

cssSelector

cssSelector这种元素定位方式跟xpath比较类似,但执行速度较快,而且各种浏览器对它的支持都相当到位,所以功能也是蛮强大的。

最后再总结一下,各种方式在选择的时候应该怎么选择:

1. 当页面元素有id属性时,最好尽量用id来定位。但由于现实项目中很多程序员其实写的代码并不规范,会缺少很多标准属性,这时就只有选择其他定位方法。

2. xpath很强悍,但定位性能不是很好,所以还是尽量少用。如果确实少数元素不好定位,可以选择xpath或cssSelector。

3. 当要定位一组元素相同元素时,可以考虑用tagName或name。

4. 当有链接需要定位时,可以考虑linkText或partialLinkText方式。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335