Selenium学习笔记目录
webdriver对象的一些方法
- 获取某个元素的属性值
# 获取选定元素对应的链接
ele.get_attribute("href")
- 获取当前窗口的title
driver.get('https://www.baidu.com/')
print(driver.title)
driver.find_element_by_id('kw')
print(driver.title)
获取当前窗口的地址栏url地址
driver.current_url
随着用户的操作,title和current_url会变化
截屏-全部屏幕
driver.get_screenshot_as_file('ssl.png')
- 截屏-某个元素
ele = driver.find_element_by_id('search')
ele.screenshot_as_png('serch.png')
切换窗口
-
切换到新的窗口里面操作
- 循环遍历所有的窗口 driver.window_handles
- driver.switch_to.window(handle)方法切入新窗口
- 检查该窗口特点,是否为要切入的那个
-
切换到最初的窗口
- 保存主窗口的handle
-
关闭窗口
- close方法
- quit()关闭整个浏览器
-
示例
# 点击某个元素,打开了一个新的窗口 # 保存主窗口handle mainWindow = driver.current_window_handle print(driver.window_handles) for handle in driver.window_handle: # 切换到新窗口 driver.switch_to.window(handle) # 检查是否是我们要进入到window if '百度' in driver.title: break # 进行操作 pass # 切换到主窗口 driver.switch_to.window(mainWindow) # 进行操作 pass
弹出对话框
- 对话框一般来说有三种:
- alert 简单通知(一个按钮)
- confirm (确定,取消)
- prompt (输入内容,确定,取消)
- 操作方法
driver.switch_to.alert.accept() # 点击ok
driver.switch_to.alert.text # 得到对话框内容
driver.switch_to.alert.getText() # 得到对话框的内容
driver.switch_to.alert.dismiss() # 点击Cancel
driver.switch_to.alert.send_keys() # 输入内容
# alert = driver.switch_to.alert() # 获取弹框
-
alert弹窗和html元素弹框
- alert弹窗,用上述方法
- html弹框,查找定位相关元素进行操作
-
如何判断alert弹窗和html弹框
- 点击F12,查看是否可以获得该元素
页面含有input元素,通过插入文件到方式input元素
win32com.client
- 直接发送键盘消息給 当前应用程序。
- 前提是浏览器必须是当前应用(放在最上层,浏览器运行后不要操作
import win32com.client
shell = win32com.client.Dispath('WScript.Shell')
shell.Senkey(r'd:\p1.jpg' + '\n')
刷新页面,前进,后退
- 页面刷新
refresh
- 前进
forward
- 后退
back
driver.refresh()
driver.forward()
driver.back()
使用技巧
- 易消失元素的查看技巧
- 鼠标移到该元素上面才会出现
- 鼠标移开就会消失
- 5秒后冻结页面
setTimeout(function(){debugger;},5000)
浏览器定位元素 copy selector
- 获取元素的方法
css
xpath
- 取巧:选中元素,右键点击copy,选择
copy selector
,或者选择copy xpath
上层节点有id时,此方法比较方便,否则可能会生成比较长的路径;
路径太长时,后期html中被修改的可能性比较大,不好维护
此方法并不适用于所有情况,慎用 - 动态的id不可使用
异常捕获,确保chrome进程退出
- 切换到新的窗口里面操作
- 使用try...finally...
try: # 可执行代码 except: print() finally: driver.quit()
特殊动作
- ActionChains 类
按下,移动,拖动等
- acInstance.action1().action2().actionN().perform()
- 移动到某个元素上面
- ActionChains(driver).move_to_element(ele).perform()
from selenium.webdriver.common.action_chains import ActionChains ac = ActionChains(driver) ac.move_to_element(driver.find_element_by_id('zxnav_1')).perform()
- 一次性输入多个input内容
t1 = driver.find_element_by_id('t1') t2 = driver.find_element_by_id('t2') t3 = driver.find_element_by_id('t3') from selenium.webdriver.common.action_chains import ActionChains ac = ActionChains(driver) ac.click(t1).send_key('1').click(t2).send_key('2').click(t3).send_key('3').perform()
页面元素不可见
- 通常不可见元素都是可以操作的
- 如果确实需要改变窗口大小
# 获取窗口大小,返回的size是字典(宽度和高度) size = driver.get_window_size() # 改变大小,()里对应的分别是宽度和高度,数字对应的是像素,size['height']表示保持原高度不变 driver.set_window_size(1100,size['height'])
- driver.max... 窗口最大化
- 滚动页面
# X坐标的值,Y坐标的值 # 正数往下往右移动,负数往上往左移动 driver.execute_script('window.scrollBy(250,0)') # 可在浏览器的console中输入window.scrollBy(250,0),以查看是否能滚动到自己想要的位置
渲染
- 后端渲染
- 前端渲染
- 前端渲染问题引起的报错:statle element reference
- 解决方法:获取内容前,sleep一下
合理使用半自动化
- 图形界面自动化的难度是比较大的
- 模拟难(12306输入验证码...)
- 检查难(检查logo、布局等...)
- 用半自动化的方法
-难自动化的操作,都提示(beep)让人去做import winsound winsound.Beep(1500,3000) # 发出提示音
- 其余部分:自动化 去做
- 自动化的目的:提高测试效率
自动化面对的问题
- 如何组织我们的自动化脚本?都放在一个大目录里面?
- 一次测试开始了,如何选择测试脚本去执行?难道是手动的一个个运行这些脚本?
- 每个测试脚本中,各个检查点是否通过,如何在测试结果里面清晰的反馈
- 一些通用功能的实现如何以库的形式组织起来,供各个脚本使用
- 执行结果如何以容易查看的报告的形式提交给别人查阅
- 以上这些都可以由自动化测试框架解决