Selenium定位元素操作示例


Posted in Python onAugust 10, 2018

本文实例讲述了Selenium定位元素操作。分享给大家供大家参考,具体如下:

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。

在前面一篇《Selenium基本用法》中简单记录了Selenium的使用,接下来记录一下元素的定位,Selenium提供了多种策略来定位页面中的元素,Selenium提供了以下方法来定位页面中元素,你可以根据自己的喜好来进行选择:

  • find_element_by_id:通过ID进行匹配查找,只返回匹配到的一个元素
  • find_element_by_name:通过name进行匹配查找,只返回匹配到的一个元素
  • find_element_by_xpath:通过xpath进行匹配查找,只返回匹配到的一个元素
  • find_element_by_link_text:通过链接内容进行匹配查找,只返回匹配到的一个元素
  • find_element_by_partical_link_text:通过部分链接内容进行匹配查找,只返回匹配到的一个元素
  • find_element_by_tag_name:通过标签名称进行匹配查找,只返回匹配到的一个元素
  • find_element_by_class_name:通过class名称进行匹配查找,只返回匹配到的一个元素
  • find_element_by_css_selector:通过CSS选择器进行匹配查找,只返回匹配到的一个元素

值得注意的是,上面方法只会匹配查找只会获取第一个元素。除了上面这些查找单个元素的方法之外,Selenium还定义查找多个元素的方法:

  • find_elements_by_name:通过name进行匹配查找,返回所有匹配到的元素列表
  • find_elements_by_xpath:通过xpath进行匹配查找,返回所有匹配到的元素列表
  • find_elements_by_link_text:通过链接内容进行匹配查找,返回所有匹配到的元素列表
  • find_elements_by_partical_link_text:通过部分链接内容进行匹配查找,返回所有匹配到的元素列表
  • find_elements_by_tag_name:通过标签名称进行匹配查找,返回所有匹配到的元素列表
  • find_elements_by_class_name:通过class名称进行匹配查找,返回所有匹配到的元素列表
  • find_elements_by_css_selector:通过CSS选择器进行匹配查找,返回所有匹配到的元素列表

除了上面给出的公有方法之外,Selenium还提供了两种私有方法可能对页面对象中的定位器有用,这两个私有方法是:find_elementfind_elements

from selenium.webdriver.common.by import By
element = driver.find_element(By.XPATH,'//*[@id="su"]')
elements = driver.find_elements(By.XPATH,'//button')

下面是By可用的属性:

ID = 'id'
NAME = 'name'
XPATH = 'xpath'
LINK_TEXT = '链接内容'
PARTIAL_LINK_TEXT = '部分链接内容'
TAG_NAME = '标签名称'
CLASS_NAME = '类名'
CSS_SELECTOR = 'CSS选择器'

通过ID定位

当你知道元素的ID属性时,你可以使用它,使用此策略,将返回ID属性值与该匹配的第一个元素。如果没有元素匹配到此ID属性,将会引发NoSuchElementException错误,举个栗子,有这样一个数据源:

<input id="login_id" type="text"/>

我们知道了这个元素的ID,我们可以这样进行定位:

element = driver.find_element_by_id('login_id')

通过name定位

当你知道元素的name属性时,你可以使用它,使用此策略,将返回name属性值与该匹配的第一个元素。如果没有元素匹配到此name属性,将会引发NoSuchElementException错误,举个栗子,有这样一个数据源:

<input name="login" type="text"/>

我们知道了这个元素的name,我们可以这样进行定位:

element = driver.find_element_by_name('login')

通过XPath定位

XPath是用于在XML文档中查找节点的语言,由于XML可以是HTML的实现,因此Selenium用户可以利用这种强大的语言来定位其Web应用程序中的元素。XPath扩展了通过id和name属性定位的简单方法,并打开了各种新的可能性,例如在页面中查找第三个复选框。举个栗子,有这样一个数据源:

<html>
 <body>
 <form id="loginForm">
  <input name="username" type="text" />
  <input name="password" type="password" />
  <input name="continue" type="submit" value="Login" />
  <input name="continue" type="button" value="Clear" />
 </form>
</body>
<html>

我们可以这样进行定位:

user_element = driver.find_element_by_xpath("/html/body/form/input[@name='username']")

或者

user_element = driver.find_element_by_xpath("/html/body/form/input")

或者

user_element = driver.find_element_by_xpath('//input[1]')

或者

user_element = driver.find_element_by_xpath("//input[@name='username'][@type='text']")

通过链接内容定位

当你知道链接元素的内容时,你可以使用它,使用此策略,将返回链接内容与该匹配到的第一个元素。如果没有元素匹配到此链接内容,将会引发NoSuchElementException错误,举个栗子,有这样一个数据源:

<html>
 <body>
 <p>Are you sure you want to do this?</p>
 <a href="continue.html" rel="external nofollow" rel="external nofollow" >Continue</a>
 <a href="cancel.html" rel="external nofollow" >Cancel</a>
</body>
<html>

其中<a href="continue.html" rel="external nofollow" rel="external nofollow" >Continue</a>元素可以这样定位:

element = driver.find_element_by_link_text('Continue')

或者

element = driver.find_element_by_partical_link_text('Con')

通过标签名称定位

当你知道标签的名称时,你可以使用它,使用此策略,将返回标签名称与该匹配到的第一个元素。如果没有元素匹配到此标签名称时,将会引发NoSuchElementException错误,举个栗子,有这样一个数据源:

<html>
 <body>
 <h1>Welcome</h1>
 <p>Site content goes here.</p>
</body>
<html>

我们可以这样对<p>元素进行定位:

element = driver.find_element_by_tag_name("p")

通过类名进行定位

当你知道类名的时候,你可以使用它,使用此策略,将返回类名与该匹配到的第一个元素。如果没有元素匹配到此类名称时,将会引发NoSuchElementException错误,举个栗子,有这样一个数据源:

<html>
 <body>
 <p class="content">Site content goes here.</p>
</body>
<html>

我们可以这样对<p>元素进行定位:

element = driver.find_element_by_class_name('content')

通过CSS选择器进行定位

当你想通过CSS选择器语法找到一个元素时,你可以使用它,使用此策略,将返回匹配CSS选择器的第一个元素。如果没有元素匹配到此CSS选择器时,将会引发NoSuchElementException错误,举个栗子,有这样一个数据源:

<html>
 <body>
 <p class="content">Site content goes here.</p>
</body>
<html>

我们可以这样对<p>元素进行定位:

element = driver.find_element_by_css_selector('body p')

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python 查找字符串是否存在实例详解
Jan 20 Python
浅谈pyhton学习中出现的各种问题(新手必看)
May 17 Python
详解django中使用定时任务的方法
Sep 27 Python
详解django+django-celery+celery的整合实战
Mar 19 Python
python装饰器简介---这一篇也许就够了(推荐)
Apr 01 Python
Python实现微信好友的数据分析
Dec 16 Python
Python sqlalchemy时间戳及密码管理实现代码详解
Aug 01 Python
Python使用socket_TCP实现小文件下载功能
Oct 09 Python
python实现磁盘日志清理的示例
Nov 05 Python
python爬虫使用scrapy注意事项
Nov 23 Python
python Matplotlib基础--如何添加文本和标注
Jan 26 Python
Python Django搭建文件下载服务器的实现
May 10 Python
判断python字典中key是否存在的两种方法
Aug 10 #Python
详解python的sorted函数对字典按key排序和按value排序
Aug 10 #Python
Selenium(Python web测试工具)基本用法详解
Aug 10 #Python
Python生成器generator用法示例
Aug 10 #Python
python 字典修改键(key)的几种方法
Aug 10 #Python
详解python 注释、变量、类型
Aug 10 #Python
python文件操作之批量修改文件后缀名的方法
Aug 10 #Python
You might like
本地机apache配置基于域名的虚拟主机详解
2013/08/10 PHP
PHP二维数组排序简单实现方法
2016/02/14 PHP
php版微信支付api.mch.weixin.qq.com域名解析慢原因与解决方法
2016/10/12 PHP
PHP合并两个或多个数组的方法
2019/01/20 PHP
asp.net+jquery滚动滚动条加载数据的下拉控件
2010/06/25 Javascript
扩展jquery实现客户端表格的分页、排序功能代码
2011/03/16 Javascript
file模式访问网页时iframe高度自适应解决方案
2013/01/16 Javascript
js函数名与form表单元素同名冲突的问题
2014/03/07 Javascript
Ubuntu中搭建Nodejs开发环境过程分享
2014/06/01 NodeJs
JQuery 在线引用及测试引用是否成功
2014/06/24 Javascript
JSON.stringify转换JSON时日期时间不准确的解决方法
2014/08/08 Javascript
jQuery插件scroll实现无缝滚动效果
2015/04/27 Javascript
JS从数组中随机取出几个数组元素的方法
2016/08/02 Javascript
AngularJS入门教程之数据绑定原理详解
2016/11/02 Javascript
React Native 图片查看组件的方法
2018/03/01 Javascript
Node.js如何对SQLite的async/await封装详解
2019/02/14 Javascript
vue实现计步器功能
2019/11/01 Javascript
vant picker+popup 自定义三级联动案例
2020/11/04 Javascript
[02:23]2016国际邀请赛中国区预选赛wings晋级之路
2016/06/29 DOTA
[55:03]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.20
2020/11/20 DOTA
Python入门之modf()方法的使用
2015/05/15 Python
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
2018/01/09 Python
Python读写docx文件的方法
2018/05/08 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
Python正则表达式实现简易计算器功能示例
2019/05/07 Python
Python 3.8新特征之asyncio REPL
2019/05/28 Python
解决django xadmin主题不显示和只显示bootstrap2的问题
2020/03/30 Python
一款利用html5和css3动画排列人物头像的实例演示
2014/12/05 HTML / CSS
canvas如何绘制钟表的方法
2017/12/13 HTML / CSS
Public Desire美国/加拿大:全球性的在线鞋类品牌
2018/12/17 全球购物
iKRIX意大利网上商店:男女豪华服装和配件
2019/10/09 全球购物
mysql_pconnect()和mysql_connect()有什么区别
2012/05/25 面试题
买房协议书
2014/04/11 职场文书
信用卡工资证明格式
2014/09/13 职场文书
2019公司管理制度
2019/04/19 职场文书
详解CSS开发过程中的20个快速提升技巧
2021/05/21 HTML / CSS