基于Python的Selenium经验总结
大家都知道,基于Web端的测试的基础框架是需要Selenium做主要支撑的,这里边给大家介绍下Web测试核心之基于Python的Selenium
一、简单介绍
Selenium 是用于测试 Web 应用程序用户界面 (UI) 的常用框架。它是一款用于运行端到端功能测试的超强工具。您可以使用多个编程语言编写测试,并且 Selenium 能够在一个或多个浏览器中执行这些测试。
二、环境安装
1. 安装python,这个。。。忽略,建议python2.7。
2. 安装基于python的selenium依赖包,命令:pip install selenium==2.53.6,你懂的。
3. 安装浏览器驱动包,推荐使用chrome浏览器的chromedriver.exe,对应chrome版本一定要对哦,不然运行不起来的,安装在哪?想放哪放哪,不过一般是放在python的根目录下。下载地址:http://chromedriver.storage.googleapis.com/index.html
4. 安装PyCharm 2.7左右版本,这个无脑安装~然后可自定义界面UI及编码风格,这个。。。忽略
三、牛刀小试
1. 控制浏览器
#coding=utf-8 from selenium import webdriver driver = webdriver.Chrome() driver.get("http://www.baidu.com") driver.maximize_window() #将浏览器最大化显示 driver.set_window_size(480, 800) #设置浏览器宽480、高800显示" driver.back() #后退 driver.forward() #前进 driver.close() #关闭chrome driver.quit() # 退出chrome
2. 对象的定位
1.通过id定位:find_element_by_id()
2.通过name定位:find_element_by_name()
3.通过class定位:find_element_by_class_name()
4.通过tag定位:find_element_by_tag_name()
5.通过link定位:find_element_by_link_text()
6.通过partial_link定位:find_element_by_partial_link_text()
7.通过xpath定位:find_element_by_xpath()
8.通过css定位:find_element_by_css_selector()
以上几种定位是常规操作,应该就基本够用了,但是有的时候就是会出现一些诡异的定位失效或者定位到了点击失效的问题,这个时候如果用js进行直接执行该事件,接下来介绍下非常规操作:
-
- id定位:document.getElementById()
- name定位:document.getElementsByName()
- tag定位:document.getElementsByTagName()
- class定位:document.getElementsByClassName()
- css定位:document.querySelectorAll()
search_js = "document.getElementsByName('wd')[0].value='selenium';"# 通过name定位,然后赋值“selenium” search_js2 = "document.querySelectorAll('.s_ipt')[0].value='selenium';"# 通过css定位,然后赋值“selenium” button_js = "document.getElementById('su').click();"# 通过id定位,然后执行单击操作 button_js2 = "document.getElementsByClassName('s_btn')[0].click()"# 通过className定位,然后执行单击操作 driver.execute_script(search_js2)#执行,execute_script(script, *args)
以上几种定位是可以再度升级,可以利用jQuery定位一波,这里可参看之前总结的JQ选择器中的思维导图知识点(https://www.cnblogs.com/aoaoao/articles/9708860.html)来实现,这里基本类似于JS,便忽略
3. 操作测试对象
#coding=utf-8 from selenium import webdriver driver = webdriver.Chrome() driver.get("http://passport.kuaibo.com/login/") driver.find_element_by_id("user_name").clear() #清除输入框的默认内容 driver.find_element_by_id("user_name").send_keys("username") driver.find_element_by_id("user_pwd").clear() driver.find_element_by_id("user_pwd").send_keys("password") #输入输入框的内容为“password” driver.find_element_by_id("dl_an_submit").click() #通过 submit() 来提交操作 driver.find_element_by_id("dl_an_submit").submit() size=driver.find_element_by_id("kw").size #返回百度输入框的宽高 text=driver.find_element_by_id("cp").text #返回百度页面底部备案信息 #返回元素的属性值,可以是 id、name、type 或元素拥有的其它任意属性 attribute=driver.find_element_by_id("kw").get_attribute('type') #返回元素的结果是否可见,返回结果为 True 或 False result=driver.find_element_by_id("kw").is_displayed() driver.quit() #退出
4. 鼠标键盘事件
from selenium import webdriver #引入 Keys 类包 from selenium.webdriver.common.keys import Keys #引入 ActionChains 类 from selenium.webdriver.common.action_chains import ActionChains ... #鼠标事件 #定位到要操作的元素 right =driver.find_element_by_xpath("xx") #对定位到的元素执行鼠标右键操作 ActionChains(driver).context_click(right).perform() #对定位到的元素执行鼠标双击操作 ActionChains(driver).double_click(right).perform() #对定位到的元素执行鼠标移动到上面的操作 ActionChains(driver).move_to_element(right).perform() #对定位到的元素执行鼠标左键按下的操作 ActionChains(driver).click_and_hold(right).perform() #定位元素的原位置 element = driver.find_element_by_name("xxx") #定位元素要移动到的目标位置 target = driver.find_element_by_name("xxx") #执行元素的移动操作 ActionChains(driver).drag_and_drop(element, target).perform() #键盘事件 #删除多输入的一个 值 driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE) #输入空格键+“教程” driver.find_element_by_id("kw").send_keys(Keys.SPACE) driver.find_element_by_id("kw").send_keys(u"教程") #ctrl+x 剪切输入框内容 driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x') #其余的键盘操作类似
5. 等待时间
#coding=utf-8 from selenium import webdriver #导入 WebDriverWait 包 from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC #导入 time 包 import time driver = webdriver.Chrome() driver.get("http://www.baidu.com") #WebDriverWait()方法使用,显示等待,WebDriverWait(driver,超时时长,调用频率,忽略异常).until(可执行方法,超时返回的信息),这里可以调用EC来实现可执行方法 is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).until_not(lambda x: x.find_element_by_id(“kw”).is_displayed()) #until(method, message=’ ’),调用该方法提供的驱动程序作为一个参数,直到返回值不为 False element.send_keys("selenium") #添加智能等待,隐时等待 driver.implicitly_wait(30) driver.find_element_by_id("su").click() #添加固定休眠时间,强制等待 time.sleep(5) driver.quit()
6. 组对象定位及层级定位,呃,忽略
7. 多窗口处理
#coding=utf-8 from selenium import webdriver import time driver = webdriver.Chrome() driver.get("http://www.baidu.com/") #获得当前窗口 nowhandle=driver.current_window_handle #打开注册新窗口 driver.find_element_by_name("tj_reg").click() allhandles=driver.window_handles #循环判断窗口是否为当前窗口 for handle in allhandles: if handle != nowhandle: driver.switch_to_window(handle) print 'now register window!' #切换到邮箱注册标签 driver.find_element_by_id("mailRegTab").click() time.sleep(5) driver.close() #回到原先的窗口 driver.switch_to_window(nowhandle) driver.find_element_by_id("kw").send_keys(u"注册成功!") time.sleep(3) #ifrome处理 #这里会自动识别id,name,如果没有则可以将元素通过选择器找到,然后输入该元素即可 driver.switch_to_frame("f1") element = driver.find_element_by_id("kw") driver.switch_to_frame(element) driver.quit()
8. 提示窗口处理
#coding=utf-8 from selenium import webdriver import time driver = webdriver.Chrome() driver.get("http://www.baidu.com/") #点击打开搜索设置 driver.find_element_by_name("tj_setting").click() driver.find_element_by_id("SL_1").click() #点击保存设置 driver.find_element_by_xpath("//div[@id='gxszButton']/input").click() #获取网页上的警告信息 alert=driver.switch_to_alert() #接收警告信息 alert.accept() #取消对话框(如果有的话) alert.dismiss() #输入值(如果有的话) alert.send_keys(“xxx”)
9. 控制浏览器滚动条,这个运用之前提示的jq语句即可实现
10. cookie处理,主要用途在于处理验证码问题****
#coding=utf-8 from selenium import webdriver import time driver = webdriver.Chrome() driver.get("http://www.youdao.com") #向 cookie 的 name 和 value 添加会话信息。 driver.add_cookie({'name':'key-aaaaaaa', 'value':'value-bbbb'}) #遍历 cookies 中的 name 和 value 信息打印,当然还有上面添加的信息 for cookie in driver.get_cookies(): print "%s -> %s" % (cookie['name'], cookie['value']) ##### 下面可以通过两种方式删除 cookie ##### # 删除一个特定的 cookie driver.delete_cookie("CookieName") # 删除所有 cookie driver.delete_all_cookies() time.sleep(2) driver.close()
四、小结
如果对软件测试、接口测试、自动化测试、性能测试、LR脚本开发、面试经验交流。感兴趣可以175317069,群内会有不定期的发放免费的资料链接,这些资料都是从各个技术网站搜集、整理出来的,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。
在熟悉了selenium常见的API基本操作后,这里便可以开展实际测试用例的设计了,一个良好的自动化测试用例起码符合一下五个条件:
1、一个脚本是一个完整的场景,从用户登陆操作到用户退出系统关闭浏览器。
2、一个脚本脚本只验证一个功能点,不要试图用户登陆系统后把所有的功能都进行验证再退出系统
3、尽量只做功能中正向逻辑的验证,不要考虑太多逆向逻辑的验证,逆向逻辑的情况很多(例如手 号输错有很多种情况),验证一方面比较复杂,需要编写大量的脚本,另一方面自动化脚本本身比较脆弱, 很多非正常的逻辑的验证能力不强。(我们尽量遵循用户正常使用原则编写脚本即可)
4、脚本之间不要产生关联性,也就是说编写的每一个脚本都是独立的,不能依赖或影响其他脚本。
5、如果对数据进行了修改,需要对数据进行还原。
6、在整个脚本中只对验证点进行验证,不要对整个脚本每一步都做验证。
最后配合unittest或者testNG单元测试框架,实现分层、数据驱动、断言、截图、日志等全方位功能,得心应手的开展自动化测试工作。
出处:https://blog.csdn.net/Stephen_shijun/article/details/83992279
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
聊聊LinkedHashMap
LinkedHashMap简介 LinkedHashMap是一个根据某种规则有序的hashmap。根据名字,我们也可以看出这个集合是有hash散列的功能的同时也有顺序。hashmap是无法根据某种顺序来访问数据的,例如放入集合的元素先后的顺序。list都有这个功能,可以根据放入集合的先后来访问具体的数据。这里大家也肯定是有疑问的,例如都已经使用了hash了,为什么还要去保证顺序访问。这个在后面的场景中解释。 LinkedHashMap的实现 当刚遇到这个集合的时候,我也疑惑,能同时满足条件的数据结构究竟是怎么样的。如果没有思考这个问题,还请看到这里好好想想。 ---------滑稽分割-------- 答案确实是没有这样的数据结构。他是两种结构的组合。一种是我们熟悉的hashmap。另外一种就是链表。数据存入集合的时候,先根据hashmap的流程存放入数组中。然后再根据链表的原则,进行链接。 如果看源码,也会发现其实没有多少方法。基本都是继承自hashmap的。 public class LinkedHashMap<K,V> extends HashMap<K,V&g...
- 下一篇
树莓派上利用Tensorflow实现小车的自动驾驶
先抛出大家最关心的——代码地址: github传送门:https://github.com/Timthony/self_drive 码云传送门:https://gitee.com/tiantianhang/self_drive 基于树莓派的人工智能自动驾驶小车 # 整体流程 电机控制 摄像头调试 道路数据采集 搭建深度学习模型,参数调试 自动驾驶真实道路模拟 参数最终调试 使用方法: 1. 先将树莓派小车硬件组装好 2. 使用zth_car_control.py来控制小车的前后左右移动,配合zth_collect_data.py来人工操作,使小车在自己制作的跑道进行数据采集。(该过程在树莓派进行) 3. 数据采集完成以后使用zth_process_img.py来对采集的数据进行处理,之前当前先完成一些数据清洗的工作。(电脑上执行) 4. 使用神经网络模型对数据进行训练zth_train.py,得到训练好的模型。(电脑上执行) 5. 在树莓派小车上使用zth_drive和训练好的模型,载入模型,即可实现在原先跑道的自动驾驶。(树莓派上执行) 注意:只需要使...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题