知识点:简单的对象定位

对象的定位应该是自动化测试的核心,要想操作一个对象,首先应该识别这个对象。一个对象就是一个人一样,他会有各种的特征(属性),如比我们可以通过一个人的身份证号,姓名,或者他住在哪个街道、楼层、门牌找到这个人。

定位对象的目的一般有下面几种

  • 操作对象
  • 获得对象的属性,如获得测试对象的class属性,name属性等等
  • 获得对象的text
  • 获得对象的数量

webdriver提供了一系列的对象定位方法,常用的有以下几种

  • id
  • name
  • class name
  • link text
  • partial link text
  • tag name
  • xpath
  • css selector

html代码 form.html

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>Form</title>
<script type="text/javascript" async="" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet" />
<script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
</head>
<body>
<h3>simple login form</h3>
<form class="form-horizontal">
<div class="control-group">
<label class="control-label" for="inputEmail">Email</label>
<div class="controls">
<input type="text" id="inputEmail" placeholder="Email" name="email">
</div>
</div>
<div class="control-group">
<label class="control-label" for="inputPassword">Password</label>
<div class="controls">
<input type="password" id="inputPassword" placeholder="Password" name="password">
</div>
</div>
<div class="control-group">
<div class="controls">
<label class="checkbox">
<input type="checkbox"> Remember me
</label>
<button type="submit" class="btn">Sign in</button>
<a href="#">register</a>
</div>
</div>
</form>
</body>
</html>

以上述代码为例,学习各种对象定位方法。

python代码 test1.py

#coding=utf-8

from selenium import webdriver
from time import sleep
import os if 'HTTP_PROXY' in os.environ:del os.environ('HTTP_PROXY') dr=webdriver.Firefox() file_path='file:///'+os.path.abspath('form.html') print file_path dr.get(file_path) #by id
dr.find_element_by_id('inputEmail').click() #by name
dr.find_element_by_name('password').click() #by tagname
print dr.find_element_by_tag_name('form').get_attribute('class') #by class_name
e=dr.find_element_by_class_name('controls')
dr.execute_script('$(arguments[0]).fadeOut().fadeIn()',e)
sleep(1) # by link text
link = dr.find_element_by_link_text('register')
dr.execute_script('$(arguments[0]).fadeOut().fadeIn()', link)
sleep(1) # by partial link text
link = dr.find_element_by_partial_link_text('reg')
dr.execute_script('$(arguments[0]).fadeOut().fadeIn()', link)
sleep(1) # by css selector
div = dr.find_element_by_css_selector('.controls')
dr.execute_script('$(arguments[0]).fadeOut().fadeIn()', div)
sleep(1) # by xpath
dr.find_element_by_xpath('/html/body/form/div[3]/div/label/input').click() sleep(2)
dr.quit()

上面例子里由于html文件中引用了jquery,所以在执行js时可以使用jquery的$()及fadeIn()等方法。如果你测试的页面没用包含jquery的话,这些方法是无效的。


再以百度搜索为例学习定位。

#coding=utf-8

from selenium import webdriver
import time browser = webdriver.Firefox() browser.get("http://www.baidu.com")
time.sleep(2) #########百度输入框的定位方式########## #通过id方式定位
browser.find_element_by_id("kw").send_keys("selenium") #通过name方式定位
browser.find_element_by_name("wd").send_keys("selenium") #通过tag name方式定位
browser.find_element_by_tag_name("input").send_keys("selenium") #通过class name 方式定位
browser.find_element_by_class_name("s_ipt").send_keys("selenium") #通过CSS方式定位
browser.find_element_by_css_selector("#kw").send_keys("selenium") #通过xphan方式定位
browser.find_element_by_xpath("//input[@id='kw']").send_keys("selenium") ############################################ browser.find_element_by_id("su").click()
time.sleep(3)
browser.quit()

以每一项为例,具体学习。


id和name

它两个是最常用的定位方式,控件一般都会有这两项,而且取的名字也比较有意义。通过这两项个属性可以直接查找页面上的元素。

通过firebug工具,可以看到百度搜索输入框的源码如下:

<input id="kw" class="s_ipt" type="text" maxlength="" name="wd" autocomplete="off">

id="kw"

通过find_element_by_id("kw") 函数可以捕获到百度输入框

name="wd"

通过find_element_by_name("wd")函数可以捕获百度输入框


tag name和class name

<input>

为标签名,可以通过find_element_by_tag_name("input")获取

class="s_ipt"

为class名,可以通过find_element_by_class_name("s_ipt")获取

但是如果遇到标签名或class名重复,则就无法使用这两项。如下面的一组控件:

<th width="95"></th>
<th width="">文件名</th>
<th class="c1">创建时间</th>
<th class="c1">状态</th>
<th class="c1">文件大小</th>
<th class="c1">时长</th>

CSS定位

CSS是一种语言,它被用来描述HTML和XML文档的表现。CSS使用选择器来为页面元素绑定属性。这些选择器可以被selenium用作另外的定位策略。

CSS的比较灵活可以选择控件的任意属性,上面的例子中:

取id属性

find_element_by_css_selector("#kw")

通过find_element_by_css_selector( )函数,选择取百度输入框的id属性来定义

也可以取name属性

<a href="http://news.baidu.com" name="tj_news">新 闻</a>

driver.find_element_by_css_selector("a[name=\"tj_news\"]").click()

可以取title属性

<a onclick="queryTab(this);" mon="col=502&pn=0" title="web" href="http://www.baidu.com/">网页</a>

driver.find_element_by_css_selector("a[title=\"web\"]").click()

也可以是取..:

<a class="RecycleBin xz" href="javascript:void(0);">

driver.find_element_by_css_selector("a.RecycleBin").click()

扩展阅读:

http://www.w3.org/TR/css3-selectors/

http://www.w3school.com.cn/css/css_positioning.asp


xpath

什么是XPath:http://www.w3.org/TR/xpath/

XPath基础教程:http://www.w3schools.com/xpath/default.asp

selenium中被误解的XPath : http://magustest.com/blog/category/webdriver/

XPath是一种在XML文档中定位元素的语言。因为HTML可以看做XML的一种实现,所以selenium用户可是使用这种强大语言在web应用中定位元素。

XPath扩展了上面id和name定位方式,提供了很多种可能性,比如定位页面上的第三个多选框。

xpath:attributer (属性)

driver.find_element_by_xpath("//input[@id='kw']").send_keys("selenium")

#input标签下id =kw的元素

xpath:idRelative (id相关性)

driver.find_element_by_xpath("//div[@id='fm']/form/span/input").send_keys("selenium")

#在/form/span/input 层级标签下有个div标签的id=fm的元素

driver.find_element_by_xpath("//tr[@id='check']/td[2]").click() 

# id为'check' 的tr ,定闪他里面的第2个td

xpath:position (位置)

driver.find_element_by_xpath("//input").send_keys("selenium") 

driver.find_element_by_xpath("//tr[7]/td[2]").click()

#第7个tr 里面的第2个td

xpath: href (水平参考)

driver.find_element_by_xpath("//a[contains(text(),'网页')]").click()

#在a标签下有个文本(text)包含(contains)'网页' 的元素

xpath:link

driver.find_element_by_xpath("//a[@href='http://www.baidu.com/']").click()

#有个叫a的标签,他有个链接href='http://www.baidu.com/ 的元素

link

文字链接时使用。

#coding=utf-8

from selenium import webdriver
import time browser = webdriver.Firefox() browser.get("http://www.baidu.com")
time.sleep(2) browser.find_element_by_link_text("新闻").click()
time.sleep(2)
browser.quit()

partial link text

通过部分链接来定位。只用链接的一部分文字定位。

browser.find_element_by_partial_link_text("新").click()

#通过find_element_by_partial_link_text() 函数,我只用了“新”字,脚本一样找到了"新闻" 的链接

百度首页如果文字链接有“图片”、“地图”,同样使用此操作,未定位出元素。

webdriver(python) 学习笔记三的更多相关文章

  1. Python 学习笔记三

    笔记三:函数 笔记二已取消置顶链接地址:http://www.cnblogs.com/dzzy/p/5289186.html 函数的作用: 給代码段命名,就像变量給数字命名一样 可以接收参数,像arg ...

  2. webdriver(python)学习笔记四——定位一组元素

    webdriver可以很方便的使用find_element方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,这时候就需要使用find_elements方法. 定位一组对象一般用于以下场景: ...

  3. python学习笔记三--字典

    一.字典: 1. 不是序列,是一种映射, 键 :值的映射关系. 2. 没有顺序和位置的概念,只是把值存到对应的键里面. 3. 通过健而不是通过偏移量来读取 4. 任意对象的无序集合 5. 可变长,异构 ...

  4. Python学习笔记三

    一. 为什么要使用函数? 函数可以方便阅读代码. 函数可以减少重复代码. 函数可以减少管理操作,减少修改操作. 二. 函数分类: 内置函数:len()   sum()   max()   min() ...

  5. python学习笔记(三)、字典

    字典是一种映射类型的数据类型.辣么什么是映射呢?如果看过<数据结构与算法>这一本书的小伙伴应该有印象(我也只是大学学习过,嘻嘻). 映射:就是将两个集合一 一对应起来,通过集合a的值,集合 ...

  6. Python学习笔记三:模块

    一:模块 一个模块就是一个py文件,里面定义了一些业务函数.引用模块,可以用import语句导入.导入模块后,通过 模块.函数名(参数)  来使用模块中的函数.如果存在多个同名模块,则前面模块名需要加 ...

  7. python学习笔记(三)高级特性

    一.切片 list.tuple常常截取某一段元素,截取某一段元素的操作很常用 ,所以python提供了切片功能. L=['a','b','c','d','e','f'] #取索引0,到索引3的元素,不 ...

  8. python学习笔记(三):文件操作和集合

    对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句柄操作文件 3.关闭文件. 文件基本操作: f = open('file.txt','r') #以只读方式打开一个 ...

  9. python学习笔记三:函数及变量作用域

    一.定义 def functionName([arg1,arg2,...]): code 二.示例 #!/usr/bin/python #coding:utf8 #coding=utf8 #encod ...

随机推荐

  1. Robot framework+python安装使用图解版

    一.安装包 1.Python2.7(一切的基础,切记安装目录不能有中文不能有空格) 1)python2.7:(python环境):python-2.7.msi 2)setuptools(python包 ...

  2. Linux Versus Windows, Ubuntu/Mint V XP/Vista/7

    原文:http://petermoulding.com/linux_versus_windows_ubuntu_mint_v_xp_vista_7 Linux Versus Windows, Ubun ...

  3. 【Linux高频命令专题(22)】gzip

    概述 减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间.gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用.gzip不仅 ...

  4. application.xml定时

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  5. 在PowerDesigner中设计物理模型3——视图、存储过程和函数

    原文:在PowerDesigner中设计物理模型3--视图.存储过程和函数 视图 在SQL Server中视图定义了一个SQL查询,一个查询中可以查询一个表也可以查询多个表,在PD中定义视图与在SQL ...

  6. Spring IoC — 基于注解的配置

    基于XML的配置,Bean定义信息和Bean实现类本身是分离的,而采用基于注解的配置方式时,Bean定义信息即通过在Bean实现类上标注注解实现. @Component:对类进行标注,Spring容器 ...

  7. Intellij IDEA 快速创建Spring Web 项目

    相关软件: Intellij Idea14:http://pan.baidu.com/s/1nu16VyD JDK7:http://pan.baidu.com/s/1dEstJ5f Tomcat(ap ...

  8. 基于SimHash的微博去重

    一.需求:对微博数据进行去重,数据量比较小,几十万条左右. 二.解决方案 1.采用SimHash的指纹信息去重方法. 三.实现方案 1.对每一条微博使用tf-idf与特征词 2.使用每条微博的特征词, ...

  9. UVa 1453 - Squares 旋转卡壳求凸包直径

    旋转卡壳求凸包直径. 参考:http://www.cppblog.com/staryjy/archive/2010/09/25/101412.html #include <cstdio> ...

  10. Segmentation Fault错误原因总结

    最近在项目上遇到了Segmentation Fault的错误,一直调试不出来是哪里出了问题,对于刚接触嵌入式的,也不知道该如何去调试一个项目,定位内存问题,纠结了好几天,好阿红整理下自己的思路.从头开 ...