selenium
- selenium只能做ui(web 浏览器)自动化。
- selenium组成
- 浏览器的录制功能
- Selenium Grid也是Selenium Suite的一个重要组件,它允许在不同的机器上并行运行不同浏览器的测试。 简单来说,可以在运行不同浏览器和操作系统的不同机器上同时运行测试
- web Driver 控制web浏览器。
python 如何使用 selenium
- 1.要有python的开发环境
- 2.下载谷歌浏览器的驱动程式,放在python.exe目录下。(注意python的虚拟环境)
- 3.安装命令行
pip install selenium
- 由于python安装包可能涉及翻墙,可以使用中国清华镜像员安装。
selenium基本代码
- 1.导入selenium包
- 2.实例化一个浏览器的对象
- 3.打开网页
- 3.1由于运行速度太快,增加一个时间延迟sleep(3)
- 4.关闭程序
from time import sleep driver = webdriver.Chrome() driver.get('http://www.baidu.com') sleep(3) driver.quit()
selenium选择器
- id选择器
driver.find_element_by_id('id的值')
- 表签可能存在复数,就用elements,使用时需要用下标的方式选取。
driver.find_elements_by_id('id的值')
- tag选择器
driver.find_element_by_tag_name('标签名称')
driver.find_elements_by_tag_name('标签名称')
- name选择器
- class_name选择器,选择类名
- 如果calss是多个,必须填写第一个。
- xpath选择器(注意双引号的问题)
- 1.绝对路径:/html/body/input[3]
- 2.相对路径://*input[3]
- 3.相对路径+属性名称://*[@id=“kw”]
- 4.相对路径+属性名称+逻辑算法//*[@id=“kw” and @name=“btn”]
- 5.相对路径+属性名称+相对路径//*[@id=“kw”]/input
- css选择器(通过css选择器定位元素,官方推荐使用css选择器)
- driver.find_element_by_css_selector()
- 1.id选择器 #id
driver.find_element_by_css_selector('#id')
- 2.class选择器 .class名字 只能是一class名称
driver.find_element_by_css_selector('.btn')
- 3.标签选择器 input
driver.find_element_by_css_selector('input')
- 4.属性选择器 input[type=“xxx”]
- 语法1:[属性名=“属性值”]
- 语法2:标签名[属性名=“属性值”] 当class有多个属性时,应全部写入。
- 5.层级选择器
- 父子(一层元素用) > 连接
- p[id=‘p1’]>input
- 父租(后代所有元素) 用 空格
- p[id=‘p2’] input
- 6.延伸
- input[type^=‘p’] type属性以p字母开头元素
- input[type$=‘d’] type属性以d字母结束元素
- input[type*=‘w’] type属性包含w字母的元素
- driver.find_element_by_css_selector()
By模块的另外一种写法(为了后续封装使用)
- 导入一个by模块,命名为By(其实原理是调用的By.id的方法)
from selenium.webdriver.common.by import By
- 写法有变化。
driver.find_element(By.ID, 'user').send_keys('admin')
- 注释:
- 说法1,by方法是By方法的封装。
- 说法2,By方法是by方法的底层原理。
- 应用场景:使用PO设计模式时,封住代码结构时使用,使用By方法。
元素的调用的方法
常用操作方法
- click() 单击元素
- send_keys(value) 模拟输入
- clear() 文本清除
- 注意:在使用操作中,一般对于输入框元素,都要执行清空后,再执行输入,避免操作错误。
浏览器操作
- 1.maximize_window() 最大化浏览器窗口
driver.maximize_window()
- 2.set_window_size(width,height) 设置浏览器窗口大小
driver.set_window_size(width,height)
- 3.set_window_position(x,y) 设置浏览器窗口位置。
driver.set_window_position(x,y)
- 4.back() 后退
driver.back()
- 5.forward() 前进
driver.forward()
- 6.refresh() 刷新
driver.refresh()
- 7.close() 关闭当前窗口 , 窗口切换。
driver.close()
- 8.quit() 关闭浏览器驱动对象
driver.quit()
- 9.title 获取页面title ,属性。
driver.title
- 10.current_url 获取当前页面URL
driver.current_url
鼠标操作
- 最主要是要用时悬浮,悬浮触发弹窗出现
- 鼠标操作的方法
- 1.实例化一个ActionChains类
from selenium.webdriver import ActionCharins
action = ActionCharins(driver)
- 2.方法
- 1.context_click(element) 右击
- 2.double_click(element) 双击
- 3.drag_and_drop(source,target) 拖动
- 4.move_to_element(element) 悬浮,执行时不要动鼠标
- 5.perform() 执行,此方法执行以上鼠标所有操作
- 3.操作步骤
- 1.定位元素
driver.find_element_by_css_selector('#id')
- 2.实例化对象
action = ActionCharins(driver)
- 3.调用鼠标方法
action.context_click(element)
- 4.执行方法
action.perform()
键盘操作
- 1.导入模块
from selenium.webdriver.common.keys import Keys
- 2.常用键盘操作
- 1.send_Keys(Keys.BACK_SPACE) 删除键
- 2.send_Keys(Keys.SPACE) 空格键
- 3.send_Keys(Keys.TAB) 制表键
- 4.send_Keys(Keys.ESCAPE) 回退键
- 5.send_Keys(Keys.ENTER) 回车键
- 6.send_Keys(Keys.CONTROL, ‘a’) 全选ctrl + a
- 7.send_Keys(Keys.CONTROL, ‘c’) 复制ctrl + c
- 8.send_Keys(Keys.CONTROL, ‘v’) 粘贴ctrl + v
- 3.mac系统需要用Command + a 不兼容。
等待元素问题
- 由于DOM 没有加载出来,所以定位错误。
- 优先用隐式,再用显示
- 1.隐式等待
driver.implicitly_wait(timeout)
- 说明:隐式等待,设置为全局(只需要设置一次,就会作用于所有元素,实际最多等待时长:30s。)
- 缺陷,他需要等待所有页面元素加载完全。
- 2.显示等待
- 1.导入包
from selenium.webdriver.support.wait import WebDriverWait
- 2.设置对象
WebDriverWait(driver,timeout,poll_frequency=0.5)
- 参数1driver 浏览器对象
- 参数2timeout 超时时长,单位秒
- 参数3poll_frequency 检测时间间隔,默认0.5 秒
- 3.使用
- until(method): 直到…时,里面要放函数。
- 一般使用匿名函数来实现
lambda x : x.find_element_by_id('userA')
- 将find_element_by_id(‘userA’)对象转换为函数。
- 4.完整案例
element = WebDriverWait(driver,10,1).until(lambda x: x.find_element_by_id('userA'))
element.send_keys('admin)
- 1.导入包
下拉框
- 1.传统方案
- 直接选择下拉框里面的选项,用css属性选择器。
- 2.select类选择
- 导入模块select
from selenium.webdriver.support.select import Select
- 实例化一个对象(需要注意,这里是要找到select标签)
select = Select(driver.find_element_by_id('selectA'))
- 调用方法,用下标进行选择。
select.select_by_index(index)
select.select_by_value(value)
select.select_by_visible_text(text)
用显示文本标记
弹出框问题处理
- js弹窗类型
- 1.警告框
- 2.确认框
- 3.提示框,输入框
- 4.同一处理方法。
- 获取弹窗对象,注意如何代码带有黑线,方法已被移除。
alert = drive.switch_to_alert
- 调用
- alert.text 返回弹窗文字信息
- alert.accept() 接受对话框选项
- alert.dismiss() 取消对话框选项
- 自定义弹窗
- 定位元素处理
滚动条处理
- 执行js脚本
- 1.编写js代码,其他一样可以使用
js = window.scrollTo(0,1000)
- 2.selenium调用执行javascript执行脚本的方法
drive.execute_script(js)
frame切换处理
一般是浏览器里面有两个html,需要切换使用。
- 1.driver.switch_to.frame(frame_reference) 当前页面
- frame_reference为name ,id 或者定位到frame元素
- 2.driver.switch_to.default_content() 恢复当前页面
切换页面
- selenium 中封装了获取当前窗口的句柄,获取所有窗口的和切换到指定窗口的句柄的方法。
- 1.driver.current_window_handle 获取当前窗口
- 2.driver.window_handles 获取所有窗口
- 3.driver.switch_to_window(handle) 切换到指定窗口。
- 注意,关闭页面,是关闭的当前页面。
- 如果想在原始页面使用,务必提前完成窗口切换。
窗口截图
- driver.get_screenshot_as_file(imgpath)
- 注意路径,要不名字取好,可以使用时间戳。
- driver.get_screenshot_as_file(‘./info.png’)
- 元素截图:
- btn = driver.find_element_by_tag_name(‘button’)
- btn.screenshot(‘./btn.png’)
验证码
- 验证码处理方式
- 1.去掉验证码 测试环境
- 2.设置万能验证码 生产环境和测试环境
- 3.验证码识别技术 python-tesseract来识别图片类型,识别率很难达到100%
- 4.记录cookie 通过记录cookie
cookie
- 1.cookie 是什么?
由服务器生成,并且保存在用户浏览器上的小文件,它可以包含用户相关信息。 - 2.cookie数据格式?
键值对 - 3.cookie产生,客户请求服务器,如果服务器需要记录用户状态,就向客户端浏览器颁发一个cookie数据
- 4.cookie的使用。
- 5.拿到BDUSS,在浏览器工作台看
- {‘name’: BDUSS, ‘value’:‘xjljaiodjflkajoiejkl#$ljlj23’}
- 代码演示:
- cookie_value = {‘name’:‘BDUSS’,‘value’:‘xxxx’}
- driver.add_cookie(cookie_value)
- driver.refresh() 刷新页面