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')

Selenium 之18 种定位方式的更多相关文章

  1. selenuim中18种定位方式

    18种定位方式=8种单数形式+8种复数形式+2种底层方案 单数可以确定唯一,复数无法确定: 单数形式定位,返回的是一个元素,复数形式,返回的是一个列表,返回的是当前页面所有符合要求的元素,没有意义 一 ...

  2. Selenium学习之==>18种定位方式的使用

    Selenium的定位方式一共有18种,单数8种,复数8种,最后两种是前面这16种的底层封装 单数形式8种 # 1.id定位 al = driver.find_element_by_id('i1') ...

  3. selenium WebDriver 八种定位方式源码

    /* * 多种元素定位方式 */ package com.sfwork; import java.util.List; import org.openqa.selenium.By; import or ...

  4. selenium基础--五种定位方式

    find_element_by_name find_element_by_id find_element_by_xpath find_element_by_link_text find_element ...

  5. Selenium WebDriver 8大定位方式

    Selenium WebDriver 8大定位方式: driver.find_element_by_id() driver.find_element_by_name() driver.find_ele ...

  6. Android中几种定位 方式

    介绍的几种定位方式 http://www.cnblogs.com/cuihongyu3503319/p/3863867.html 百度地图api: http://lbsyun.baidu.com/in ...

  7. android 三种定位方式

    http://www.cnblogs.com/oudi/archive/2012/03/22/2411509.html 最近在看android关于定位的方式,查了很多资料,也做了相关实验,在手机上做了 ...

  8. Java + Selenium + WebDriver八大元素定位方式

    UI自动化测试的第一步就是进行元素定位,下面给大家介绍一下Selenium + WebDriver的八大元素定位方式.现在我们就以百度搜索框为例进行元素定位,如下图: 一.By.name() Java ...

  9. Selenium&Appium四种等待方式

    一.摘要 本博文主要介绍自动化测试中,无论是selenium或是Appium的四种等待方式,合理的使用等待对代码的稳定性,测试效率都有很大的提高 隐式等待:是在尝试发现某个元素的时候,如果没能立刻发现 ...

随机推荐

  1. [Linux] du-查看文件夹大小-并按大小进行排序

    reference : http://blog.csdn.net/jiaobuchong/article/details/50272761# 某天,我想检查一下电脑硬盘的的使用情况,作为一个命令控,废 ...

  2. 如何修改容器内的/etc/resolv.conf

    源由不表,暂且略过. 直接说workaround. 因为openshift的模式,/etc/resolv.conf是在pod生成的时候插入的,写入的是宿主机的ip作为dns的寻址,如果需要修改的化,需 ...

  3. 用指令来构建IIS7

    工作上要部署iis7+net4.0环境,发现30多台机子都没有用装有IIS7镜像来安装,都必须自己手动. 作为程序猿,真要一台台装的话,就真对不起自己的职业.于是想到用bat来执行任务,找到了安装II ...

  4. Python爬虫(3)豆瓣登录

    前面(1)(2)的内容已经足够爬虫如链家网之类的不需要登录可以直接获取数据的网站. 而要爬取社交网站比较鲜明的特点就是需要登录,否则很多东西都无法获取.经过测试发现,微博,知乎都不是很好登录,知乎有时 ...

  5. swfupload js中 file 对象的属性

    name=3cc68cfc60b87e6dd6887d8a.jpg modificationdate=Wed   Apr 21 15:48:30 UTC+0800 2010 filestatus=-1 ...

  6. Cognos TM1_10.1.1服务端配置

    场景:本文继Cognos TM1_10.1.1服务端安装 之后,简单的说一下本人对简单配置的拙见,确保服务端在安装过程一切正常,成功安装. 1:进入TM的Cognos Configuration 2: ...

  7. sar详解(linux/unix通用)

    转载:http://www.toxingwang.com/linux-unix/2027.html sar是linux和unix通用的性能报告工具,常用命令组合如下: sar 命令行的常用格式: sa ...

  8. centos下docker网络桥接

    停止服务 停止docker0网卡 Ip link set dev docker0 down 删除docker0 Brctl delbr docker0 进入到网卡的配置文件创建桥接网络br0 Brct ...

  9. 《tortoisegit》 Network error:Connection refused

    在用tortoisegit克隆的时候,或者push的时候出现错误提示: 尝试修改:c:\windows\system32\drivers\etc\services 中的ssh端口,但是发现是22端口, ...

  10. 同步网络时间到linux服务器(先修改时区再进行同步网络时间)

    查看时区:date -R 修改整个系统时区: rm -f /etc/localtime ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 网 ...