1 id 定位 driver.find_element_by_id()

HTML 规定id 属性在HTML 文档中必须是唯一的。这类似于公民的身份证号,具有很强的唯一性

from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://ui.imdsx.cn/uitester/')
driver.maximize_window() #最大化当前窗口
driver.execute_script('window.scrollTo(0,0);')
#执行JavaScript语句,通过js 来操作滚动条
driver.find_element_by_id('i1').send_keys(111)

2 name 定位 driver.find_element_by_name()

HTML 规定name 来指定元素的名称,因此它的作用更像是人的姓名

driver.find_element_by_name('name').send_keys(111)

3 class 定位 driver.find_element_by_class()

HTML 规定class 来指定元素的类名

driver.find_element_by_class_name('classname').send_keys(111)

4 tag 定位(标签名定位) driver.find_element_by_tag_name()

HTML 的本质就是通过tag来定义实现不同的功能,每一个元素本质上也是一个tag

因为一个tag 往往用来定义一类功能,所以通过tag识别某个元素的概率很低

一个页面都会有大量的<div> ,<input> <a> 等tag ,所以很难通过标tag name 去区分不同的元素

driver.find_element_by_tag_name('input').send_keys('tag-name')
#默认写入第一个input 标签内

5 link text 定位(文本定位) driver.find_element_by_link_text()

代码  <a href="http://www.imdsx.cn">跳转大师兄博客地址</a>

driver.find_element_by_link_text('跳转大师兄博客地址').click()

通过上面的代码发现, find_element_by_link_text()方法通过元素标签对之间的文本信息来定位元素

6 partial link 定位 driver.find_element_by_partial_link_text()

partial link 定位是对link 定位的一种补充,有些文本链接会比较长,这个时候可以取文本链接的一部分定位,只要这一部分信息可以唯一地标识这个链接

driver.find_element_by_partial_link_text('师兄博客地址').click()

通过上面的代码发现, find_element_by_partial_link_text()方法也是通过元素标签对之间的文本信息来定位元素

7 Xpath 定位 driver.find_element_by_xpath()

XPath是XML的路径语言,通俗一点讲就是通过元素的路径来查找到这个标签元素

XPath 使用方法

7.1  //* 定位页面下所有元素

7.2  绝对路径定位

7.3 利用元素属性定位

driver.find_element_by_xpath('//input[@placeholder="请通过XPATH定位元素"]')
driver.find_element_by_xpath('//*[@placeholder="请通过XPATH定位元素"]')

//表示当前页面某个目录下

input 表示定位元素的标签名,如果不想指定标签名,用* 代替

[ ] 固定格式

@ 表示引用某样属性

placeholder="请通过XPATH定位元素" 元素的属性值

知识扩展:

使用绝对路径定位的缺点:前端修改层级后,之前的case报废

通过属性定位的方式可以提高容错率

7.4 层级与属性结合(层级过滤)

当标签页重复时,Xpath提供了层级过滤

例如:找不到儿子,那么就先找他的爸爸,实在不行可以再找他的爷爷

//form/div/input[@placeholder="用户名"]

支持通过 / 进行层级递进,找到符合层级关系的标签

一个元素它的兄弟元素跟它的标签一样,这时候无法通过层级定位到。因为都是一个父亲生的,多胞胎兄弟。Xpath提供了索引过滤

通过索引,在List中定位属性,与python的索引有些差别,Xpath从1开始

//select[@name='city'][1]/option[1]
7.5 使用逻辑运算符
如果一个属性不能唯一的区分一个元素,可以使用逻辑运算符连接多个属性来查找元素
//select[@name='city' and @size='4' and @multiple="multiple"]

8 CSS 定位 driver.find_element_by_css_selector()

Css Selector定位实际就是HTML的Css选择器的标签定位

CSS 选择器常用语法如下图:(参考链接 http://www.w3school.com.cn/cssref/css_selectors.asp)

8.1 通过class 属性定位

. 代表通过class属性来定位元素   .c1

Class定位还提供了多个Class定位 通过连续 . 来缩小范围   .c1.c2.c3
 8.2 通过id 属性定位
# 代表通过id 属性来定位元素 #id1
8.3 通过属性定位 
可以使用元素的任意属性,只要这些属性可以唯一标识这个元素 [name='n1']  
8.4 标签属性组合定位
input[name='n1']
input.c1
input#i1
8.5 多属性组合过滤
Css Selector 的多属性组合选择过滤 没有and 只需要多个[] 连接 就可以

select[name='city'][size='4'][multiple="multiple"]
8.6 层级关系定位
Css Selector通过 > 来区分层级的界定

select>option[value='3'] 
知识拓展:
CSS Selector 不支持indexof(角标)定位
定位时先用CSS Selector ,如果需要用角标定位的时候就要XPath

9 用By 定位元素 driver.find_element()

通过查看Webdriver 的底层实现代码发现:

以上八种定位方式,最后都是调用find_element() 方法

它需要两个参数,第一个参数是定位的类型,由BY 提供,第二个参数是定位的具体方式

满足W3C 最后都是通过BY.CSS_SELECTOR 方法定位

底层代码如下:

def find_element(self, by=By.ID, value=None):
"""
'Private' method used by the find_element_by_* methods. :Usage:
Use the corresponding find_element_by_* instead of this. :rtype: WebElement
"""
if self.w3c:
if by == By.ID:
by = By.CSS_SELECTOR
value = '[id="%s"]' % value
elif by == By.TAG_NAME:
by = By.CSS_SELECTOR
elif by == By.CLASS_NAME:
by = By.CSS_SELECTOR
value = ".%s" % value
elif by == By.NAME:
by = By.CSS_SELECTOR
value = '[name="%s"]' % value
return self.execute(Command.FIND_ELEMENT, {
'using': by,
'value': value})['value']
10 以上九种定位方式的复数形式
elements返回list  用角标取值
需要循环的时候用复数形式
driver.find_elements_by_class_name('classname')[0].send_keys('111')

二、定位控件

appium 通过 uiautomatorviewer.bat 工具来查看控件的属性。该工具位于 Android SDK 的 /tools/bin/ 目录下。

1、id 定位

driver.find_element_by_id('resource-id')

# ID定位于selenium不同,可能存在重复的问题。

# appium-desktop抓取元素时如果出现有id,则可以直接用。

# resource-id可能出现重复,需要具体看下有多少个。
2、class name 定位
driver.find_element_by_class_name('class')
# 对应class字段,有可能存在多个相同class。

# 多个相同class,每次获取只取第一个遇到的元素。
3、xpath 定位
driver.find_element_by_xpath('//android.widget.EditText[@text="手机号"]')
# Xpath路径定位,与Web的Xpath定位在有一点点区别

# Native App的定位以class为基准,主要用到参数有text、resource-id、index
4、Accessibility ID定位 --这个方法属于Appium扩展的定位方法
driver.find_element_by_accessibility_id('content-desc')
# Android对应content-desc IOS对应accessibility identifier

# content-desc是给残障人士定义的特殊字段
5、android uiautomator定位 --这个方法属于Appium扩展的定位方法
Android的源生测试框架的定位方式,定位速度快
driver.find_element_by_android_uiautomator('new UiSelector().text("手机号")')
# 匹配全部text文字
driver.find_elements_by_android_uiautomator('new UiSelector().className("android.widget.TextView")')
 
# className
6、iOSPredicateString 
仅支持iOS10以上,可以多个属性同时定位,推荐。(替代XPATH)
driver.find_elements_by_ios_predicate("label == '登录'")

selenium 之定位方法的更多相关文章

  1. selenium各种定位方法(转)

    selenium使用 Xpath CSS JavaScript jQuery的定位方法 (治疗selenium各种定位不到,点击不了的并发症) 2017年07月28日 22:47:36 阅读数:369 ...

  2. python selenium八大定位方法

    一.定位方法 注意:元素属性必须唯一存在 #id定位 find_element_by_id() #name定位 find_element_by_name() #class_name定位 find_el ...

  3. python之selenium元素定位方法

    前提: 大家好,今天我们来学习一下selenium,今天主要讲解selenium定位元素的方法,希望对大家有所帮助! 内容: 一,selenium定位元素 selenium提供了8种方法: 1.id ...

  4. selenium的定位方法-多元素定位

    在实际工作中,有些时候定位元素使用ID.NAME.CLASS_NMAE.XPATH等方法无法定位到具体元素,会发现元素属性有很多一致的,这个时候使用单元素定位方法无法准确定位到具体元素,例如,百度首页 ...

  5. selenium的定位方法-单元素定位

    selenium自动化测试中,提供了单个元素定位方法,多个元素定位方法,2种方式都是根据元素属性:ID.NAME.CLASS_NAME.TAG_NAME.CSS_SELECTOR.XPATH.LINK ...

  6. python selenium(定位方法)

    一.定位方法 注意:元素属性必须唯一存在 #id定位 find_element_by_id() #name定位 find_element_by_name() #class_name定位 find_el ...

  7. selenium自动化定位方法

    用selenium操作浏览器进行自动化操作其实就是通过元素属性执行相关操作.所以,我们要知道怎样去查找元素,定位元素. 常见的定位属性有: #查找元素的id find_elements_by_id(i ...

  8. selenium元素定位方法

    一.如何找到页面元素 Webdriver的findElement方法可以用来找到页面的某个元素,最常用的方法是用id和name查找.下面介绍几种比较常用的方法. 1.1By ID 假设页面写成这样:i ...

  9. selenium元素定位方法之轴定位

    一.轴运算名称 ancestor:祖先结点(包括父结点) parent:父结点 preceding:当前元素节点标签之前的所有结点(html页面先后顺序) preceding-sibling:当前元素 ...

随机推荐

  1. 模拟window桌面实现

    正在开发中的游戏有个全屏功能--可以在window桌面背景上运行,就像一些视频播放器在桌面背景上播放一样的,花了个上午整了个Demo放出来留个纪念. 实现功能:显示图标,双击图标执行相应的程序,右击图 ...

  2. 【BZOJ3425】Poi2013 Polarization 猜结论+DP

    [BZOJ3425]Poi2013 Polarization Description 给定一棵树,可以对每条边定向成一个有向图,这张有向图的可达点对数为树上有路径从u到达v的点对(u,v)个数.求最小 ...

  3. 【BZOJ5083】普及 单调栈+二分+RMQ

    [BZOJ5083]普及 Description 有一个长度为n的字符串,每一位只会是p或j.你需要取出一个子串S(从左到右或从右到左一个一个取出),使得 不管是从左往右还是从右往左取,都保证每时每刻 ...

  4. VC/MFC中通过CWebPage类调用javascript函数(给js函数传参,并取得返回值)

    转自:http://www.cnblogs.com/javaexam2/archive/2012/07/14/2632959.html ①需要一个别人写好的类CWebPage,将其对于的两个文件Web ...

  5. Objective-C代码学习大纲(2)

    2011-05-11 14:06 佚名 otierney 字号:T | T 本文为台湾出版的<Objective-C学习大纲>的翻译文档,系统介绍了Objective-C代码,很多名词为台 ...

  6. LeetCode 笔记系列 14 N-Queen II [思考的深度问题]

    题目: Follow up for N-Queens problem. Now, instead outputting board configurations, return the total n ...

  7. QQ空间发表日志的图片上传功能实现

    w间接促使了用户注意图片的顺序,进一步优化的方向的是手指触动或鼠标点击来同时进行图片的增删和调序,避免精确的数字输入. 有效code <form action="wcon/wact&q ...

  8. zipline整体架构

    在这里可以看出,zipline由下面几个主要的部分构成 名称 说明 TradingAlgorithm 量化策略的抽象,既可以通过初始化传入构造上参数的方式,也可以通过继承的方式构造,其中zipline ...

  9. K线数据库表结构

    -- -- 数据库: `bittrex` -- -- -------------------------------------------------------- -- -- 表的结构 `ltc` ...

  10. MYSQL--表分区、查看分区(转)

    一.       mysql分区简介 数据库分区 数据库分区是一种物理数据库设计技术.虽然分区技术可以实现很多效果,但其主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减sql语句的响应时间, ...