selenium-元素的定位
前戏
元素的定位是自动化测试的核心,要想操作一个元素,首先应该识别这个元素。Webdriver 提供了一系列的元素定位方法,常用的有 id,name,class name,link text,partial link,tag name,xpath,css
讲定位之前先要了解说一下怎么定位,我们打开百度的首页,按F12,打开开发者工具,大概就是这个样子,点击Element,这里就是前端写的HTML代码,你在页面上所看到的页面就是通过HTML语言和CSS等前端语言展示在浏览器中的
其实所有的定位,底层 都是通过css来定位的,以下是它的源代码
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']
id定位
小需求:
打开百度首页,在搜索框里输入 selenium,python 等关键词,然后
点击搜索按钮,查看搜索页面
from selenium import webdriver
from time import sleep drive = webdriver.Chrome()
drive.get('http://www.baidu.com')
sleep(3)
drive.find_element_by_id("kw").send_keys("selenium python") # 通过 id 定位到搜索框,发送值 selenium python,find_element_by_id 查找元素通过 id
sleep(3)
drive.find_element_by_id("su").click() # 通过 id 定位到搜索按钮,点击
sleep(3)
drive.quit()
这样就通过id定位到搜索框,通过send_keys给搜索框里传了selenium python关键字,然后定位到百度一下的按钮,click()点击
name定位
from selenium import webdriver
from time import sleep drive = webdriver.Chrome()
drive.get('http://www.baidu.com')
sleep(3)
drive.find_element_by_name("wd").send_keys("英语") # 通过 name定位到搜索框,发送值英语,
sleep(3)
drive.find_element_by_id("su").click() # 通过 id 定位到搜索按钮,点击
sleep(3)
drive.quit()
tag_name定位
tag_name就是通过标签名定位
from selenium import webdriver
from time import sleep drive = webdriver.Chrome()
drive.get('http://www.imooc.com')
drive.find_element_by_tag_name('input').send_keys('python') # 定位标签名为 input 的第一个元素
drive.find_elements_by_tag_name('input')[0].send_keys('python') # 定位标签名为 input 的元素,返回第一个
sleep(3)
drive.quit()
一般不通过标签名定位,因为他是从上到下依次取的
class_name
通过class属性值定位
from selenium import webdriver
from time import sleep drive = webdriver.Chrome()
drive.get('http://www.baidu.com')
drive.find_element_by_class_name('s_ipt').send_keys('selenium')
drive.find_element_by_id('su').click()
sleep(3)
drive.quit()
通过超链接定位 link_text
selenium提供了两种超链接定位方式,第一种是链接文字(全部),第二种也是链接文字(部分文字)
from selenium import webdriver
from time import sleep driver = webdriver.Chrome()
driver.get('http://www.imooc.com')
driver.maximize_window()
driver.find_element_by_link_text('免费课程').click()
sleep(3)
driver.find_element_by_partial_link_text('后端').click() # 通过部分文字定位
driver.quit()
CSS定位
Selenium 推荐使用 css 定位,而不是 xpath 来定位元素,原因是 css 定
位比 xpath 定位速度快,语法也更加简洁
Css 常用方法定位
(1) find_element_by_css_selector()
(2) #id id 选择器根据 id 属性来定位元素
(3) .class class 选择器,根据 class 属性值来定位元素
(4) [attribute=’value’] 根据属性来定位元素
(5) element>element 根据元素层级来定位 父元素>子元素
来具体看两个例子
例子一:
from selenium import webdriver
from time import sleep driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element_by_css_selector("#kw").send_keys('python') # 通过 id=kw 定位到
driver.find_element_by_css_selector('.s_ipt').send_keys('selenium') # 通过 class =s_ipt 定位 driver.find_element_by_css_selector("[autocomplete='off']").send_keys('python') # 通过属性 autocomplete=off 定位
driver.find_element_by_css_selector('#su').click()
sleep(2)
driver.quit()
例子二:
from selenium import webdriver
from time import sleep driver = webdriver.Chrome()
driver.get("http://www.baidu.com") driver.find_element_by_css_selector("[autocomplete='off']").send_keys('python') # 通过属性 autocomplete=off 定位 driver.find_element_by_css_selector('form#form>span>input').send_keys('')
# 通过层级定位到输入框,先定位到id=form 的上级标签 form 上,在定位到下级 span 上,最后定位到第一个 input 标签
driver.find_element_by_css_selector('#su').click()
sleep(2)
driver.quit()
不知道大家看懂上面的定位方式了没,官方说比较简洁,但是我没觉得哪里简洁,我只是在学的时候用过CSS定位,在实际的工作中从来没有用过CSS定位。也许我比较菜吧,啊哈哈哈哈哈
当然。css还有其他的用法
目的:查找第一个div标签下的“查询”按钮
html>body>div>input[value='查询']
python定位语句
driver.find_element_by_css_selector("html>body>div>input[value='查询']")
通过">"符号分割,区别于XPath路径中的正斜杠(/),并且也不在使用@符号选择属性
2.使用相对路径定位
目的:查找第一个div标签下的“查询”按钮
input[value='查询']
python定位语句
driver.find_element_by_css_selector("input[value='查询']")
3.使用class名称定位元素
目的:查找第一个div标签下的input输入框
driver.find_element_by_css_selector(".spread")
4.使用id属性值定位
目的:查找第一个div标签下ID属性值为"div1input"的input页面元素
driver.find_element_by_css_selector("#div1nput")
5.使用页面其他属性值定位
目的:查找第一个div标签下的第一张图片img
(1):img[alt="div1-img1"]
(2):img[alt="div1-img1"][href="http://www.sogou.com"]
python定位语句
driver.find_element_by_css_selector('img[alt="div1-img1"][href="http://www.sogou.com"]')
(1)和(2)在本例中是等价的,(2)是使用了多个属性定位
6.使用属性值的一部分内容定位元素(貌似只能定位超链接)
目的:在被测网页中,查找“搜狗搜索”的链接
表达式1:a[href^="http://www.so"]
表达式2:a[href$="gou.com"]
表达式3:a[href*="so"]
python定位语句
driver.find_element_by_css_selector('a[href^="http://www.so"]')
表达式1表示匹配链接地址开始包含"http://www.so"关键字的链接元素,^表示从字符串的开头匹配
表达式2表示匹配链接地址开始包含"gou.com"关键字的链接元素,$表示从字符串的结尾匹配
表达式3表示匹配链接地址开始包含"so"关键字的链接元素,*表示需要进行模糊匹配
匹配动态变化的属性值
7.使用页面元素进行子页面元素的查找
目的:在被测网页中,查找第一个div下的第一个input标签
表达式1:div#div1>input#div1input
表达式2:div input
python定位语句
driver.find_element_by_css_selector('div#div1>input#div1input')
表达式1中的div#div1,表示在被测网页上定位到ID属性为div1的div标签,“>”表示在已查找到的div元素的子页面中进行查找,input#div1input表示查找ID属性值为div1input的input标签
表达式2表示匹配所有属于div元素后代的input元素,父元素div和子元素input间必须用空格分隔
8.使用伪类定位元素
目的:在被测网页中,查找第一个div下的指定子页面元素
表达式1:div#div1 :first-child
表达式2:div#div1 :nth-child(2)
表达式3:div#div1 :last-child
表达式4:input:focus
表达式5:input:enabled
表达式6:input:checked
表达式7:input:not([id])
python定位语句:
driver.find_element_by_css_selector('input:not([id])')
前三个表达式要注意,在冒号(:)前一定要有一个空格,否则就会定位不到期望的页面元素
表达式1:表示查找ID属性值为div1的div页面元素下的第一个子元素,参考被测网页的HTML可以看到定位的页面元素是input元素,first-child表示查找某个页面元素下的第一个子页面元素
表达式2:表示查找ID属性值为div1的div页面元素下的第二个子元素,参考被测网页的HTML可以看到定位的页面元素是链接元素,nth-child(2)表示查找某个页面元素下的第二个子页面元素,nth-child(3)表示查找某个页面元素下的第三个子页面元素 ,以此类推
表达式3:表示查找ID属性值为div1的div页面元素下的最后一个子元素,参考被测网页的HTML可以看到定位的页面元素是按钮元素,last-child表示查找某个页面元素下的最后一个子页面元素
表达式4:表示查找当前获取焦点的input页面元素
表达式5:表示查找可操作的input页面元素
表达式6:表示查找处于勾选状态的checkbox页面元素
表达式7:表示查找所有无id属性的input页面元素
9.查找同级兄弟页面元素
目的:在被测网页中,查找第一个div下第一个input子页面元素的同级兄弟页面元素
表达式1:div#div1>input+a
表达式2:div#div1>input+a+img
表达式3:div#div1>input+*+img
表达式4:ul#recordlist>p~li
表达式1表示在ID属性值为div1的div页面元素下,查找input页面元素后面的同级且临近的链接元素a
表达式2表示在ID属性值为div1的div页面元素下,查找input页面元素和链接元素后面的同级且临近的图片元素img
表达式3表示在ID属性值为div1的div页面元素下,查找input页面元素和元素后面的同级且临近的图片元素img ,*表示任意类型的一个页面元素,只能表示一个页面元素,如果想用此种方法查找第一个div下的最后一个input元素,表达式写法为
div#div1>input+*+*+input或div#div1>input+a+*+input或div#div1>input+a+img+input
表达式4表示子ID属性值为recordlist的ul页面元素下,查好p页面元素以后所有的li元素
10.多元素选择器
目的:在被测网页中,同时选择多个不同的页面元素
div#div,input,a
表示查找所有ID属性值为div1的div元素,所有的input元素,所有的a元素
下节来讲下xpath定位,也是我使用最多的定位,xpath定位功能十分的强大
selenium-元素的定位的更多相关文章
- python+selenium 元素被定位到而且click()也提示执行成功,但是页面就是没有变化和跳转。
python+selenium 元素被定位到而且click()也提示执行成功,但是页面就是没有变化和跳转. 如果多次定位和click(),有时候会跳转. 我遇到很多次就是很郁闷,有人说,操作太快的,页 ...
- python+selenium+bs4爬取百度文库内文字 && selenium 元素可以定位到,但是无法点击问题 && pycharm多行缩进、左移
先说一下可能用到的一些python知识 一.python中使用的是unicode编码, 而日常文本使用各类编码如:gbk utf-8 等等所以使用python进行文字读写操作时候经常会出现各种错误, ...
- selenium 元素可以定位到,但是无法点击问题
报错1: selenium.common.exceptions.WebDriverException: Message: Element is not clickable at point (82, ...
- UI自动化测试(二)浏览器操作及对元素的定位方法(xpath定位和css定位详解)
Selenium下的Webdriver工具支持FireFox(geckodriver). IE(InternetExplorerDriver).Chrome(ChromeDriver). Opera( ...
- selenium元素定位篇
Selenium webdriver是完全模拟用户在对浏览器进行操作,所有用户都是在页面进行的单击.双击.输入.滚动等操作,而webdriver也是一样,所以需要我们指定元素让webdriver进行单 ...
- 学习总结——Selenium元素定位
读一本好书,不能读读就算了,做一下总结,变成自己的,以备查阅. 1. driver.findElement(By.id(<element ID>)) ID是独一无二的,使用 ...
- python selenium 元素定位(三)
上两篇的博文中介绍了python selenium的环境搭建和编写的第一个自动化测试脚本,从第二篇的例子中看出来再做UI级别的自动化测试的时候,有一个至关重要的因素,那就是元素的定位,只有从页面上找到 ...
- selenium元素定位大全
要做自动化,首先要了解页面结构,要了解页面结构,就要了解页面元素的定位方法 在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合B ...
- 史上最全!Selenium元素定位的30种方式
Selenium对网页的控制是基于各种前端元素的,在使用过程中,对于元素的定位是基础,只有准去抓取到对应元素才能进行后续的自动化控制,我在这里将对各种元素定位方式进行总结归纳一下. 这里将统一使用百度 ...
- 自动化测试基础篇--Selenium元素定位
摘自https://www.cnblogs.com/sanzangTst/p/7457111.html 一.Selenium元素定位的重要性: Web自动化测试的操作:获取UI页面的元素,对元素进行操 ...
随机推荐
- 看后端程序员调试CORS的姿势
# 目录 为什么有同源策略? 需要解决的问题 CORS跨域请求方案 preflight withCredentials 附:高效.优雅地调试CORS实现 为什么有同源策略? 同源策略Sam ...
- Lightoj1018 【状压DP】
题意: 给你一个坐标系,坐标系上有N个点,然后让你用最少的线,把这些点全部连起来: 思路: (1+15)*15/2=90条线: 然后线上有哪些点就可以知道: 然后按照线上点的个数排序,然后删掉这个线, ...
- HDU 3501【欧拉函数拓展】
欧拉函数 欧拉函数是指:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) . 通式:φ(x)=x*(1-1/p1)(1-1/p2)(1-1/p3)*(1-1/p4)-..(1- ...
- 【OpenJ_Bailian - 2795】金银岛(贪心)
金银岛 Descriptions: 某天KID利用飞行器飞到了一个金银岛上,上面有许多珍贵的金属,KID虽然更喜欢各种宝石的艺术品,可是也不拒绝这样珍贵的金属.但是他只带着一个口袋,口袋至多只能装重量 ...
- java数据结构----带权图
1.带权图:要引入带权图,首先要引入最小生成树,当所有的边拥有相同的权值时.问题变得简单了,算法可以选择任意一条边加入最小生成树.但是当边有不同的权值时,需要用一些算法决策来选择正确的边. 2.带权图 ...
- AtCoder Regular Contest 078 C
C - Splitting Pile Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statement Snu ...
- #113. 【UER #2】手机的生产
链接:http://uoj.ac/problem/113 由于电信技术的发展,人人都可以通过手机互相联系. 有一位电信大佬最近想生产一大批手机,然而从生产线上一台一台地生产实在太慢了,于是他想出了一个 ...
- SpringBoot 2.x (9):整合Mybatis注解实战
SSM框架再熟悉不过了,不过以前通常是使用XML写SQL语句 这里用SpringBoot整合Mybatis并且使用注解进行开发 依赖: <!-- Mybatis --> <depen ...
- redis和memcache
redis安装:($sudo apt-get update,$sudo apt-get install redis-server) redis启动:($redis-server): 查看redis是否 ...
- HTTP 三次握手 建立连接 和 四次握手断开连接
三次握手建立连接 第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机: 第二次握手:主机B收到请求后要确 ...