一. 安装部署
1. 客户端selenium库的安装
通过pip安装selenium库的命令:pip install selenium
- Selenium可支持以下几种语言:java、csharp、python、ruby、php、js、perl
- 使用国内镜像可提升下载速度:pip install selenium -i https://pypi.douban.com/simple/
- pip安装出现异常,可尝试更新至最新版本再试,更新pip的命令:python -m pip install --upgrade pip
2. 下载对应浏览器的ChromeDriver驱动:
ChromeDriver驱动版本需与本机已安装浏览器版本一致,下载前可先查看本机浏览器版本,然后下载正确的ChromeDriver驱动
不清楚如何选择对应版本请点我
注意事项:在使用Selenium编写自动化脚本时,需要调用该ChromeDriver,因此ChromeDriver驱动存放路径建议不要出现中文及空格
二.使用Selenium进行WEB UI自动化测试
前言
首先,我们得明白Selenium在整个WEB UI自动化测试中所扮演的角色
- 通过ChromeDriver调用浏览器打开需要测试的站点
- 定位要操作的元素
2.1 通过ID定位
2.2 通过class定位
2.3 通过标签名定位
2.4 通过xpath定位- 操作已定位到的元素
3.1 获取页面内容
3.2 向选择的元素输入数据
3.3 点击已定位元素
3.4 拖拉定位元素
- 到此处时,Selenium的使命就已经基本完成,后面处理数据及分析数据则由python来完成。
Selenium定位\操作
查找单个元素并返回元素
from selenium import webdriver
driver = webdriver.Chrome(r'd:\tools\webdriver\chromedriver.exe')
driver.get('http://music.baidu.com/top/new')
element = driver.find_element_by_id('songListWrapper') # 根据ID查找
如果元素未找到则会抛出异常,如果结果有多个,也只返回最先找到的那一个
查找多个元素并返回元素列表
from selenium import webdriver
driver = webdriver.Chrome(r'd:\tools\webdriver\chromedriver.exe')
driver.get('http://music.baidu.com/top/new')
tip_to_taihe_box = driver.find_element_by_class_name('tipToTaihe-box') #查找单个class元素,如果存在多个只返回第一个
span_list = tip_to_taihe_box.find_elements_by_tag_name('span') #查找多个span,返回列表
如果元素未找到,会返回一个空列表(不会抛出异常)
查找元素以HTML格式字符串
强制等待
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome(r'd:\tools\webdriver\chromedriver.exe')
driver.get('http://www.baidu.com')
sleep(3) # 强制等待3秒再执行下一步
element = driver.find_element_by_id('kw')
注意:强制等待,其实就是time.sleep()方法,让程序暂停运行一定时间,时间过后继续运行。缺点:设置的时间太短,元素还没有加载出来同样会报错。设置时间太长,浪费时间,如果代码量大了,就会影响整体的运行速度了,所以尽量少用这个。
隐式等待
from selenium import webdriver
driver = webdriver.Chrome(r'd:\tools\webdriver\chromedriver.exe')
driver.get('http://www.baidu.com')
driver.implicitly_wait(10) #后面的所有定位元素操作,每半秒进行一次,直到查找到元素,最长等待10秒(可自行定义)
element = driver.find_element_by_id('kw')
注意:隐式等待,是等待页面加载,即页面加载完成后才能执行后面的操作
显式等待
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Chrome(r'd:\tools\webdriver\chromedriver.exe')
driver.implicitly_wait(10) # 隐式等待和显性等待可以同时用,等待的最长时间取两者之中最大的
driver.get('http://www.baidu.com')
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "kw")))
finally:
driver.quit()
注意:显式等待,是等待元素加载,即元素加载完成后就执行对该元素的操作
使用BeautifulSoup4 & html5lib 配合selenium获取到的html内容进行元素定位
使用BeautifulSoup4 & html5lib前必需先通过CMD安装这俩个库,BeautifulSoup4的具体操作,可以查看官方操作说明文档 ( Beautiful Soup 4.2.0 操作说明文档传送门 )
pip install beautifulsoup4 # 安装BeautifulSoup4库
pip install html5lib # 安装html5lib库
导入BeautifulSoup4 & html5lib
from bs4 import BeautifulSoup
import html5lib
Html5lib如何配合BeautifulSoup4使用
from bs4 import BeautifulSoup
import html5lib
html = """
<html>
<head><title>我喜欢的音乐</title></head>
<body>
<p class='title'><b>歌曲TOP3</b></p>
<p class='story'>以下是音乐的下载链接
<a href='http://music.taihe.com/song/597854185' class='music' id='link1'>明智之举</a>
<a href='http://music.taihe.com/song/596481670' class='music' id='link2'>如约而至</a>
<a href='http://music.taihe.com/song/598740690' class='music' id='link3'>只要平凡</a>
这三首TOP3的歌曲你们喜欢吗?</p>
<p class='story'>...</p>
</body>
</html>
"""
soup = BeautifulSoup(html,'html5lib') # 将html5lib解释器添加到BeautifulSoup4中
soup.title # 获取html文档中的title标签元素
soup.title.name # 获取html文档中的title标签元素的name属性
soup.tltle.text # 获取html文档中的title标签元素的文本内容
CSS选择元素的方法 tag/id/class
根据tag名
p {color:red;}
根据id名
#food {color:red;}
根据class
.vergetable {color:red;}
根据tag名和class组合写(如果多个)
span.vergetable {color:red;}
复选框选择( SELECT )
使用SELECT时需要先导入库
from selenium.webdriver.support.ui import Select
Select 模块(index)定位
通过 select 选项的索引来定位选择对应选项(从 0 开始计数),如选择第二个选项:select_by_index(1)
<select id="cardid" name="CARD">
<option selected="" value="A">芯片卡</option>
<option value="B">磁条卡</option>
</select>
Select 模块(value)定位
Select 模块里面除了 index 的方法,还有一个方法,通过选项的 value值来定位。每个选项,都有对应的 value 值:select_by_value(B)
<select id="cardid" name="CARD">
<option selected="" value="A">芯片卡</option>
<option value="B">磁条卡</option>
</select>
Select 模块(text)定位
直接通过选项的文本内容来定位,定位“磁条卡”:select_by_visible_text("磁条卡")
<select id="cardid" name="CARD">
<option selected="" value="A">芯片卡</option>
<option value="B">磁条卡</option>
</select>
# 导入Select库
from selenium.webdriver.support.ui import Select
# 获取select父元素
s= driver.find_element_by_id('cardid')
# 取消全部选择
select.deselect_all()
# 选择指定文本内容的复选框
select(s).select_by_index(1) #通过index定位并选择
select(s).select_by_value(B) #通过value定位并选择
select(s).select_by_visible_text('磁条卡') #通过text定位并选择
select 里面方法除了上面介绍的三种,还有更多的功能如下
select_by_index() :通过索引定位
select_by_value() :通过 value 值定位
select_by_visible_text() :通过文本值定位
deselect_all() :取消所有选项
deselect_by_index() :取消对应 index 选项
deselect_by_value() :取消对应 value 选项
deselect_by_visible_text() :取消对应文本选项
first_selected_option() :返回第一个选项
all_selected_options() :返回所有的选项
XPath 定位元素方法
特殊定位方法
driver.find_element_by_xpath("//span[contains(text(),'hello')]") """text值包含匹配"""
driver.find_element_by_xpath("//span[text()='新闻']") """text值绝对匹配"""
更多查看:XPath 语法参考手册
selenium使用XPath方法定位元素from selenium import webdriver driver = webdriver.Chrome(r'd:\tools\chromedriver.exe') one_element = driver.find_element_by_xpath('//div[@id="myid"]') # 单个定位 element_list = driver.find_elements_by_xpath('//div[@class="myclass"]') # 多个定位(复数形式,返回列表)
end