以此环境为例

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()

move_to_element_with_offset 新版selenium selenium3.141.0对应webdriver版本_元素节点

# 刷新页面
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()

多表单切换

move_to_element_with_offset 新版selenium selenium3.141.0对应webdriver版本_python_02

# 多表单(框架)切换

# 先定位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()

警告框

move_to_element_with_offset 新版selenium selenium3.141.0对应webdriver版本_selenium_03

# 进入警告框,并点击确定
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()