selenium
selenium WebDriver
是客户端API接口,测试人员通过调用这些接口,来访问浏览器驱动,浏览器驱动再访问浏览器
WebDriver属性:
- driver.name 浏览器名称
- driver.title 浏览器标题
- driver.current_url 浏览器当前url
- driver.page_source 当前页面源码
- driver.current_window_handle 当前窗口句柄
- driver.window_handles 所有窗口句柄
- driver.close 关闭当前页面
- driver.quit 关闭浏览器
- driver.back 浏览器回退
- driver.forward 浏览器前进
- driver.refresh 浏览器刷新
- driver.switch_to_alert() 切换到alert
1.selenium中操作弹窗通常需要切换到弹窗上下文中,这是因为弹窗(alert、confirm、prompt)通常不是页面的一部分,而是浏览器的原生对话框,这意味着它们不在常规的DOM树中,因此不能像普通页面元素那样直接通过find_element来操作
2.在vue.js中处理弹窗与处理浏览器原生的弹窗有所不同。其弹窗通常是通过组件或第三方库实现的,这些弹窗是页面的一部分,因此可以像普通元素一样交互
- driver.switch_to.active_element() 切换到活动的元素
- driver.switch_to.frame() 切换到指定的iframe或者frame
- driver.switch_to.window() 切换到指定的窗口
- driver.set_window_size(x,y) 设置浏览器大小
- driver.maximize_window() 最大化浏览器
selenium的三种等待方式
- 强制等待:time.sleep
缺点:项目中最忌讳使用这种方式进行等待,当网络条件良好时,依旧按照预设定时间继续等待,导致整个项目时间无限延长 - 隐式等待:implicity_wait()
实际是设置一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等待到时间结束,然后再执行下一步,隐式等待对整个driver周期都起作用,在最开始设置一次就可以了
缺点:因为JavaScript一般是放在我们的body的最后进行加载,实际页面上的元素都已加载完成,却还在等待全部页面加载结束 - 显示等待
webdriverwait
(1)参数:
driver:浏览器驱动
timeout:等待时间
poll_frequency:检查频率
(2)方法
untill()
method:在等待期间,每隔一个时间段调用这个传入的方法,直到返回值是true
message:允许你在抛出的异常中加入自定义的消息
untill_not()
method:在等待期间,每隔一个时间端调用这个传入的方法,直到返回值是false
message:允许你在抛出的异常中加入自定义的消息
使用环境
1.网络不稳定
2.页面使用Ajax异步加载机制
什么是Ajax呢?
是一种无需重新加载整个网页的情况下,能够更新部分网页技术,它允许网页在后台与服务器进行数据交换,从而实现局部刷新和动态内容加载
selenium的等待条件
等待条件来自于expected_conditions模块,这些条件用于配合webDriverWait类来实现显示等待
- persence_of_element_located:等待某元素出现在DOM中,不一定可见
- visibility_of_element_located:等待某个元素不仅存在DOM中,而且可见
- invisiblity_of_element_located:等待元素不在DOM中或不可见
- element_to_be_clickable:等待某个元素可以被点击
- title_is(“Expected Title”):等待页面标题完全等于给定的字符串
- title_contains:等待页面标题包含给定的字符串
- frame_to_be_available_and_switch_to_it:等待一个iframe或frame加载完成,并切换到该iframe或frame上
- alert_is_presnet:等待页面中出现alert
- text_to_be_persent_in_element((x,y), “Excepted Text”):等待某个元素的文本包含给定的文本
- element_to_be_selected:等待元素被选中
- element_located_to_be_selected:等待某个位于 DOM 中的元素被选中
selenium的鼠标事件
在WebDriver中,将这些鼠标操作的方法封装在ActionChains类中。
ActionChains类中提供了鼠标操作的常用方法:
- perform():执行所有ActionChains中存储的行为
- click(element):单击
- context_click(element):右击
- double_click(element):双击
- drag_and_drop(elemnt,target_element):拖动至target_element中并释放
- drag_and_drop_by_offset(element,x,y):拖拽Element至位置(x,y)
- move_to_element(element):鼠标悬浮、移动到元素
- click_and_hold(element):按下鼠标左键
- release(element):释放鼠标左键
selenium的键盘事件
Keys()类提供了键盘上几乎所有按键的方法,使用send_keys()方法输入键盘上的按钮。
注意的是:要先定位到输入框
常用的键盘操作:
- send_keys(Keys.BACK_SPACE)删除键
一次只能删除一个字符,要删除多个可以使用乘积
send_keys(4*Keys.BACK_SPACE) - send_keys(Keys.SPACE)空格键
- Keys.TAB制表键
- keys.ESCAPE回退键
- Keys.ENTER回车键
- send_keys(Keys.CONTROL,‘a’)全选
- send_keys(Keys.CONTRL,‘c’)复制
- send_keys(Keys.CONTRL,‘X’)剪切
- send_keys(Keys.CONTRL,‘V’)粘贴
- send_keys(Keys.F1)键盘F1
- …
获取断言信息
断言其实就是判断这个操作是否成功
- 断言页面标题
- 断言元素文本
- 断言元素存在
- 断言元素属性
selenium执行JavaScript脚本
1.可以允许你直接与浏览器交互,执行那些selenium本身可能无法直接完成的任务
2.用途:
(1)修改DOM元素
(2)获取页面信息,如滚动位置、元素属性等
(3)滚动页面
(4)模拟用户交互等
3.两种实现方式
(1)同步执行
execute_script(script,*args)
参数:
script:要执行的JavaScript脚本字符串
args:可选参数,表示要传递给脚本的任何参数
(2)异步执行
execute_async_script()
在web开发中,很多操作是异步的,这意味着他们不会立即完成,例如,当你点击一个按钮后,可能会有一个 AJAX 请求去服务器获取数据,然后更新页面。这种情况下,如果你只是简单地等待一段时间,可能无法保证页面已经完全加载完毕。使用 execute_async_script 的关键在于告诉 Selenium 什么时候异步操作完成了。
参数:同上
上传下载文件
上传文件
常见的web页面的上传,一般使用input标签或者是插件(JavaScript、Ajax),对于input标签的上传可以使用send_keys(路径)来进行上传。
下载文件
文件下载比较复杂,因为浏览器默认设置不会自动下载文件,而是会询问用户如何处理,浏览器要想实现文件下载,需要配置浏览器自动下载文件,并指定文件保存的路径。通过add_experimental_option添加prefs参数。(谷歌)
- download.default_directory:设置下载路径
- profile.default_content_settings.popups:0 禁止弹出窗口。
selenium屏幕截图
在selenium中,屏幕截图是一个非常实用的功能,可以帮助你在自动化测试过程中捕获网页状态,对于调试问题、验证视觉变化和记录测试结果都非常有帮助。
selenium WebDriver提供了相关方法:
1.driver.get_screenshot_as_file(filename):
将当前窗口的屏幕截图保存为png图像文件。 如果有任何io错误返回false,否则返回true。使用完整 文件名中的路径
2.driver.save_screenshot(self,filename):
将当前窗口的屏幕截图保存为PNG图像文件。如果存在IOError,则返回False,否则返回True。使用完整文件名中的路径
3.driver.get_screen_as_png():
以二进制数据的形式获取当前窗口的屏幕截图
4.driver.get_screen_as_base64():
以base64编码字符串的形式获取当前窗口的屏幕截图 这是有用的嵌入图像在html