以此环境为例
selenium3.141.0 点击 查看官方文档 Python3.7.3
Chrome版本 88.0.4324.104(正式版本) (64 位)点击下载对应版本驱动phantomjs下载
第一步:配置好Python环境变量
配置:Python的path环境变量
第二步:配置浏览器驱动path变量
将chromedriver.exe配置到path,或者将chromedriver.exe放到Python的path路径下
第三步:selenium的API解读
from selenium.webdriver import Chrome
from selenium import webdriver
# 引入鼠标操作
from selenium.webdriver import ActionChains
# 引入键盘操作
from selenium.webdriver.common.keys import Keys
# 引入下拉列表操作
from selenium.webdriver.support.select import Select
# 显式等待引入的包
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import os
# 获取index.html文件的绝对路径
path = os.path.abspath('index.html')
# 开启PhantomJS无界面浏览器
driver = webdriver.PhantomJS()
# 开启谷歌浏览器
driver = Chrome()
# 在浏览器打开百度页面
driver.get("https://www.baidu.com/")
# 浏览器最大化
driver.maximize_window()
# 设置浏览器固定大小,一般用在手机H5页面测试
driver.set_window_size(400,400)
# 获取窗口大小
size = driver.get_window_size()
# 获取浏览器窗口位置
driver.get_window_position()
# 设置浏览器窗口位置,需求需要将浏览器固定到某个位置时使用
driver.set_window_position(0,0)
# 关闭浏览器当前标签
driver.close()
# 关闭浏览器所有标签
driver.quit()
# 刷新页面
driver.refresh()
# 返回到上一页
driver.back()
# 后退到下一页
driver.forward()
# 获取当前URL
print(driver.current_url)
# 获取当前浏览器标题
print(driver.title)
# 保存浏览器快照到当前位置
driver.get_screenshot_as_file('baidu.jpg')
# 将浏览器快照存入内存
data = driver.get_screenshot_as_png()
with open('baidu2.jpg','wb') as f:
f.write(data)
# 获取页面源代码
data = driver.page_source
print(type(data))
# 以二进制类型写入文件
with open('baidu.html','wb') as f:
# 将str类型data转换成bytes类型(二进制类型)
# b_data = data.encode()
# 将bytes类型(二进制类型)转换成str类型data
# data = b_data.decode()
f.write(data.encode())
# 获取浏览器所有句柄(所有浏览器标签、窗口)
handles = driver.current_window_handle
print(handles)
# 根据句柄切换窗口(浏览器标签、窗口)
driver.switch_to.window(handles[0])
# 跳回最外层页面
driver.switch_to.default_content()
# 跳回上层(外层)页面
driver.switch_to.parent_frame()
多表单切换
# 多表单(框架)切换
# 先定位iframe
el_iframe = driver.find_element_by_css_selector("#loginDiv>iframe")
# 切换表单
driver.switch_to.frame(el_iframe)
driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0])
元素定位API(8种定位方式)
元素节点定位手段 推荐使用这种
# 返回一个对象
# 用id的值进行定位元素节点
driver.find_element_by_id('')
# 用name的值进行定位元素节点
driver.find_element_by_name('')
# 用class的值进行定位元素节点
driver.find_element_by_class_name('')
# 用链接文本进行定位元素节点
driver.find_element_by_link_text('要点击的全部文本内容')
# 用部分链接文本进行定位元素节点
driver.find_element_by_partial_link_text('要点击的部分文本内容')
# 用标签名进行定位元素节点,多个相同标签只定位第一个
driver.find_element_by_tag_name('input')
# 用xpath路径表达式进行定位元素节点
driver.find_element_by_xpath('')
# 用css选择器进行定位元素节点
driver.find_element_by_css_selector('')
# 返回多个对象列表
driver.find_elements_by_id('')
driver.find_elements_by_name('')
driver.find_elements_by_class_name('')
driver.find_elements_by_link_text('')
driver.find_elements_by_partial_link_text('')
driver.find_elements_by_tag_name('')
driver.find_elements_by_xpath('')
driver.find_elements_by_css_selector('')
# 返回一个对象
# 用id的值进行定位元素节点
driver.find_element(By.ID,'')
# 用name的值进行定位元素节点
driver.find_element(By.NAME,'')
# 用class的值进行定位元素节点
driver.find_element(By.CLASS_NAME,'')
# 用链接文本进行定位元素节点
driver.find_element(By.LINK_TEXT,'要点击的全部文本内容')
# 用部分链接文本进行定位元素节点
driver.find_element(By.PARTIAL_LINK_TEXT,'要点击的部分文本内容')
# 用标签名进行定位元素节点,多个相同标签只定位第一个
driver.find_element(By.TAG_NAME,'input')
# 用xpath路径表达式进行定位元素节点
driver.find_element(By.XPATH,'')
# 用css选择器进行定位元素节点
driver.find_element(By.CSS_SELECTOR,'')
# 返回多个对象列表
driver.find_elements(By.ID,'')
driver.find_elements(By.NAME,'')
driver.find_elements(By.CLASS_NAME,'')
driver.find_elements(By.LINK_TEXT,'')
driver.find_elements(By.PARTIAL_LINK_TEXT,'')
driver.find_elements(By.TAG_NAME,'')
driver.find_elements(By.XPATH,'')
driver.find_elements(By.CSS_SELECTOR,'')
# 用id定位输入框元素节点,返回值是一个元素对象
id = driver.find_element_by_id('kw')
# 查看元素节点对象的内容
print(id)
# 查看类型
print(type(id))
# 查看该对象都有什么方法
print(dir(id))
# 清空输入框
id.clear()
# 向输入框写入数据
id.send_keys('python文档')
# 等待5秒钟
time.sleep(5)
# 用id定位按钮元素节点,返回值是一个元素对象
el_click = driver.find_element_by_id('su')
# 点击按钮
el_click.click()
# 提交操作,只能用在提交数据
el_click.submit()
# 获取元素节点的文本<a>文本内容</a>
el_click.text
# 获取元素节点内属性对应的值
# <a href="http://tieba.baidu.com" id="su" class="mnav c-font-normal c-color-t">贴吧</a>
el_click.get_attribute('href')
# 获取元素尺寸大小
el_click.size
# 查看元素是否可见
el_click.is_displayed()
注意:如果在测试过程中有验证码,那么可以找开发给添加一个万能验证码,或者将验证码去掉
xpath快速定位方法
以hao123为例
# 用xpath路径表达式进行定位元素节点
driver.find_element_by_xpath('//*[@id="userCommonSites"]/ul/li[4]/div/a')
鼠标、键盘
# 先定位出元素节点对象
el = driver.find_element_by_name('mp')
# 鼠标右击操作
ActionChains(driver).context_click(el).perform()
# 鼠标悬停操作
ActionChains(driver).move_to_element(el).perform()
# 输入字符串
el.send_keys("selenium")
# 全部选中节点内容Ctr+a
el.send_keys(Keys.CONTROL,'a')
# 剪切节点内容Ctr+x
el.send_keys(Keys.CONTROL,'x')
# 粘贴节点内容Ctr+v
el.send_keys(Keys.CONTROL,'v')
# 删除键Backspace
el.send_keys(Keys.BACK_SPACE)
# 空格键Space
send_keys(Keys.SPACE)
# 制表键Tab
send_keys(Keys.TAB)
# 回退键Esc
send_keys(Keys.ESCAPE)
# 回车键Enter
send_keys(Keys.ENTER)
# 键盘F1
send_keys(Keys.F1)
...
# 键盘F12
send_keys(Keys.F12)
# 输入webdriver并回车
driver.find_element(By.ID, "kw").send_keys("webdriver" + Keys.ENTER)
# 组合键
search = driver.find_element(By.ID, 'kw')
action = webdriver.ActionChains(driver)
# 按下SHIFT键不放输入QWERTY,在放开SHIFT键输入qwerty
action.key_down(Keys.SHIFT).send_keys_to_element(search, "qwerty").key_up(Keys.SHIFT).send_keys("qwerty").perform()
# 选中整个页面Ctr+A
webdriver.ActionChains(driver).key_down(Keys.CONTROL).send_keys("a").perform()
警告框
# 进入警告框,并点击确定
driver.switch_to.alert.accept()
# 进入警告框,并点击取消
driver.switch_to.alert.dismiss()
# 发送文本到警告框
driver.switch_to.alert.send_keys('发送文本到警告框')
下拉列表
首先定位的节点必须是select标签,不然会报错
<select id="selectId">
<option value="aaa">18岁以下</option>
<option value="bbb">18-28岁</option>
<option value="ccc">28-38岁</option>
<option value="ddd">38岁以上</option>
</select>
el = driver.find_element_by_id('selectId')
selobj = Select(el)
# 通过索引值进行定位
selobj.select_by_index(0)
selobj.select_by_index(1)
# 通过value值进行定位
selobj.select_by_value('aaa')
selobj.select_by_value('bbb')
# 通过显示文本进行定位
selobj.select_by_visible_text('18')
selobj.select_by_visible_text('18-28')
# 查看所有已选
selobj.all_selected_options
# 查看第一已选中的元素节点对象
selobj.first_selected_option
# 查看是否多选
selobj.is_multiple
# 查看选项列表
selobj.options
# 根据索引取消选择
selobj.deselect_by_index()
# 根据value值取消选择
selobj.deselect_by_value()
# 根据文本内容取消选择
selobj.deselect_by_visible_text()
# 取消所有选中
selobj.deselect_all()
滚动条向下拖动
for i in range(100):
# 向下拉滚动条
js = 'window.scrollTo(0,%s)' %(i*100)
# 执行js代码
driver.execute_script(js)
time.sleep(0.1)
# 向上拉滚动条
# js2 = 'var q=document.documentElement.scrollTop=0'
# driver.execute_script(js2)
浏览器等待
显式等待
# 每2秒检查一次id,至到id存在,超过10秒报错
el = WebDriverWait(driver,10,2).until(EC.presence_of_element_located((By.ID,'kw')))
隐式等待(推荐使用)
# 10秒钟内查到元素通过,超过10秒报错
driver.implicitly_wait(10)
driver.find_element_by_id('kw')
Cookie操作
# 获取所有cookie
cookies = driver.get_cookies()
print(cookies)
# 删除所有cookie
driver.delete_all_cookies()
# 设置cookie
cookie = {'name':'taoge','value':'hahaha'}
# 添加cookie
driver.add_cookie(cookie)
# 根据key获取cookie
driver.get_cookie('taoge')
# 根据key值删除cookie
driver.delete_cookie('taoge')
第四步:单元测试框架unittest
import unittest
# 必须继承unittest.TestCase类才会被识别为测试用例
class TestAAA(unittest.TestCase):
# 在test_001执行前执行
def setUp(self):
print('setup')
# 在test_001执行之后执行
def tearDown(self):
print('teardown')
# 方法名必须以test开头,不然不会当做测试用例执行
# 多个测试用例,会按方法名称test后面的字符进行从小到大排序执行
def test_001(self):
print('test_001')
# 在本文件内执行
if __name__ == '__mian__':
unittest.main()