Selenium 详细教程

selenium 简介

Selenium是最广泛使用的开源Web UI(用户界面)自动化测试套件之一。它最初由Jason Huggins于2004年开发,作为Thought Works的内部工具。 Selenium支持跨不同浏览器,平台和编程语言的自动化。

Selenium可以轻松部署在Windows,Linux,Solaris和Macintosh等平台上。 此外,它支持iOS(iOS,Windows Mobile和Android)等移动应用程序的OS(操作系统)。

Selenium通过使用特定于每种语言的驱动程序支持各种编程语言。Selenium支持的语言包括C#,Java,Perl,PHP,Python和Ruby。目前,Selenium Web驱动程序最受Java和C#欢迎。 Selenium测试脚本可以使用任何支持的编程语言进行编码,并且可以直接在大多数现代Web浏览器中运行。 Selenium支持的浏览器包括Internet Explorer,Mozilla Firefox,Google Chrome和Safari。

Selenium的发展经历了三个阶段,第一个阶段,也就是selenium1的时代,在运行selenium1.0程序之前,我们得先启动selenium server端(selenium remote control),我们简称RC。RC主要包括三个部分:launcher,http proxy,selenium core。其中selenium core是被selenium server嵌入到浏览器页面中的,selenium core内部是一堆javascript函数构成,通过调用这些函数来实现对浏览器的各种操作。

很显然比较繁琐,这并不是最佳自动化解决方案,于是后来有了webdriver。

selenium2 的时代合并了webdriver,也就是我们通常说的selenium,selenium2是默认支持Firefox浏览器的,这点非常方便。当然也支持其他更多浏览器,Ie和chrome浏览器需要下载驱动包,并添加到环境变量下。

selenium3 是2016年十月份左右出来的,并且现在默认安装都是selenium3了,selenium3在selenium2的基础上做了一些调整,最明显的区别就是 selenium2对Firefox的支持最高只支持46及以下版本。selenium3可以支持47以上版本,但是需要下载geckodriver.exe驱动,并添加到环境变量path下。

Selenium目前主要包括以下几个套件:

Selenium IDE IDE是一个Firefox插件,可以录制用户的基本操作,生成测试用例。随后可以运行这些测试用例在浏览器里回放,可将测试用例转换为其他语言的自动化脚本。
Selenium RC RC为核心部分。它使用的编程语言,如Java,C#,PHP,Python、Ruby和Perl强大功能来创建更复杂的测试。Selenium RC 分 为 C l i e n t Libraries(编写测试脚本) 和 Selenium Server(控制浏览器行为)。
Selenium WebDriver WebDriver前身是Selenium RC,可以看作是Selenium RC的替代品,直接发送命令给浏览器,并检索结果。2
Selenium Grid 网格用于运行在不同的机器,不同的浏览器并行测试的工具,目的在于加快测试用例运行的速度,从而减少测试运行的总时间。利用Grid可以很方便地实现在多台机器上和异构环境中运行测试用例。

代码环境

python: 3.6 版本

selenium:2.0 版本

Chrome: 87.0.4280.88 版本

chromedriver: 87.0.4280.88 版本

chromedriver

介绍

​ 操作google浏览器需要先安装驱动,Chrome浏览器版本和 chromedriver 驱动版本需要对应。

下载:

驱动链接
驱动链接
Chrome离线版本

安装说明
  1. 解压下载的文件;
  2. chromedriver.exe 驱动放到python根目录下(python.exe同路径);
验证是否成功:

执行代码后无报错,则驱动安装成功:

from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.quit()

定位方法

id定位

定位属性中带有 id 属性的元素

<input id='kw' >
driver.find_element_by_id('kw')
name定位

定位属性中带有 name 属性的元素

<input name='kw1' >
driver.find_element_by_name('kw1')
tag name 定位

定位页面上的标签,一般情况标签都会重复(不推荐)

注意: 一般页面上标签一样的很多,通过标签无法直接定位到某个元素。

通常用于定位一组元素

<input name='kw1' >
driver.find_element_by_tag_name('input')
link定位 | partial link定位

定位标签中带有文本内容的

partial link 可以模糊匹配

<a href="http://news.baidu.com" target="_blank" class="mnav">新闻</a>
driver.find_element_by_link_text('新闻')
driver.find_element_by_partial_link_text('新')
class定位

定位标签中带有class属性的

class属性有空格是多重属性,取其中一个就行

<a class='na' name='kw1'>新闻 </a>
driver.find_element_by_class_name('na')
xpath 定位

XPath 是一种在XML 文档中定位元素的语言。

// 表示当前页面某个目录下,input 表示定位元素的标签名,[@id=‘kw’] 表示这个元素的id 属性值等于kw;如果不想指定标签名也可以用星号(*)代替, . 表示当前节点。

driver = webdriver.Firefox()
url = "http://www.baidu.com/"
driver.get(url)
driver.find_element_by_xpath("//input[@id='kw']")
css定位

CSS(Cascading Style Sheets)是一种语言,它被用来描述HTML 和XML 文档的表现

driver = webdriver.Firefox()
url = "http://www.baidu.com/"
driver.get(url)
driver.find_element_by_css_selector("#kw")
复数定位

定位到的是一组元素,返回的是list队列,下标是从1开始计数。

id复数定位 find_elements_by_id(self, id_)
name复数定位 find_elements_by_name(self, name)
class复数定位 find_elements_by_class_name(self, name)
tag复数定位 find_elements_by_tag_name(self, name)
link复数定位 find_elements_by_link_text(self, text)
partial_link复数定位 find_elements_by_partial_link_text(self, link_text)
xpath复数定位 find_elements_by_xpath(self, xpath)
css复数定位 find_elements_by_css_selector(self, css_selector

快失传了的定位

它需要两个参数,第一个参数是定位方式,这个由By 提供;第二个参数是定位的值。

from selenium.webdriver.common.by import By

find_element(By.ID, ‘‘kw’’)
find_elements(By.NAME, ‘wd’)

xpath

什么是xpath呢?

官方介绍:XPath即为XML路径语言,它是一种用来确定XML1标准通用标记语言3的子集)文档中某部分位置的语言。反正小编看这个介绍是云里雾里的,通俗一点讲就是通过元素的路径来查找到这个元素的,相当于通过定位一个对象的坐标,来找到这个对象。

表达式 描述
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
选取当前节点的父节点。
@ 选取属性。
  1. xptah也可以通过元素的idnameclass这些属性定位
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.find_element_by_xpath("//*[@id='kw']")        # id属性
driver.find_element_by_xpath("//*[@name='wd']")		 # name属性
driver.find_element_by_xpath("//*[@class='s_ipt']")  # class属性
  1. 其它属性定位方法
driver.find_element_by_xpath("//*[@autocomplete='off']")  # 其他属性
  1. 标签

1.有时候同一个属性,同名的比较多,这时候可以通过标签筛选下,定位更准一点

2.如果不想制定标签名称,可以用*号表示任意标签

3.如果想制定具体某个标签,就可以直接写标签名称

driver.find_element_by_xpath("//input[@autocomplete='off']")  # 其他属性
driver.find_element_by_xpath("//input[@id='kw']")             # id属性
  1. 层级

1.如果一个元素,它的属性不是很明显,无法直接定位到,这时候我们可以先找它老爸(父元素)

2.找到它老爸后,再找下个层级就能定位到了

3.要定位的是input这个标签,它的老爸的id=s_kw_wrap.

4.要是它老爸的属性也不是很明显,就找它爷爷id=form

5.于是就可以通过层级关系定位到

driver.find_element_by_xpath("//span[@id='s_kw_wrap']/input")    # 父级
driver.find_element_by_xpath("//form[@id='form']/span/input")    # 祖父级
  1. 索引

1.如果一个元素它的兄弟元素跟它的标签一样,这时候无法通过层级定位到。因为都是一个父亲生的,多胞胎兄弟。

2.虽然双胞胎兄弟很难识别,但是出生是有先后的,于是可以通过它在家里的排行老几定位到。

3.用xpath定位老大、老二和老三(这里索引是从1开始算起的,跟Python的索引不一样)

driver.find_element_by_xpath("//select[@id='nr']/option[1]")    # 第一个
driver.find_element_by_xpath("//select[@id='nr']/option[2]")    # 第二个
driver.find_element_by_xpath("//select[@id='nr']/option[3]")    # 第三个
  1. 逻辑运算

1.xpath还有一个比较强的功能,是可以多个属性逻辑运算的,可以支持与(and)、或(or)、非(not)

2.一般用的比较多的是and运算,同时满足两个属性

driver.find_element_by_xpath("//*[@id='kw' and @autocomplete='off']")
  1. 模糊匹配

1.xpath还有一个非常强大的功能,模糊匹配

2.掌握了模糊匹配功能,基本上没有定位不到的

3.比如我要定位百度页面的超链接“hao123”,在上一篇中讲过可以通过by_link,也可以通过by_partial_link,模糊匹配定位到。当然xpath也可以有同样的功能,并且更为强大。

driver.find_element_by_xpath("//*[contains(text(), 'hao123')]")   # 模糊匹配
driver.find_element_by_xpath("//*[contains(@id, 'kw')]")          # 模糊匹配某属性
driver.find_element_by_xpath("//*[starts-with(@id, 's_kw_')]")    # 模糊匹配以什么开头
driver.find_element_by_xpath("//*[ends-with(@id, 'kw_wrap')]")    # 模糊匹配以什么结尾
driver.find_element_by_xpath("//*[matchs(text(), 'hao123')]")     # 正则表达式匹配

css

CSS 是一种描述 HTML 文档样式的语言。

CSS 描述应该如何显示 HTML 元素。

什么是 CSS?

  • CSS 指的是层叠样式表* (Cascading Style Sheets)
  • CSS 描述了如何在屏幕、纸张或其他媒体上显示 HTML 元素
  • CSS 节省了大量工作。它可以同时控制多张网页的布局
  • 外部样式表存储在 CSS 文件
表达式 描述
# 表示 id 属性,eg: #kw
. 表示class属性, eg: .s_ipt
pagname 直接用标签名称,无任何标示符, eg: input
  1. 按元素的idclass标签这些属性定位
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.find_element_by_css_selector("#kw")        # id属性
driver.find_element_by_css_selector("input")	  # 标签属性
driver.find_element_by_css_selector<
  • 22
    点赞
  • 144
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值