Python语言Selenium库UI自动化测试(一)元素定位方法

简介
当我们日常搭建自动化测试框架时,用Python调用浏览器时,通常有Requests库、Selenium库
这两个库是进行爬虫或者自动化测试时必不可少的,语法都比较简答,这里先介绍Selenium库
Selenium主要分为2部分,Selenium和WebDrive,Selenium和Requests一样,进行API调用等操作,WebDrive是调用浏览器并定位浏览器的元素进行一些操作
我是直接参考官方文档,内容也比较少,就把官方文档里的常用方法梳理出来大家看看了
(官方文档地址:https://docs.seleniumhq.org/docs/03_webdriver.jsp#how-does-webdriver-drive-the-browser-compared-to-selenium-rc)

下面我们来看看一些常用的方法

调用浏览器

这里需要注意的是,我们需要针对不同版本的安装不同的浏览器版本和不同的浏览器驱动,我自己是Selenium 3.14 +Firefox 52 + geckodriver V0.11.1.rar*(https://blog.csdn.net/sevensolo/article/details/93410613)*
网上还有很多其他的,大家可以本地装起来看下

定位UI元素

定位方法的用法:
打开Web页面,查看源代码(可以使用F12或Firebug),可以查看元素的属性

Selenium Webdriver
通常使用findelement或者findelements方法结合By类返回元素句柄来进行元素定位
其中By常用的定位方式有8种:

·By ID
·By Class Name
·By Tag Name
·By Name
·By Link Text
·By Partial Link Textzhi
·By CSS Seletor
·By XPath

这8种定位方式在Python selenium中对应的方法为:

**
· findElement(By.id())
· findElement(By.name())
· findElement(By.className())
· findElement(By.tagName())
· findElement(By.linkText())
· findElement(By.partialLinkText())
· findElement(By.xpath())
· findElement(By.cssSelector())**

By ID

· 官方实例

<div id="coolestWidgetEvah">...</div>

最常用也是最简单的方式,通过id定位UI页面元素

调用方法

element = driver.find_element_by_id("coolestWidgetEvah")orfrom selenium.webdriver.common.by import By
element = driver.find_element(by=By.ID, value="coolestWidgetEvah")

如果你要获取的页面元素标签是id,那么可以通过id来进行定位

· By ID实例

源代码如下:

<html><head><body link="#0000cc"><a id="result_logo" href="/" onmousedown="return c({'fm':'tab','tab':'logo'})"><form id="form" class="fm" name="f" action="/s"><span class="soutu-btn"></span><input id="kw" class="s_ipt" name="wd" value="" maxlength="255" autocomplete="off">

需要定位input标签的输入框
方法如下:

driver.findElement(by.id("kw"))

By Class Name

· 官方实例

  <div class="cheese"><span>Cheddar</span></div><div class="cheese"><span>Gouda</span></div>

如果定位的元素是Class命名的,我们用这个方法,需要注意的是,用Class命名的通常很多元素都是Class,可以仔细看下上面的例子
只是赋予不同的值

调用方法

cheeses = driver.find_elements_by_class_name("cheese")orfrom selenium.webdriver.common.by import By
cheeses = driver.find_elements(By.CLASS_NAME, "cheese")

· By Class Name实例

该方法可以通过元素的标签名称来查找元素。该方法跟之前两个方法的区别是,这个方法搜索到的元素通常不止一个,所以一般建议结合使用findElements方法来使用。比如我们现在要查找页面上有多少个button,就可以用button这个tagName来进行查找
源代码如下:

<button type="button" class="el-button el-button--primary el-button--medium" style="width: 100%; height: 42px; margin-top: 12px;"><!----><!----><span>登 录</span></button>

想要定位登录元素方法如下:

driver.findElement(By.className("el-button el-button--primary el-button--medium"))

注意:使用className来进行元素定位时,有时会碰到一个元素指定了若干个class属性值的“复合样式”的情况,如下面这个button:登录。这个button元素指定了三个不同的css伪类名作为它的样式属性值,此时就必须结合后面要介绍的cssSelector方法来定位了,稍后会有详细例子。

By Tag Name

· 官方实例

<iframe src="..."></iframe>

如果使用的是Tag Name,我们用这个方法

frame = driver.find_element_by_tag_name("iframe")orfrom selenium.webdriver.common.by import By
frame = driver.find_element(By.TAG_NAME, "iframe")

· By Tag Name实例

该方法可以通过元素的标签名称来查找元素。该方法跟之前两个方法的区别是,这个方法搜索到的元素通常不止一个,所以一般建议结合使用findElements方法来使用。
源代码:

<input type="password" autocomplete="off" name="password" placeholder="请输入登录密码" class="el-input__inner">

另外,在使用tagName方法进行定位时,还有一个地方需要注意,通常有些HTML元素的tagName是相同的,单选框、复选框、文本框和密码框的元素标签都是input,此时单靠tagName无法准确地得到我们想要的元素,需要结合type属性才能过滤出我们要的元素

需要定位密码输入框

driver.findElement(By.tagName("el-input__inner"))# 过滤出想要的元素for i in inputs:if type = 'password'pass

By Name

· 官方实例

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

定位方法

cheese = driver.find_element_by_name("cheese")orfrom selenium.webdriver.common.by import By
cheese = driver.find_element(By.NAME, "cheese")

· By Name实例
源代码如下:

<input type="text" autocomplete="off" name="username" placeholder="请输入用户名登录" class="el-input__inner">

需要定位输入用户名输入框
方法如下:

driver.findElement(By.name("username"))

By Link Text

· 官方实例

<a href="http://www.google.com/search?q=cheese">cheese</a>>

定位方法

cheese = driver.find_element_by_link_text("cheese")orfrom selenium.webdriver.common.by import By
cheese = driver.find_element(By.LINK_TEXT, "cheese")

· By Link Text实例

这个方法是通过超文本链接上的文字信息来定位元素,这种方式一般专门用于定位页面上的超文本链接。
超文本链接源代码:

<a href="/wi_user_register.php" style="float: right; line-height: 22px; color: rgb(96, 98, 102); font-size: 15px;"><span style="float: left; margin-right: 3px;">立即注册</span><span class="sanjiao"></span></a>

需要定位注册元素
代码如下:

driver.findElement(By.linkText("立即注册"))

By Partial Link Text

· 官方实例

<a href="http://www.google.com/search?q=cheese">cheese</a>>

定位方法

cheese = driver.find_element_by_link_text("cheese")orfrom selenium.webdriver.common.by import By
cheese = driver.find_element(By.LINK_TEXT, "cheese")

By Partial Link Text实例

这个方法是By Link Text的扩展。当不能确定超链接的文本信息或者只通过一些关键字进行匹配时,可以使用这个方法进行匹配

<a href="/wi_user_register.php" style="float: right; line-height: 22px; color: rgb(96, 98, 102); font-size: 15px;"><span style="float: left; margin-right: 3px;">立即注册</span><span class="sanjiao"></span></a>

需要定位注册元素
代码如下:

driver.findElement(By.partialLinkText("立"))
driver.findElement(By.partialLinkText("即"))
driver.findElement(By.partialLinkText("注"))
driver.findElement(By.partialLinkText("册"))

By CSS

· 官方实例

<div id="food"><span class="dairy">milk</span><span class="dairy aged">cheese</span></div>

定位方法

cheese = driver.find_element_by_css_selector("#food span.dairy.aged")orfrom selenium.webdriver.common.by import By
cheese = driver.find_element(By.CSS_SELECTOR, "#food span.dairy.aged")

By CSS实例

cssSelector元素定位方式跟xpath比较类似,但执行速度较快,而且各种浏览器对它的支持很到位
百度首页为例

单一属性定位:

# type selector 定位
driver.find_element_by_css_selector('input')# id定位
driver.find_element_by_css_selector('#kw')# class定位
driver.find_element_by_css_selector('.s_ipt')# 其他属性定位
driver.find_element_by_css_selector('[name='wd']')
driver.find_element_by_css_selector("[type='text']")

组合属性定位:

# id组合属性定位
driver.find_element_by_css_selector("input#kw")# class组合属性定位
driver.find_element_by_css_selector("input.s_ipt")# 其他属性组合定位
driver.find_element_by_css_selector("input[name='wd']")# 仅有属性名,没有值也可以
driver.find_element_by_css_selector("input[name]")# 两个其他属性组合定位
driver.find_element_by_css_selector("[name='wd'][autocomplete='off']")

层级定位:

# E>F    E下面的F这个元素
#id是form的form下面的span下面的input
driver.find_element_by_css_selector('from#form>span>input')
# E:nth-child(n)
# E:nth-last-child(n),如字面意思:倒数第几个标签
# E:first-child,第一个标签
# E:last-child,最后一个标签
# E:only-child,唯一的标签

By XPath

需要注意的是XPath需要安装XPath寻找器,我FireFox上装的是XPath Finder这个插件

· 官方实例

<input type="text" name="example" />
<INPUT type="text" name="other" />

使用方法

inputs = driver.find_elements_by_xpath("//input")orfrom selenium.webdriver.common.by import By
inputs = driver.find_elements(By.XPATH, "//input")

· By XPath实例

XPath是XML Path的简称,由于HTML文档本身就是一个标准的XML页面。这个方法是非常强大的元素查找方式,使用这种方法几乎可以定位到页面上的任意元素。
XPath,这里只简单介绍,需要深入了解的,可以自己找资料学下,附上w3school的学习地址
http://www.w3school.com.cn/xpath/xpath_syntax.asp

Xpath的路径分为:
绝对路径 /
相对路径 //

Xpath路径应用举例:

 # 使用绝对路径By.xpath("html/body/div/form/input")# 使用相对路径By.xpath("//input//div")# 使用元素定位By.xpath("//input[4]")# 使用xpath相对路径和节点属性定位By.xpath("//input[@id='kw']")By.xpath("//input[@type='name' and @name='kw']")# 使用部分属性值匹配(最强大方法)By.xpath("//input[start-with(@id,'nice')]")By.xpath("//input[start-with(@id,'很漂亮')]")By.xpath("//input[start-with(@id,'很美丽')]")# 所有方法混合使用By.xpath("//input[@id='kw1']//input[start-with(@id,'nice']/div[1]/form[3])

注意: XPath的定位方式,webdriver会将整个页面的所有元素进行扫描以定位我们所需要的元素,所以这是一个非常费时的操作,如果你的脚本中大量使用xpath做元素定位的话,将导致你的脚本执行速度大大降低,所以请慎用。

UI自动化测试之元素定位方法相关推荐

  1. Web UI自动化测试之元素定位

    目前,在自动化测试的实际应用中,接口自动化测试被广泛使用,但UI自动化测试也并不会被替代.让我们看看二者的对比: 接口自动化测试是跳过前端界面直接对服务端的测试,执行效率和覆盖率更高,维护成本更低,整 ...

  2. Python+selenium自动化八大元素定位方法及实例(超详细)

    目录 一.selenium模块中的find_element_by_id方法无法使用 二.Python+selenium自动化八大元素定位方法 使用场景: 1.通过id属性定位:driver.find_ ...

  3. UI自动化之元素定位(xpath、css)

    很早之前就已经写过自动化了,不过点着功能久了就会容易忘记元素定位,尤其是xpath和css定位,所以就花点时间做下总结收集. xpath有两种定位: 一.绝对路径(不推荐使用,除非已经使用了所有方式仍 ...

  4. Appium移动端自动化测试之元素定位(三)

    1.name定位 driver.find_element_by_id('com.shanjian.originaldesign:id/edit_Tel').send_keys('15817252876 ...

  5. selenium自动化常用元素定位方法

    一.选择界面元素 根据元素的特征选择:ID,Name,Class,TagName,link_text 根据元素的特征和关系:css,xpath 二.如何选择界面元素 1.存在ID属性的元素,可通过 i ...

  6. Android app UI自动化测试 常用的元素定位方法

    本文简要介绍了移动端Android APP进行UI自动化测试时,常用到的元素定位方法 目录 前言 一.通过resource-id定位 二.通过class name定位 三.通过accessibilit ...

  7. UI自动化测试之八大元素定位方法(最新版)

    Selenium-UI自动化测试之八大元素定位方法(最新版) 前言 UI界面本质上就是HTML直接体现,脚本通过HTML标签信息来找到具体的元素. 元素定位:通过代码调用方法查找元素 一.ID定位 概 ...

  8. Python+Appium自动化测试之toast定位

    目录 一. 前言 二. 环境 三. toast定位准备与定位方法 1. 准备 2. 定位方法 四. 示例代码 一. 前言 在app自动化测试的过程中经常会遇到需要对toast进行定位,最常见的就是定位 ...

  9. App控件定位:Android 控件介绍及元素定位方法

    本文将分享Android相关基础知识和Android APP控件定位工具的使用方法. 目录 Android基础知识 Android布局 Android四大组件 1.activity 2.Service ...

最新文章

  1. CentOS No manual entry for man 没有 xx 的手册页条目
  2. 【深度学习】动漫风格迁移AnimeGANv2,发布线上运行Demo
  3. Apriori关联规则算法
  4. matlab均线程序化交易,【策略分享】Matlab量化交易策略源码分享
  5. vb6编写dll读取dat文件_【STM32Cube_15】使用硬件I2C读取温湿度传感器数据(SHT30)...
  6. 使用XMLHttpRequest发送POST数据
  7. Android必知必会-使用Intent打开第三方应用及验证可用性
  8. clearcase 常用命令
  9. 苹果11相机权限开启不了_iOS11 访问相册、相机权限,居然变化了,巨坑啊........
  10. 【CV】计算机视觉领域的 GAN 模型综述论文笔记
  11. python拼图_利用python制作拼图小游戏的全过程
  12. MATLAB---三维绘制函数实例介绍
  13. 如何过滤出已知当前目录下/llj中的所有一级目录?
  14. R329开发板根目录 ls 命令文件和文件名乱码其他目录不乱码问题解决
  15. 我的世界基岩版好还是java版好_【Minecraft/我的世界】Java版和基岩版的区别(1)...
  16. storm trident
  17. ArcGIS三维网络分析
  18. 如何查询某只股票的历史股价?
  19. 阴虚火旺有什么症状 吃什么调理
  20. 理解C语言(零) 导读(下):有用的C语言工具-从Make说起

热门文章

  1. 非技术人员应该学习SQL的3个原因
  2. 2021年美容师(初级)找解析及美容师(初级)模拟考试题
  3. 关于Redis 启动命令
  4. DS二叉树—二叉树结点的最大距离
  5. linux 服务器版 树莓派 加桌面,给Ubuntu服务器版安装GNOME桌面
  6. 一文读懂Rust的async
  7. 过勇 清华计算机系,清华 16 位学霸为此事 PK 简历吓坏网友
  8. bootstrap 布局大屏,pc,小屏,移动屏自适应
  9. 一位沪飘 7 年程序员的悲催 2020!
  10. 理财型保险-不值得购买的保险