Selenium库

用于web应用程序的测试工具
模拟手工操作浏览器,进行自动化测试

特点

  1. 开源免费
  2. 多浏览器支持 —Chrome、IE、FireFox等
  3. 多平台支持 — Windows、Linux都支持
  4. 支持分布式测试(Grid)
  5. 支持录制回放和脚本生成(IDE)

Selenium三剑客

  1. WebDriver
  2. IDE 支持录制回放和脚本生成
  3. Grid 支持分布式测试

官方文档

  • https://selenium-python.readthedocs.io/index.html
  • https://seleniumhq.github.io/selenium/docs/api/py/api.html

webdriver工作原理
通过浏览器的driver与浏览器进行通信.(传令兵,把我们的指令通过webdriver传递给浏览器,同时把浏览器的返回结果进行定位、操作、获取属性信息等)

配置环境
pip install selenium
下载webdriver(与浏览器的种类和版本匹配)
Chrome:http://chromedriver.storage.googleapis.com/index.html
Firefox:https://github.com/mozilla/geckodriver/releases/
下载好后解压
1.放置到python的安装目录
2.放置在项目中的专门目录

使用selenium

进入网址,进入到网站后显示5秒钟,5秒之后关闭浏览器

# 想操作浏览器导入webdriver的包就可以,不用导入selenium中所有的包
from selenium import webdriver
from time import sleep# 初始化一个driver(要加括号)
driver = webdriver.Chrome()
# 访问乐博商城的网址
driver.get("http://shop.pro.17lebo.com")#这时我就可以控制浏览器了,能控制浏览器就可以操纵要测试的软件了
#……# 沉睡5秒钟
sleep(5)
# 退出当前标签页
# driver.close()
# 退出整个浏览器  不关闭浏览器,浏览器会越来越多
driver.quit()


webdriver的功能

  1. 能访问浏览器
  2. 能设置浏览器的窗口大小 无界面时也有效
# 最大化
driver.maximize_window()
# 最小化
driver.minimize_window()
# 设置窗口大小
driver.set_window_size(800, 600)
  1. 控制前进、后退
from selenium import webdriver
from time import sleep# 初始化一个driver(要加括号)
driver = webdriver.Chrome()
# 访问乐博商城的网址
driver.get("http://shop.pro.17lebo.com")# 设置浏览器的大小
# 最大化
driver.maximize_window()
# 控制前进。后退
# 打开乐博官网
driver.get("http://www.17lebo.com")
sleep(3)
# 后退  去上一个页面
driver.back()
sleep(3)# 前进  去下一个页面
driver.forward()
sleep(3)
  1. 截图
# 浏览器截图
driver.get_screenshot_as_file("浏览器截图3.png")

  1. 刷新页面
# 刷新页面
driver.refresh()
  1. 关闭浏览器
driver.quit()
  1. 关闭当前页面
driver,close()
  1. 获取页面属性


浏览器的无界面操作
每次运行的时候都会出现浏览器,有的时候不想让浏览器出现,就用到无界面操作
无界面模式下默认不是全屏,默认大小是800*600

# 浏览器的无界面操作
# 用来保存各种webdriver的配置项
opt = webdriver.ChromeOptions()
opt.headless = True
# 初始化一个driver(要加括号)
driver = webdriver.Chrome(options=opt)

Selenium定位页面元素

UI自动化测试,从定位页面元素开始
8大定位方法

  1. id
  2. name
  3. class name:class的名
  4. tag name:标签名
  5. link text:链接的文字内容
  6. partial link text:这个link text包含的一部分内容
  7. xpath
  8. css selector

find_element()和find_elements()

name定位

item = driver.find_element_by_name("wd")
item.send_keys("手机")

可以看到是定位成功并且已经输入我想要搜索的内容了

但是提示了最好不要使用find_element_by_*,selenium4.0以后就无法使用了

所以用find_element()代替

from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
# 访问乐博商城的网址
driver.get("http://shop.pro.17lebo.com")
item = driver.find_element(By.NAME, "wd")
item.send_keys("手机")


By.name实际就是传的name,同理,By.id就是传的id
所以可以直接传name

item = driver.find_element("name", "wd")
item.send_keys("手机")

id定位

item = driver.find_element("id", "search-input")
item.send_keys("手机")

class定位
我想定位百宝箱,然后点击

item = driver.find_element("class name", "navigation-main-quick")
item.click()

点击百宝箱后底部弹框,说明点击成功

tag name定位
多少有点不靠谱,因为重名的太多了
标签名定位,需要确认这个页面只有一个这个标签,才用标签定位,否则定位出来的就不止一个了

item = driver.find_element("tag name", "input")
item.send_keys("手机")

如果当前页面有多个同样的标签,就要用find_elements(),这时,返回的就是一个列表了,如果要引用其中的一个元素,就要加索引
比如:

item = driver.find_elements("tag name", "input")
item[1].send_keys("手机")

link text定位
link是通过链接的文字定位,点一下会跳转到另外的页面

item = driver.find_element("link text", "登录")
item.click()

partial link text定位
和link text差不多,只是这个是通过链接的文字内容的一部分进行定位,而不是全部内容
还是点击登录跳转,我只要链接中的“录”字就可以定位到了

item = driver.find_element("partial link text", "录")
item.click()

id、 name、 class name、tag name、 link text、partial link text这些定位方法都是理想的情况下,能通过这些定位,都是有要求的,有局限性。如果标签中没有这些属性,就没法通过这些来定位了。
xpath和css selector定位是万能定位,功能强大,css selector比xpath的速度快

xpath定位
xpath就是XML path language
专门在xml文档中对元素和属性进行遍历
xpath是可以拷贝的
相对定位://*[@id=“search-input”]
绝对定位(严重不推荐):/html/body/div[3]/div/div[3]/form/div/input
xpath的语法结构:xpath = //tagname[@Attribute = ‘value’]

  1. 斜线/双斜线 查找范围或查找方式
    /表示绝对定位
    //表示相对定位
  2. tagname 标签名称
    *代表所有标签
    具体的标签名称:h、p、input、div、button、a…
    当标签名不足以唯一的选择出来时,后面可以加条件[ ]
  3. [ ]选择条件
    @Attribute 用属性进行选择 id、name、class…
    用函数选择
    属性+函数

只用标签名后面不跟选择条件

# xpath的选择条件只用标签名定位
items = driver.find_elements("xpath", "//p")
for i in items:print(i.text)

xpath的选择条件只用标签名定位的执行结果,只用标签名一般都会定位到很多东西

选择条件用id

# 选择条件用id
item = driver.find_element("xpath", "//input[@id='search-input']")
item.send_keys("找到一个//input[@id=search-input]")

选择条件用name

# 选择条件用name
item = driver.find_element("xpath", "//input[@name='wd']")
item.send_keys("找到xpath为//input[@name='wd']的元素")


选择条件用class+层级关系

# 选择条件用class
# 这个元素的class不是唯一的,所以可以用层级关系来辅助定位
# 因为要定位的是一个input 而input的class不是唯一的,所以找到input上一级的class,input上一级是一个div,把这个div写出来,然后后面再加一个input
# 这个class在整个页面中不是唯一的,但是在这个div中是唯一的
item = driver.find_element("xpath", "//div[@class='search-group']/input")
item.send_keys("找到xpath为//div[@class='search-group']/input的元素")


text() 函数
用属性前面有@符,用函数前面没有@符

# text属性
# 先找到输入框元素
item = driver.find_element("xpath", "//div[@class='search-group']/input")
# 在输入框中输入手机
item.send_keys("手机")
# 找到搜索按钮(已经精确到文字内容了,所以前面标签名可以用通配符*)
search = driver.find_element("xpath", "//*[text()='搜索']")
# 点击搜索
search.click()

这时已经进到手机页了

使用索引
没有办法唯一定位的时候可以使用索引

item = driver.find_element("xpath", "//div[@class='search-group']/input")
item.send_keys("手机")
item = driver.find_elements("xpath", "//button")
item[0].click()

多条件组合
当中括号中一个条件已经不足以确定元素的时候,就可以输入多个条件

# 多条件组合
item = driver.find_element("xpath", "//input[@type = 'text' and @placeholder = '其实搜索很简单^_^ !']")
item.send_keys("电脑")


常用函数
contains() 包含XXX

# 常用函数之包含XXX——contains()
item = driver.find_element("xpath", "//input[contains(@placeholder,'^_^')]")
item.send_keys("电脑")

starts-with() 以XXX开头

# 以XXX开头——starts-with()
item = driver.find_element("xpath", "//input[starts-with(@placeholder,'其实')]")
item.send_keys("电脑")

……

轴 (相对查找. 找 父节点,祖父节点)
语法:
轴名称::节点测试[谓语]

轴名称 结果
ancestor 选取当前节点的所有先辈(父、祖父等)。
ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身。
attribute 选取当前节点的所有属性。
child 选取当前节点的所有子元素。
descendant 选取当前节点的所有后代元素(子、孙等)。
descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following 选取文档中当前节点的结束标签之后的所有节点。
namespace 选取当前节点的所有命名空间节点。
parent 选取当前节点的父节点。
preceding 选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling 选取当前节点之前的所有同级节点。
self 选取当前节点。

css selector定位
css定位是selenium首推的定位方式,因为css定位的速度快。项目小的时候无所谓,项目大的时候速度快是很重要的。
几乎很难发现找到某一个元素没有class没有样式的,所有网页里显示的都系几乎都会有样式,没有样式会特别丑。所以css选择器定位很方便,总会定位出来想要的元素。

css和xpath的比较:

  1. 速度比xpath快
  2. 语法简洁

css选择器用id定位

# css selector定位
# 用id定位   #代表id
item = driver.find_element("css selector", "#search-input")
item.send_keys("手机")

用name定位

# 用name定位  input是我要定位元素的标签
item = driver.find_element("css selector", "input[name='wd']")
item.send_keys("手机")

用class name定位
class name定位的一般都会出现一堆,而不是一个,所以要通过索引定位

# class name定位  .代表class
items = driver.find_elements("css selector", ".outer")
items[2].click()

要定位的元素有多个class时

# 多个class
item = driver.find_element("css selector", "[class='am-text-truncate name']")
item.click()

用其他属性定位

# 用其他属性定位 三种都可以
# item = driver.find_element("css selector", "input[placeholder='其实搜索很简单^_^ !']")
# item = driver.find_element("css selector", "*[placeholder='其实搜索很简单^_^ !']")
item = driver.find_element("css selector", "[placeholder='其实搜索很简单^_^ !']")
item.send_keys("手机")

多个属性组合

item = driver.find_element("css selector", "input[placeholder='其实搜索很简单^_^ !'][autocomplete='off']")
item.send_keys("手机")

部分属性定位
包含 *=

# 包含  *=
item = driver.find_element("css selector", "input[placeholder *= '很简']")
item.send_keys("手机")

以XXX开始 ^=

# 以XXX开始   ^=
item = driver.find_element("css selector", "input[placeholder ^= '其实']")
item.send_keys("手机")

以XXX结束 $=

# 以XXX结束  $=
item = driver.find_element("css selector", "input[placeholder $= '!']")
item.send_keys("手机")

层级关系 >
上下一级关系,顶头上司

# 层级关系 >    div是父级,input是子级
item = driver.find_element("css selector", "div[class='search-group']>input")
item.send_keys("电脑")

后代关系 用空格
上下多级关系,越级领导

# 后代关系   用空格
item = driver.find_element("css selector", "div[class='am-container'] input")
item.send_keys("电脑")

兄弟选择器

# 兄弟选择器 找到div中class为word的元素,在这个元素里面找到a标签,冒号后面代表要找第几个a标签的元素
# 找第一个
# item = driver.find_element("css selector", "div[class='word']>a:first-child")
# 找第三个
# item = driver.find_element("css selector", "div[class='word']>a:nth-child(3)")
# 找最后一个
item = driver.find_element("css selector", "div[class='word']>a:last-child")
item.click()

层级与class组合

# 层级与class组合
item = driver.find_element("css selector", "div.search-bar>form>div>input")
item.send_keys("电脑")

selenium官方文档 CSS定位

css选择器常用的语法

选择器 例子 例子描述
.class .intro 选择 class=“intro” 的所有元素。
#id #firstname 选择 id=“firstname” 的所有元素。
* * 选择所有元素。
element p 选择所有 < p > 元素。
element,element div,p 选择所有 < div> 元素和所有 < p> 元素。
element element div p 选择 < div> 元素内部的所有 < p> 元素。
element>element div>p 选择父元素为 < div> 元素的所有 < p> 元素。
element+element div+p 选择紧接在 < div> 元素之后的所有 < p> 元素。
[attribute] [target] 选择带有 target 属性所有元素。
[attribute=value] [target=_blank] 选择 target=“_blank” 的所有元素。
[attribute~=value] [title~=flower] 选择 title 属性包含单词 “flower” 的所有元素。
[attribute I= value] [lang I= en] 选择 lang 属性值以 “en” 开头的所有元素。

多个元素的情况

在有些特殊情况就需要定位多个元素,然后挨个去进行操作
还有可能就是实在无法定位到唯一的元素了,找不到条件了,那就只能定位多个元素然后通过索引定位到要用的元素

items = driver.find_elements("class name", "outer")
for item in items:# 打印出所有的元素print(item.text)
# 然后就可以根据对应的索引进行定位,然后操作了
items[1].click()

获取页面中元素的属性值

items = driver.find_elements("class name", "outer")
# 获取页面元素的属性值
print(items[2].get_attribute("name"))
print(items[2].get_attribute("type"))
print(items[2].get_attribute("class"))

有的有有的没有,有值的会打印出来,没有的会显示为空

页面元素的交互操作

点击:click()
输入:send_keys()
清除:clear()
等等……

UI自动化之Selenium介绍、Selenium定位方法相关推荐

  1. [python爬虫] Selenium常见元素定位方法和操作的学习介绍(转载)

    转载地址:[python爬虫] Selenium常见元素定位方法和操作的学习介绍 一. 定位元素方法 官网地址:http://selenium-python.readthedocs.org/locat ...

  2. python selenium UI自动化解决验证码的4种方法

    测试环境 windows7+ firefox50+ geckodriver # firefox浏览器驱动 python3 selenium3 selenium UI自动化解决验证码的4种方法:去掉验证 ...

  3. selenium八大元素定位方法

    selenium八大元素定位方法 定位方式一 定位方式二 定位方式一 定位方式二 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与 ...

  4. 曲鸟全栈UI自动化教学(三):Selenium页面操作原理及如何高效的进行元素定位

    一.前言 上篇文章中我们成功编写并启动了第一个selenium脚本.那Selenium是怎样知道我们想要操作哪个元素的呢? 这篇文章将为你讲解Selenium的页面操作原理和高效的元素定位方法. 文章 ...

  5. Selenium中元素定位方法详细介绍

    一.元素定位基本方法 1.如何进行元素定位? 元素:由标签头 + 标签尾 + 标签头和标签尾包括的文本内容: 元素的信息就是指元素的标签名及元素的属性: 元素的层级结构就是指元素之间相互嵌套的层级结构 ...

  6. 在 UI 自动化中调用浏览器 API 的方法与使用场景

    背景 事情的背景是最近在新项目中做 UI 自动化, 就想调研一下如何与浏览器的 API 交互获取一些额外的信息以在 case 失败的时候获取一些额外的信息帮助 debug. 后来就又慢慢延伸到了前端性 ...

  7. UI自动化之driver.Tap坐标定位

    相信做UI自动化的小伙伴都知道,appium不是左右页面的元素都能定位的到的,尤其是原生中嵌套了H5页面,所有这个时候我们可以通过坐标定位的方式去解决,理论上坐标定位可以解决所有的元素识别问题,但有一 ...

  8. Python+Selenium UI自动化 - alert/confirm/prompt窗口处理方法

    WebDriver中处理原生JS的alert.confirm以及prompt非常方便,三种弹出窗口均无法直接通过页面元素定位,不关闭窗口无法在页面上做其他操作 语法:         text:返回a ...

  9. 曲鸟全栈UI自动化教学(四):Selenium工作原理及Webdriver对浏览器的配置和操作

    一.前言 上篇文章我们学习了Selenium页面操作原理及如何高效的进行元素定位 那Selenium的工作原理又是什么?是如何驱动浏览器的呢?这篇文章为你讲解Selenium工作原理及Webdrive ...

  10. 基于selenium和xpath定位方法爬取某个话题下的微博内容!是真的强!

    为什么这期要叫暴力爬虫呢?因为笔者认为基于selenium方法非常的简单粗暴!!理由有两点: 1.在selenium方法下,我们可以通过调用浏览器驱动来实现模拟鼠标点击.滑轮下滑以及输入文本等操作,就 ...

最新文章

  1. 华为策略路由加等价路由_两个ISP接入路由,双路由接入华为S5700交换机,实施策略路由...
  2. RNA-seq分析流程
  3. Unit Test测试框架中的测试的执行顺序
  4. 日记-致我那易逝的时光
  5. 清除linux缓存命令
  6. Android中如何使控件保持固定宽高比
  7. 导师推荐,本周开课 | 第 5 期临床基因组家系分析,同时解决科研和临床问题
  8. 【BZOJ3295】动态逆序对,CDQ分治/BIT套权值线段树
  9. 郑大远程计算机组成在线测试,《郑大远程电路在线测试答案》.doc
  10. 第三回 Bootstrap3.x 起步
  11. 7.25 8figting!
  12. 直播视频网站源码,静态时钟
  13. 100个必会的python脚本-python100例,python经典例题
  14. 三四五线城市商机无限,但创业更适合在一线城市
  15. linux趋势杀毒安装目录,趋势杀毒软件在AX3.0上的安装
  16. Unity中自制Animation+播放完毕相应事件
  17. 普通人现在入局做抖音短视频晚么 选择项目的标准是什么
  18. 机载LIDAR技术及其应用
  19. Excel文件格式和扩展名不匹配
  20. 我的世界服务器清道夫不显示,我的世界清道夫指令 | 手游网游页游攻略大全

热门文章

  1. 2021“遇见未来”千锋十周年冬令营活动全国四地火热开启
  2. Android Bilibili网站数据获取一 题目分类获取
  3. 超市会员管理系统,数据库课程设计
  4. 前端培训——html源码笔记
  5. [转]提交表单后 PHP获取提交内容 的方法
  6. python学习笔记_第21天(文件操作--IO 技术)
  7. java 椭圆拟合,OpenCV画轮廓的外界圆矩形椭圆等
  8. linux系统模块全选快捷键,Linux的150个命令和快捷键 整理
  9. SQL Server 创建登录名和用户名【详细介绍】
  10. 计算机网络--边缘和核心部分,三种数据交换方式