保姆入门级Web自动化学习资料
前言
- 本章内容需有一定Python基础,如何不懂的,请先学习Python。
什么??没有好的学习资料,给你准备好了!!
- 爆肝8万字的Python基础学习资料
- Python基础入门视频资料
- 以上资料都是本人亲自录制
Web自动化环境搭建
软件准备
- python64位安装包
- chrome64位浏览器&驱动
- 淘宝镜像浏览器驱动下载
- 谷歌浏览器镜像
- 注意:chromedriver与chrome版本要对应。具体可查看该对应表
- 另外:本文主要以chromedirver为例
开始环境搭建
安装python:双击自定义安装 或者 在cmd中输入python-3.7.0-amd64.exe的路径,即在电脑中存放的位置,回车即可弹出安装页面,勾选Add Python 3.7 to PATH,即自动配置环境变量。
如图:
下图显示安装成功:
- 注:可以查看系统环境变量,发现D:\My pyhton3.7.0\Scripts;D:\My pyhton3.7.0;已经自动添加到了path中,这就是勾选Add Python 3.7 to PATH的效果.
python安装完成后可以在cmd界面输入python,会出现下图内容,说明python安装成功
- 安装selenium:
- 在cmd中运行pip install selenium 即可在线安装selenium,(ps:安装指定的版本可用pip install selenium==3.14.0)如图提示selenium安装成功。
- 使用pip show selenium 查看selenium版本信息
- 安装chrome浏览器
该处使用谷歌浏览器64位的版本号为70.0.3538.67 - 将chromedriver.exe放到python的安装目录下(或者目录下的scripts下)
以上5步就搭建好python+selenium环境了
浏览器和驱动下载
在我学习Ui自动化时,总会遇到浏览器驱动版本问题,小伙伴也是一头雾水也找不到下载的地方,今天给大家整理
chromedriver版本 | 支持的chrome版本 |
---|---|
v2.46 | v72-74 |
v2.45 | v70-72 |
v2.44 | v69-71 |
v2.43 | v69-71 |
v2.42 | v68-70 |
v2.41 | v67-69 |
v2.40 | v66-68 |
v2.39 | v66-68 |
v2.38 | v65-67 |
v2.37 | v64-66 |
v2.36 | v63-65 |
v2.35 | v62-64 |
v2.34 | v61-63 |
v2.33 | v60-62 |
v2.32 | v59-61 |
v2.31 | v58-60 |
v2.30 | v58-60 |
==============================================================================
谷歌浏览器驱动版本对应以及下载:
点击下载chrome的webdriver:http://npm.taobao.org/mirrors/chromedriver/
点击下载chrome的历史版本:https://www.chromedownloads.net/
点击进入谷歌官方版本对应页面:https://sites.google.com/a/chromium.org/chromedriver/downloads
edge浏览器驱动版本对应以及下载:
点击进入微软edge浏览器wendriver版本对应下载页面:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/#downloads
ie浏览器驱动官方地址:
点击进入ie浏览器driver下载:http://selenium-release.storage.googleapis.com/index.html
点击进入ie浏览器官方github:https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver
safari浏览器官方地址:
点击进入safari浏览器官方地址:https://developer.apple.com/safari/download/
浏览器基本操作
前言
开始自动化测试之前,需了解浏览器的一些基本操作,以方便后续的自动测试。码上开始吧!
导入Selenium模块
from selenium import webdriver
浏览器基本操作
- 打开网站
#! /usr/bin/python3
# @Author : 一凡
from selenium import webdriver
url = "http://localhost:8080/Shopping/index.jsp"
# 也可以用其它浏览器:比如Firefox()等等
brower = webdriver.Chrome()
# 打开浏览器
brower.get(url)
- 设置休眠
#! /usr/bin/python3
# @Author : 一凡
from selenium import webdriver
import time
url = "http://localhost:8080/Shopping/index.jsp"
webdriver.Firefox
brower = webdriver.Chrome()
brower.get(url)
# 强制等待3秒
time.sleep(3)
- 页面刷新
#! /usr/bin/python3
# @Author : 一凡
from selenium import webdriver
url = "http://localhost:8080/Shopping/index.jsp"
webdriver.Firefox
brower = webdriver.Chrome()
brower.get(url)
# 刷新页面
brower.refresh()
- 前进和后退
#! /usr/bin/python3
# @Author : 一凡
from selenium import webdriver
import time
url = "http://localhost:8080/Shopping/index.jsp"
webdriver.Firefox
brower = webdriver.Chrome()
brower.get(url)
# 实际效果自己操作,当前就不做演式了
# 后退
brower.back()
# 前
brower.forward()
- 设置窗口大小
#! /usr/bin/python3
# @Author : 一凡
from selenium import webdriver
import time
url = "http://localhost:8080/Shopping/index.jsp"
webdriver.Firefox
brower = webdriver.Chrome()
brower.get(url)
# 设置窗口大小
brower.set_window_size(1280, 720)
# 设置全屏
# brower.maximize_window()
- 截屏
#! /usr/bin/python3
# @Author : 一凡
from selenium import webdriver
import time
url = "http://localhost:8080/Shopping/index.jsp"
webdriver.Firefox
brower = webdriver.Chrome()
brower.get(url)
brower.get_screenshot_as_file("./test.png")
# 退出浏览器进程
brower.quit()
- 退出
#! /usr/bin/python3
# @Author : 一凡
from selenium import webdriver
import time
url = "http://localhost:8080/Shopping/index.jsp"
webdriver.Firefox
brower = webdriver.Chrome()
brower.get(url)
time.sleep(3)
# 退出浏览器进程
brower.quit()
为什么要学习定位
- 让程序操作指定元素,就必须先找到此元素;
- 程序不像人类用眼睛直接定位到元素;
- webDriver提供了八种定位元素的方式。
- 定位总结
- id、name、class_name、tag_name:根据元素的标签或元素的属性来进行定位
- link_text、partial_link_text:根据超链接的文本来进行定位(a标签)
- xpath:为元素路径定位–重点
- css:为css选择器定位(样式定位)
常见定位方式
id
- 说明:HTML规定id属性在整个HTML文档中必须是唯一的,id定位就是通过元素的id属性来定位元素;
- 前提:元素有id属性
- id定位方法:find_element_by_id()
- 实现案例-1需求:打开百度界面(https://www.baidu.com/),通过id定位,输入信息,点击百度的钮
# -*- coding:utf-8 -*-
# @Author : 一凡
from selenium import webdriver
import time
url = "https://www.baidu.com/"
driver = webdriver.Chrome()
driver.get(url)
driver.find_element_by_id("kw").send_keys("好好学习|天天向上")
driver.find_element_by_id("su").click()
time.sleep(3)
driver.quit()
name
- 说明:HTML规定name属性来指定元素名称,name定位就是根据name属性来定位
- 前提:元素有name属性
- name定位方法:find_element_by_name()
- 实现案例-2需求:打开百度(https://www.baidu.com/),通过name定位
# -*- coding:utf-8 -*-
# @Author : 一凡
from selenium import webdriver
import time
url = "https://www.baidu.com/"
driver = webdriver.Chrome()
driver.get(url)
driver.find_element_by_name("wd").send_keys("好好学习|天天向上")
driver.find_element_by_id("su").click()
time.sleep(3)
driver.quit()
class_name
- 说明:HTML规定class来指定元素的类名,class定位就是根据class属性来定位,用法和name,id类似。
- 前提:元素有class属性
- class_name定位方法:find_element_by_class_name()
- 实现案例-3需求:打开百度界面(https://www.baidu.com/),通过class定位
# -*- coding:utf-8 -*-
# @Author : 一凡
from selenium import webdriver
import time
url = "https://www.baidu.com/"
driver = webdriver.Chrome()
driver.get(url)
driver.find_element_by_class_name("s_ipt").send_keys("好好学习|天天向上")
driver.find_element_by_id("su").click()
time.sleep(3)
driver.quit()
tag_name
- tag_name是通过标签名称来定位的,如:a标签
- 注:由于HTML源码中,经常会出现很多相同的的标签名,所以一般不使用该定位方式
# -*- coding:utf-8 -*-
# @Author : 一凡
from selenium import webdriver
import time
# 这里使用优设导航的百度搜索界面
# 获取浏览器对象
driver = webdriver.Chrome()
# 获取网络链接
url = "https://hao.uisdc.com/"
driver.get(url)
time.sleep(3)
# 获取搜索输入框,输入:优设导航的百度搜索
driver.find_element_by_tag_name("input").send_keys("优设导航的百度搜索")
# 暂停3秒
time.sleep(3)
# 退出浏览器驱动
driver.quit()
link_text
- 说明:link_text定位于前面4个定位有所不同,它专门用来定位超链接文本(文本值)
- 前提:定位的元素是链接标签(a标签)
- link_text定位方法:find_element_by_link_text()
- 实现案例-5需求:打开百度首页,通过link_text(链接文本)定位到【新闻】按钮,并进行点击操作
# -*- coding:utf-8 -*-
# @Author : 一凡
from selenium import webdriver
import time
url = "https://www.baidu.com/"
driver = webdriver.Chrome()
driver.get(url)
driver.find_element_by_link_text("新闻").click()
time.sleep(3)
driver.quit()
partial_link_text
- 说明:partial_link_text定位是对link_text定位的补充,partial_link_text为模糊匹配;link_text为全部匹配。
- 前提:定位的元素是链接标签(a标签)
- partial_link_text定位方法:find_element_by_partial_link_text()
- 通过传入a标签局部文本或全部文本来定位元素,要求输入的文本能够唯一找到这个元素
- 实现案例-6需求:打开百度新闻(http://news.baidu.com/),通过partial_link_text定位任何一条新闻,并进行点击操作
# -*- coding:utf-8 -*-
# @Author : 一凡
from selenium import webdriver
import time
url = "http://news.baidu.com/"
driver = webdriver.Chrome()
driver.get(url)
driver.find_element_by_partial_link_text("守护蓝色地球").click()
time.sleep(3)
# driver.quit()
元素组
- 元素组定位方式:find_elements_by_xxx
作用:- 查找返还定位所有符合条件的元素
- 返还的定位元素格式为列表格式
说明: - 列表数据格式的读取需要指定下标(下标从0开始)
- 案例要求:打开百度页面https://www.baidu.com/,通过元素组定位
- 定位:“//*[@id=‘s-top-left’]/a”
# -*- coding:utf-8 -*-
# @Author : 一凡
from selenium import webdriver
url = "https://www.baidu.com/"
driver = webdriver.Chrome()
driver.get(url)
path = "//*[@id='s-top-left']/a"
elements = driver.find_elements_by_xpath(path)
# 返回列表
print(len(elements))
# 通过列表方法获取相应的元素进行点击
elements[0].click()
xpath定位详解
通过常见属性定位
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
brower = webdriver.Chrome()
brower.get( "https://www.baidu.com" )
# xpath通过id定位
brower.find_element_by_xpath("//*[@id= 'kw']").click()
# xpath通过name定位
brower.find_element_by_xpath("//*[@name='wd']").click()
# xpath通过class_name定位
brower.find_element_by_xpath("//*[@class='s_ipt' ]").click()
通过其它属性
- 如果一个元素id、name、class属性都没有,这时候也可以通过其它属性定位到
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
brower = webdriver.Chrome()
brower.get( "https://www.baidu.com" )
#用xpath通过其它属性定位
brower.find_element_by_xpath("//*[@autocomplete='off']").send_keys("Python")
标签
- 有时候同一个属性,同名的比较多,这时候可以通过标签筛选下,定位更准一点
- 如果不想制定标签名称,可以用*号表示任意标签
- 如果想制定具体某个标签,就可以直接写标签名称
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
brower = webdriver.Chrome()
brower.get( "https://www.baidu.com" )
#用xpath通过其它属性定位
brower.find_element_by_xpath("//input[@id='kw']").send_keys( "Pthon")
层级定位
- 如果一个元素,它的属性不是很明显,无法直接定位到,这时候我们可以先找它老爸(图中数字1)
- 找到它老爸后,再找下个层级就能定位到了
- 如上图所示,要定位的是input这个标签,它的老爸的 class=“sec-input-box yuyin-cur”
- 要是它老爸的属性也不是很明显,就找它爷爷id=form(图中数字2)
- 于是就可以通过层级关系定位到
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
brower = webdriver.Chrome()
brower.get( "https://www.sogou.com" )
#通过老爸的span的class属性定位输入框
brower.find_element_by_xpath("//span[@class='sec-input-box']/input").send_keys("Python")
#通过爷爷的form的id属性来定位输入框
brower.find_element_by_xpath("//form[@id='sf']/span/input").send_keys("Python")
索引
- 百度主页–设置–搜索设置
- 如果一个元素它的兄弟元素跟它的标签一样,这时候无法通过层级定位到。因为都是一个父亲生的,多胞胎兄弟。
- 虽然双胞胎兄弟很难识别,但是出生是有先后的,于是可以通过它在家里的排行老几定位到。
- 如下图三胞胎兄弟
- 用xpath定位老大、老二和老三(这里索引是从1开始算起的,跟Python的索引不一样)
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
brower = webdriver.Chrome()
brower.get( "https://www.baidu.com" )
##定位设置
brower.find_element_by_link_text("设置").click()##定位搜索设置
# brower.find_element_by_xpath("html/body/div[1]/div[6]/a[1]").click()
#定义每页显示10条
brower.find_element_by_xpath("//select[@id='nr']/option[1]")
#定义每页显示20条
brower.find_element_by_xpath("//select[@id='nr']/option[2]")
# 定义每页显示50条
brower.find_element_by_xpath("//select[@id='nr']/option[3]")
逻辑
- xpath还有一个比较强的功能,是可以多个属性逻辑运算的,可以支持与(and)、或(or)、非(not)
- 一般用的比较多的是and运算,同时满足两个属性
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
brower = webdriver.Chrome()
brower.get( "https://www.baidu.com" )
# xpath逻辑运算
brower.find_element_by_xpath("//*[id='kw' and name='wd']")
定位总结
定位单个元素
1.id定位:find_element_by_id(self, id_)
2.name定位:find_element_by_name(self, name)
3.class定位:find_element_by_class_name(self, name)
4.tag定位:find_element_by_tag_name(self, name)
5.link定位:find_element_by_link_text(self, link_text)
6.partial_link定位find_element_by_partial_link_text(self, link_text)
下面两种要重点掌握其中一种,两者都会是更好的。现在我比较喜欢用xpath定位
7.xpath定位:find_element_by_xpath(self, xpath)
8.css定位:find_element_by_css_selector(self, css_selector)
定位一组元素
1.id复数定位find_elements_by_id(self, id_)
2.name复数定位find_elements_by_name(self, name)
3.class复数定位find_elements_by_class_name(self, name)
4.tag复数定位find_elements_by_tag_name(self, name)
5.link复数定位find_elements_by_link_text(self, text)
6.partial_link复数定位find_elements_by_partial_link_text(self, link_text)
7.xpath复数定位find_elements_by_xpath(self, xpath)
8.css复数定位find_elements_by_css_selector(self, css_selector)
如何定位多个元素呢?
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
brower = webdriver.Chrome()
brower.get("https://www.baidu.com/")#elements注意这个后面带有s,即复数的意思
elements = brower.find_elements_by_xpath("//*[@class='mnav']")#返回形式为列表形式
print(type(elements))
print(elements)
操作元素
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
brower = webdriver.Chrome()
brower.get("https://www.baidu.com/")#elements注意这个后面带有s,即复数的意思
elements = brower.find_elements_by_xpath("//*[@class='mnav']")#返回形式为列表形式
print(type(elements))
print(elements)
# 获取元素text信息(此步骤可省略)列表下标从o开始
print(elements[3].text)
#列表索引方法获取视频元素,并进行点击操作
elements[3].click()
brower.quit()