八种元素定位方式 find_by_element_id find_by_element_xpath find_by_element_name find_by_element_link_text find_by_element_partial_link_text find_by_element_tag_name find_by_element_class_name find_by_element_css_selector
WebDriver执行流程: selenium测试脚本相当于乘客,把指示信息发给WebDriver驱动,驱动相当于司机,对乘客发来的指示信息进行解析,再传给浏览器,浏览器就相当于出租车,执行司机的操作,过程中会将结果向司机反馈,司机向乘客反馈。
WebDriver常用的属性和方法:
属性:
driver.name 浏览器名称
driver.current_url 当前URL
driver.title 当前页面标题
driver.page_source 当前页面源码
driver.current_window_handle 窗口句柄
driver.window_handles 当前窗口所有句柄
方法:
driver.quit()
driver.close()
driver.back()
driver.forward()
driver.refresh()
WebElement常用的属性和方法: 可以写一个e = WebElement,然后导入包,之后进源码查看属性和方法 属性: element.id element.size element.rect element.tag_name element.text 方法: element.send_keys() element.click() element.clear() element.get_attribute() 用于精确获得某一个属性,比如"name","value"属性 element.is_selected() element.is_enabled() element.is_displayed() element.value_of_css_proterty()
窗口跳转: def test_window(self): self.driver.find_element_by_link_text('新闻').click() windows = self.driver.window_handles
while 1: for w in windows: self.driver.switch_to.window(w) sleep(2)
操作form表单: 步骤:定位表单元素->输入测试值->判断表单元素属性->获得表单元素属性->提交表单进行验证 driver.switch_to.alert.accept用于关闭警示弹窗 多选框选择:(checkbox和radio) 用element.is_selected()来判断是否选中 下拉框选择:三种选择index,value,visible_text se = driver.find_element_by_id() select = Select(se) select.select_by_value() select.select_by_visible_text() 遍历下拉框的选项:for option in select.options 下拉框常用方法: select.select_by_value() select.select_by_index() select.select_by_visible_text() select.deselect_by_value() select.deselect_by_index() select.deselect_by_visible_text() select.deselect_all select.options select.all_selected_options select.first_selected_option
弹窗处理:alert、confirm、prompt(输入内容的弹窗) 方法属性: accept() 确认 dismiss() 取消 text 显示的文本 send_keys() 输入内容 有一个点要注意,自动化测试时存在焦点,当弹窗出现时,需要把焦点聚集到弹窗上,driver.switch_to.alert
selenium三种等待方式 1.time.sleep(固定等待):自动化框架中不能使用,对于网络状态良好的情况,会使自动化的时间变的很冗长,仅限于调试使用 2.implicitly_wait(隐式等待):隐式等待实际上设置一个最大等待时长,但是JavaScript一般都是放在最后加载,实际上页面全部元素加载完毕后,我们还在等待所有页面加载结束。对整个driver周期都起作用,最开始设置一次就可以(全局有效)。 3.WebDriverWait(显示等待):动态等待,隔一个小间隔进行轮询。 ①参数: driver 传入WebDriver实例 timeout 超时时间 poll_frequency 调用until或until_not的方法的时间间隔,默认0.5s ignored_exceptions 忽略的异常 ②方法: until和until_not
implicitly_wait实现: driver.implicitly_wait(10)
WebDriverWait实现: wait = WebDriverWait(self.driver,2,0.5) wait.until(EC.title_is('百度一下,你就知道')) wait.until_not()
selenium等待条件: 首先导入from selenium.webdriver.support import expected_conditions as EC title_is 判断title是否出现 title_contains 判断title页面标题是否包含某些字符 presence_of_element_located 判断某个元素是否被加载到了dom树里,但是并不代表这个元素可见 url_contains 判断当前url是否包含某个url url_matches 判断当前url是否符合某种格式 url_to_be 判断当前url是否出现 url_changes 判断当前url是否已经发生了变化 visibility_of_element_located 判断某个元素是否被添加到了dom树里,且宽高都大于0 visibility_of 判断看某个元素是否可见 presence_of_all_elements_located 判断至少有一个元素存在于dom树中,返回所有定位到的元素 visibility_of_any_elements_located 判断至少有一个元素在页面中可见 visibility_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 判断iframe是否可以switch进去 invisibility_of_element_located 判断某个元素是否在dom中不可见 element_to_be_clickable 判断某个元素是否可见并且是enable的,也就是说是是否可以点击 staleness_of 等待某个元素从dom中删除 element_to_be_selected 判断某个元素是否被选中了,一般用于下拉列表中 element_located_to_be_selected 与上面的意思一样,只不过上面实例化的时候传入的是元素对象,这个传入的是定位 element_selection_state_to_be 判断某个元素的选中状态是否符合预期 element_located_selection_state_to_be 与上面一样,只不过传值不同而已 number_of_windows_to_be 判断当前窗口数是否等于预期 new_window_is_opened 判断是否有窗口增加 alert_is_present 判断页面是否有弹窗
selenium鼠标和键盘事件: 导入包: from selenium.webdriver.common.action_chains import ActionChains from selenium import webdriver 鼠标事件:
单击鼠标左键
click(ele)
单击鼠标右键
context_click(ele)
双击鼠标左键
double_click(ele)
拖动某个元素后松开
drag_and_drop(source, target)
鼠标悬停在一个元素上
move_to_element(ele)
在某个元素上单击鼠标左键,不松开
click_and_hold(ele)
在某个元素上松开鼠标左键
release()
执行上速鼠标操作
perform() 键盘事件: 导入包:from selenium.webdriver.common.keys import Keys
删除键
send_keys(Keys.BACK_SPACE)
空格键
send_keys(Keys.SPACE)
tab 键
send_keys(Keys.TAB)
delete 键
send_keys(Keys.DELETE)
+ 键
send_keys(Keys.ADD)
enter 键
send_keys(Keys.ENTER)
shift 键
send_keys(Keys.SHIFT)
ctrl+A:全选
send_keys(Keys.CONTROL, 'a')
ctrl+C:复制
send_keys(Keys.CONTROL, 'c')
ctrl+V:粘贴
send_keys(Keys.CONTROL, 'v')
ctrl+X:剪切
send_keys(Keys.CONTROL, 'x')
F1 键
send_keys(Keys.F1)
数字9 键
send_keys(Keys.NUMPAD9)
selenium执行js脚本: self.driver.execute_script("alert('test')") js = 'return document.title' print(self.driver.execute_script(js))
selenium屏幕截图: save_screenshot(filename) 指定路径或者图片名 get_screenshot_as_base64() 获取当前屏幕截图base64编码 get_screenshot_as_file(filename) 获取当前屏幕截图,使用完整路径 get_screenshot_as_png() 获取当前屏幕截图的二进制文件数据
selenium定位frame、iframe:frame是相当于一个框架,可以引用外部的html文件 存在frame时有时会定位不到想要的元素,这时候需要把焦点切换到frame上 方法: switch_to.frame(reference) 切换frame,reference是传入的参数,用于定位frame,可以传入id、name、index以及selenium的WebElement对象 switch_to.default_content() 返回主文档 switch_to.parent_frame() 返回父文档
下载selenium IDE,实现测试的录制、回放等功能: selenium IDE是浏览器插件
项目阶段 项目环境搭建: jdk、MySQL、Tomcat、Jpress安装 测试需求分析和用例设计: 测试功能包括: 1.用户注册:http://localhost:8080/jpress/user/register 2.用户登录:http://localhost:8080/jpress/user/login 等等等 项目架构设计: testcases 测试用例(包) data 测试数据 logs 日志 config 配置文件 reports 测试报告 screenshots 截屏 lib 第三方库(包) util 工具(包)
对于一些选不了的元素,可以使用P有AutoGUI。是一个图形界面自动化工具,通过屏幕xy坐标确定目标位置,控制鼠标和键盘发送虚拟点按操作,完成按钮和表单填写的操作。 elem = driver.find_element_by_id('agree') rect = elem.rect pyautogui.moveTo(rect['x']+10,rect['y']+130)
两个识别验证码的模块:pytesseract(用于识别验证码)和PIL(用于把验证码抠出来)
复杂的验证码使用第三方的API平台,例如showapi