selenium 之定位方法

1 id 定位 driver.find_element_by_id()

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

from selenium import webdriverdriver = 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 == ‘登录‘")

原文地址:https://www.cnblogs.com/klb561/p/9315147.html

时间: 2024-11-09 00:36:35

selenium 之定位方法的相关文章

selenium元素定位方法介绍

元素定位方法 元素名称 webdriver API id find_element_by_id() name find_element_by_name() class name find_element_by_class_name() tag name find_element_by_tag_name() link text find_element_by_link_text() partial link text find_element_by_partial_link_text() xpat

python+selenium button定位方法

报错内容: selenium.common.exceptions.ElementClickInterceptedException 元素: 解决方法2种: 1. tijiao=driver.find_element_by_xpath("html/body/div[12]/div[2]/div[1]/div[1]/div[3]/div[1]/button[2]/span") driver.execute_script("arguments[0].click();",t

3 Python+Selenium的元素定位方法(id、class name、name、tag name)

[环境] Python3.6+selenium3.0.2+IE11+Win7 [定位方法] 1.通过ID定位 方法:find_element_by_id('xx') 2.通过name定位 方法:find_element_by_name('xx') 3.通过class name定位 方法:find_element_by_class_name('xx') 4.通过tag name定位 方法:find_element_by_tag_name('xx') 说明:tag name在html中是标签的名字,

selenium webdriver 表格的定位方法练习

selenium webdriver 表格的定位方法 html 数据准备 <html> <body> <div id="div1"> <input name="divl1input"></input> <a href="http://www.sogou.com/">搜狗搜索</a> <img alt="div1-img1 "src=&qu

[python爬虫] Selenium常见元素定位方法和操作的学习介绍

这篇文章主要Selenium+Python自动测试或爬虫中的常见定位方法.鼠标操作.键盘操作介绍,希望该篇基础性文章对你有所帮助,如果有错误或不足之处,请海涵~ 前文目录: [Python爬虫] 在Windows下安装PhantomJS和CasperJS及入门介绍(上) [Python爬虫] 在Windows下安装PIP+Phantomjs+Selenium [Python爬虫] Selenium自动访问Firefox和Chrome并实现搜索截图 [Python爬虫] Selenium实现自动登

selenium自动化测试——常见的八种元素定位方法

selenium常用的八种元素定位方法 1.通过 id 定位:find_element_by_id() 2.通过 name 定位:find_element_by_name() 3.通过 tag 定位:find_element_by_tag_name() 4.通过 class 定位:find_element_by_class_name() 5.通过 css 定位:find_element_by_css_selector() 6.通过 link 定位:find_element_by_link_tex

selenium定位方法

selenium的webdriver提供了八种基本的元素定位方法,前面六种是通过元素的属性来直接定位的,后面两种需要借助firepath插件来定位:1.通过id定位:find_element_by_id()eg:driver.find_element_by_id("kw").send_keys("python")2.通过name定位:find_element_by_name()3.通过class定位:find_element_by_class_name()4.通过t

selenium使用Xpath+CSS+JavaScript+jQuery的定位方法(治疗selenium各种定位不到,点击不了的并发症)

[第一部分]开篇:先认识Xpath的4种定位方法 跟你说,你总是靠那个firebug,chrome的F12啥的右击复制xpath绝对总有一天踩着地雷炸的你死活定位不到,这个时候就需要自己学会动手写xpath,人脑总比电脑聪明,开始把xpath语法给我学起来! 第1种方法:通过绝对路径做定位(相信大家不会使用这种方式) By.xpath("html/body/div/form/input") By.xpath("//input") 第2种方法:通过元素索引定位 By.

selenium的元素定位方法-By

如果在定位元素属性中包含了如ID等元素属性,那么在一个测试中,定位方法具体有哪几种,可以参考by模块中的By类,By的代码如下: class By(object): """ Set of supported locator strategies. """ ID = "id" XPATH = "xpath" LINK_TEXT = "link text" PARTIAL_LINK_TEXT