官网:https://www.selenium.dev/
中文网:http://www.selenium.org.cn/
一、selenium简介
Selenium是一个用于Web应用(网站)的测试工具,是直接运行在浏览器上的,不仅支持各种主流浏览器以及IE(7-11)版本,还能针对不同系统测试。框架底层是使用JavaScript模拟真实用户对浏览器进行操作。
优势:
通过编写模仿用户操作的 Selenium 测试脚本,可以从终端用户的角度来测试应用程序。通过在不同浏览器中运行测试,更容易发现浏览器的不兼容性。Selenium 的核心,也称browser bot,是用 JavaScript 编写的。这使得测试脚本可以在受支持的浏览器中运行。
二、下载
淘宝镜像:https://developer.aliyun.com/mirror/NPM?from=tnpm
windows版可以直接把chromedriver.exe放到要运行的python文件所在目录,也可以将chromedriver.exe的路径添加到环境变量path中。
三、流程API简介
from selenium import webdriver
import time
# 获取一个浏览器对象
br = webdriver.Chrome()
# 打开一个页面
br.get('http://www.baidu.com')
# 获取页面的源代码(运行后在内存中渲染的页面元素)
print(br.page_source)
# 根据id查找元素
kw = br.find_element_by_id('kw')
# 往表单输入框中输入内容
kw.send_keys('你好')
# 点击某个元素
br.find_element_by_id('su').click()
time.sleep(3)
# 将页面内容保存成截图
br.save_screenshot('./1.png')
# 设置窗口最大化
br.maximize_window()
time.sleep(2)
# 指定浏览器窗口大小
br.set_window_size(1200, 800)
# 设置浏览器的坐标 四个参数分别是 x坐标 y坐标 窗口的宽 框框的高
br.set_window_rect(100, 200, 300, 500)
# 获取所有cookie
print(br.get_cookies())
print('*' * 10)
# 获取某一个cookie的信息
print(br.get_cookie('BDORZ'))
time.sleep(2)
# 关闭窗口
br.close()
# 退出浏览器
time.sleep(2)
br.quit()
四、元素对象操作
# 根据类名查找元素
br.find_element_by_class_name('btn')
# 根据元素的name值查找元素
br.find_element_by_name('ie')
# 根据元素的标签名称查找元素
br.find_element_by_tag_name('div')
# 根据链接包裹着的文字查找
br.find_element_by_link_text('地图')
# 根据链接包裹着的部分文字查找
br.find_element_by_partial_link_text('地')
# 根据css选择器规则进行查找元素
br.find_element_by_css_selector('#wrapper')
# 根据xpath规则进行查找元素
find_element_by_xpath('//*[@id="q"]')
五、多元素查找
与单元素查找的区别是element改成了elements,如下:
br.find_elements_by_tag_name('a')
六、获取属性和文本
1、获取属性
br.find_element_by_class_name('btn').get_attribute('属性名')
2、获取文本
br.find_element_by_class_name('btn').text
七、 交互操作
1、运行javascript
br.execute_script('alert("hello world")')
八、iframe内嵌框架
操作iframe的常用方法有:switch_to.frame()
和switch_to.parent_frame()
九、等待操作
1、隐式等待
到了一定的时间发现元素还没有加载,则继续等待我们指定的时间,如果超过了我们指定的时间还没有加载就会抛出异常,如果没有需要等待的时候就已经加载完毕就会立即执行。
br = webdriver.Chrome()
# 设置最长等待10秒
br.implicitly_wait(10)
2、显式等待
指定一个等待条件,并且指定一个最长等待时间,会在这个时间内进行判断是否满足等待条件,如果成立就会立即返回,如果不成立,就会一直等待,直到等待你指定的最长等待时间,如果还是不满足,就会抛出异常,如果满足了就会正常返回
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
br = webdriver.Chrome()
br.get('https://www.baidu.com/')
wait = WebDriverWait(br, 10)
input = wait.until(EC.presence_of_element_located((By.ID, 'q')))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
print(input, button)
上述的例子中的条件:EC.presence_of_element_located()
是确认元素是否已经出现了
EC.element_to_be_clickable()
是确认元素是否是可点击的
十、常用判断
title_is
标题是某内容title_contains
标题包含某内容presence_of_element_located
元素加载出,传入定位元组,如(By.ID, 'p')visibility_of_element_located
元素可见,传入定位元组visibility_of
可见,传入元素对象presence_of_all_elements_located
所有元素加载出text_to_be_present_in_element
某个元素文本包含某文字text_to_be_present_in_element_value
某个元素值包含某文字frame_to_be_available_and_switch_to_it
frame加载并切换invisibility_of_element_located
元素不可见element_to_be_clickable
元素可点击staleness_of
判断一个元素是否仍在DOM,可判断页面是否已经刷新element_to_be_selected
元素可选择,传元素对象element_located_to_be_selected
元素可选择,传入定位元组element_selection_state_to_be
传入元素对象以及状态,相等返回True,否则返回Falseelement_located_selection_state_to_be
传入定位元组以及状态,相等返回True,否则返回Falsealert_is_present
是否出现Alert
十一、cookie
get_cookies()
get_cookie('key')
delete_all_cookes()
delete_cookie('key')
add_cookie({'name': 'age', 'value': '18', 'domain': 'www.baidu.com'})
十二、选项卡管理
通过执行js命令实现新开选项卡window.open()
不同的选项卡是存在列表里br.window_handles
通过br.window_handles[0]
就可以操作第一个选项卡
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.execute_script('window.open()')
print(browser.window_handles)
browser.switch_to_window(browser.window_handles[1])
browser.get('https://www.jd.com')
time.sleep(1)
browser.switch_to_window(browser.window_handles[0])
browser.get('https://python.org')
十三、无界面模式
如果界面影响其他操作也不用担心,chrome和火狐都提供的有无界模式。只需要传入一些参数即可
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 配置chrome的参数
options = Options()
options.add_argument('--headless')
# options.add_argument('--disable-gpu')
# 获取一个浏览器对象
br = webdriver.Chrome(chrome_options=options)
十四、容口操作
# 获取当前浏览器的大小
driver.get_window_size()
# 通过像素设置浏览器的大小
driver.set_window_size('width','height')
# 获取当前窗口针对于Windows的位置的坐标x,y
driver.get_window_position()
# 设置当前窗口针对Windows的位置,x,y
driver.set_window_position(20,20)
# 最大化当前窗口,不需要传参
driver.maximize_window()
# 返回当前操作的浏览器句柄
driver.current_window_handle
# 返回所有打开server的浏览器句柄
driver.window_handles
# 获取当前页面的二进制图片数据,需要自己去写入文件
driver.get_screenshot_as_png()
# as_png的上层封装,只需要传入图片名称自动写成图片
driver.get_screenshot_as_file('fileName.png')
十五、浏览器操作
# 刷新
driver.refresh()
# 前进
driver.forward()
# 后退
driver.back()
# 当开启多个时,关闭当前页面
driver.close()
# 退出并关闭所有页面驱动
driver.quit()
参考链接: