UI自动化测试学习笔记整理(一)
一、下载安装Python
1.1官方文档安装 下载解压包:https://www.python.org/downloads/windows/
1.2配置Python环境变量(如果已经在安装的时候勾选了相关参数安装好Python会自动帮忙配置好环境变量)
1.3安装selenium:cmd命令提示符中通过pip install selenium安装;或者通过https://pypi.org/project/selenium/下载并进入相关目录通过python setup.py install安装
1.4验证selenium安装是否成功:cmd命令提示符中输入python,然后import selenium不报错表示selenium安装成功
1.5各个浏览器webdriver下载:
Chrome:http://chromedriver.storage.googleapis.com/index.html
Firefox:https://github.com/mozilla/geckodriver/releases
二、自动化中常用的类介绍
2.1导入webdriver模块:from selenium import webdriver
2.2导入等待时间模块: from time import sleep
2. 3导入模拟鼠标ActionChains 模块: from selenium.webdriver.common.action_chains import ActionChains
2.4导入模拟键盘操作keys模块:from selenium.webdriver.common.keys import Keys
2.5导入下拉框操作模块:from selenium.webdriver.support.ui import Select
三、编写自动化测试时一些常用的操作
3.1.driver = webdriver.Firefox()-通过webdriver启动浏览器
3.2.driver.get('网页地址')-进入指定网页
3.3.driver.set_window_size(400,800)#控制浏览器窗口大小
3.4.driver.maximize_window()#浏览器全屏
3.5.driver.back#浏览器后退
3.6.driver.forward()#浏览器前进
3.7drive.refresh()#刷新当前页面
3.8.driver.find_element_by_id().clear()#清除文本
3.9.driver.find_element_by_id().send_keys()#模拟按键输入
3.10.driver.find_element_by_id().click()#单击元素
3.11driver.find_element_by_id().size#打印输入框尺寸
3.12.driver.find_element_by_id().text#打印页面文字信息
3.13driver.find_element_by_id().get_attribute("")#括号内可输入元素名称比如:name,id,class,type。作用是获取括号内元素的值
3.14driver.find_element_by_id().is_displayed()#返回元素结果是否可见True/False
3.15.driver.current_url)#打印当前页面的URL
3.16.driver.implicitly_wait(10)#隐式等待10秒
3.17.driver.current_window_handle#输出当前窗口句柄
3.18.driver.window_handles # 获取当前全部窗口句柄集合
3.19.driver.close() # 关闭当前窗口
3.20.driver.quit()#退出浏览器
四、简述元素定位的八种方法
4.1.find_element_by_id()——id定位
4.2..find_element_by_name()——name定位
4.3.find_element_by_class_name()——class name定位
4.4.find_element_by_tag_name()——tag name定位
4.5.ind_element_by_link_test()——link test定位
4.6.find_element_by_partial_link_test()——partial link test定位
4.7.find_element_by_xpath()——xpath定位
4.8.find_element_by_css_selector()——css selector定位
注意:css定位方法的一些介绍链接:
https://m.jb51.net/article/168347.htm
https://blog.csdn.net/ruoruodetouzizhe/article/details/83026366
注意:需要使用一组定位时候一定要找到相同类型属性的一组元素,才可以定位如下实例
#如果只需要点击其中的某几个元素,可使用pop方法
#inputs = driver.find_elements_by_tag_name('input').pop(2).click()
#使用数组的方式点击其中第几个复选框
#inputs = driver.find_elements_by_tag_name('input')[1].click()
五、对鼠标的一些简单操作
on_element=driver.find_element_by_id("想要操作的元素ID")
5.1.ActionChains(driver).click(on_element) ——单击鼠标左键#这里的
5.2.ActionChains(driver).click_and_hold(on_element) ——点击鼠标左键,不松开
5.3ActionChains(driver).context_click(on_element) ——点击鼠标右键
5. 4.ActionChains(driver).double_click(on_element) ——双击鼠标左键
5.5.ActionChains(driver).drag_and_drop(source, target) ——拖拽到某个元素然后松开
5.6.ActionChains(driver).drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开
5.7.ActionChains(driver).key_down(value, element=None) ——按下某个键盘上的键
5.8.ActionChains(driver).key_up(value, element) ——松开某个键
5.9.ActionChains(driver).move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标
5.10.ActionChains(driver).move_to_element(on_element) ——鼠标移动到某个元素悬停操作
5.11.ActionChains(driver).move_to_element_with_offset(to_element, xoffset, yoffset)——移动到距某个元素(左上角坐标)多少距离的位置
5.12.ActionChains(driver).perform() ——执行链中的所有动作
5.13.ActionChains(driver).release(on_element=None) ——在某个元素位置松开鼠标左键
5.14.ActionChains(driver).send_keys(*keys_to_send) ——发送某个键到当前焦点的元素
六、对键盘的简单操作
6.1.ActionChains(driver).send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素
6.2.driver.find_element_by_id().send_keys('xxxx') #输入框输入内容
6.3.driver.find_element_by_id().send_keys(Keys.BACKSPACE) #退格
6. 4.driver.find_element_by_id().send_keys(Keys.CONTROL, 'a') #选中复制
6. 5.driver.find_element_by_id().send_keys(Keys.CONTROL, 'x') #选中剪切
6.6.driver.find_element_by_id().send_keys(Keys.CONTROL, 'v') #选中粘贴
6.7.driver.find_element_by_id().send_keys(Keys.BACK_SPACE)#回删一个字符
6.8.driver.find_element_by_id().send_keys(Keys.ENTER)#使用回车代替单击
七、通过js方法进行输入
7.1
text = "测试企业"#将要输入的内容定义一个变量
js="document.getElementById('id的元素').value='"+text+"';"
driver.execute_script(js)
7.2 -这里要选择的是id和i想要传入的数值
js = "$('#%s').val('%s')" % ('id的元素', '测试企业')
driver.execute_script(js)
7.3
js = 'document.getElementById("mainBody").send_keys("123456");'
driver.execute_script(js)
八、对操作结果的断言
8.1.driver.title#方法可以获取当前页面的标题显示的字段,可对标题进行断言
8.2.driver.current_url#方法获取当前页面url,可对url进行断言
8.3.presence_of_element_located:判断某个元素是否被加到dom树下,不代表该元素一定可见
8.4visibility_of_element_located:判断某个元素是否可见,可见代表元素非隐藏,并且元素的宽和高都不为0
8.5.visibility_of:跟上面的方法是一样的,只是上面需要传入locator,这个方法直接传定位到的element就好
8.6.presence_of_all_elements_located:判断是否至少一个元素存在于dom树中,举个例子,如果页面上有n个元素的class都是’coumn-md-3’,name只要有一个元素存在,这个方法就返回True
8.7.text_to_be_present_in_element:判断某个元素中的text文本是否包含预期字符串
8.8.text_to_be_present_in_element_value:判断某个元素中的value属性值是否包含了预期字符串
8.9.frame_to_be_availabe_and_switch_to_it:判断该frame是否可以switch进去,如果可以,则返回True并且switch进去,否则返回False
8.10.invisibility_of_element_located:判断某个元素是否不存在于dom树或不可见
8.11.element_to_be_clickable:判断某个元素是见并且是enable(有效)的,这样的话才叫clickable
8.12.staleness_of:等某个元素从dom树下移除,返回True或False
8.13.element_to_be_selected:判断某个元素是否被选中,一般用于select下拉表
8.14.element_selection_state_to_be:判断某个元素的选中状态是否符合预期
8.15.element_located_selection_state_to_be:跟上面的方法一样,只是上面的方法传入定位到的element,这个方法传入locator
8.16.alert_is_present:判断页面上是会否存在alert
九、多表单切换
9.1.switch_to.frame()括号内的值默认是可以直接取表单的ID或者name属性,如果iframe没有可用的ID和name属性,则可以通过元素定位的方式定位到之后再传到括号内。
9.2driver.switch_to.parent_content()返回上一级表单
9.3.driver.switch_to.parent_frame()从子frame切回到父frame,如果当前已是主文档,则无效果
十、动态id的定位方法
10.1.driver.find_element_by_xpath("//div[contains(@id, 'btn-attention')]")
contains(a, b) 如果a中含有字符串b,则返回true,否则返回false
10.2.driver.find_element_by_xpath("//div[starts-with(@id, 'btn-attention')]")
starts-with(a, b) 如果a是以字符串b开头,返回true,否则返回false
10.3driver.find_element_by_xpath("//div[ends-with(@id, 'btn-attention')]")
ends-with(a, b) 如果a是以字符串b结尾,返回true,否则返回false
十一、对弹出框的操作
11.1.driver.execute_script("window.alert('这是一个alert弹框。');") # 注意这里的分号是英文输入法的分号,不能用中文;此方法可以在页面弹出一个提示框
11.2.driver.switch_to.alert.accept() #处理web页面的警告窗
11.3.driver.switch_to.alert.text#获取弹框里的txt文本
11.4.driver.switch_to.dismiss()#点击取消按钮,如果有的话
11.5.send_keys-输入值。这个alert\confirm没有对话框就不能用了,不然会报错
十二、异常截图
12.1.driver.get_screenshot_as_file(u"D:/异常截图%s.png" % datetime.now().strftime("%Y%m%d.%H%M.%S.%f")[:-3])#需要导入from datetime import datetime
十三、滚动条的操作
13.1.内嵌式滚动条
Drag=driver.find_element_by_xpath("xxx") #找到滚动条
ActionChains(driver).drag_and_drop_by_offset(Drag, 0, 100).perform()#控制滚动条的行为,每次向y轴(及向下)移动10个单位
13.2.浏览器滚动条
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)#将滚动条移动到页面的底部
js="var q=document.documentElement.scrollTop=0"
driver.execute_script(js)#将滚动条移动到页面的顶部
将页面滚动条移动到页面任意位置,改变等于号后的数值即可
js="var q=document.documentElement.scrollTop=xxx"
driver.execute_script(js)
十四、下拉框(记得先要导入下拉框类之后才可进行此操作)
注意:Select类:用于定位<select>标签。
sel=driver.find_element_by_id('')#定位到下拉框元素
14.1.select_by_value():通过value值定位下拉选项。
Select(sel).select_by_value('value的值')
14.2.select_by_visible_text():通过text值定位下拉选项。
Select(sel).select_by_visible_text("txt内容")
14.3.select_by_index():根据下拉选项的索引进行选择。第一个选项为0,第二个选项为1。
Select(sel).select_by_index(索引值)
十五、Page Object用法
Page Object 是 Selenium 自动化测试项目开发实践的最佳设计模式之一,它主要体现在对界面交互细节的封装,这样可以使测试案例更关注于业务而非界面细节,从而提高测试案例的可读性。
Page Object的设计思想上是把元素定位与元素操作进行分层,这样带的来最直接的好处就 是当元素发生变化时,只需维护page层的元素定位,而不需要关心在哪些测试用例当中使用了 这些元素。在编写测试用例时,也不需要关心元素是如何定位的。
Page Object 设计模式的优点如下:
- 减少代码的重复。
- 提高测试用例的可读性。
- 提高测试用例的可维护性,特别是针对 UI 频繁变化的项目。

浙公网安备 33010602011771号