python+selenium做ui自动化测试用法必会

一、前言

  大家都知道,基于Web端的测试的基础框架是需要Selenium做主要支撑的,这里边给大家介绍下Web测试核心之基于Python的Selenium

  Selenium是用于测试Web应用程序用户界面(UI)的常用框架。它是一款用于运行端到端功能测试的超强工具。您可以使用多个编程语言编写测试,并且Selenium能够在一个或多个浏览器中执行这些测试。

二、环境安装

 建议 python3.7。

  安装基于python的selenium依赖包,命令:pipinstallselenium

  安装浏览器驱动包,推荐使用chrome浏览器的chromedriver.exe,对应chrome版本一定要对哦,不然运行不起来的,安装在哪?想放哪放哪,不过一般是放在python的根目录下。下载地址:
chromedriver.storage.googleapis.com/index.html

  安装PyCharm,这个无脑安装~然后可自定义界面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.对象的定位

通过 id 定位:find_element_by_id()

通过 name 定位:find_element_by_name()

通过 class 定位:find_element_by_class_name()

通过 tag 定位:find_element_by_tag_name()

通过 link 定位:find_element_by_link_text()

通过 partial_link 定位:find_element_by_partial_link_text()

通过 xpath 定位:find_element_by_xpath()

通过 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定位一波。

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("百度一下,你就知道") #获得当前窗口

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("百度一下,你就知道") #点击打开搜索设置

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()

四、小结

  在熟悉了selenium常见的API基本操作后,这里便可以开展实际测试用例的设计了,一个良好的自动化测试用例起码符合一下六个条件:

  1.一个脚本是一个完整的场景,从用户登陆操作到用户退出系统关闭浏览器。

  2.一个脚本脚本只验证一个功能点,不要试图用户登陆系统后把所有的功能都进行验证再退出系统。

  3.尽量只做功能中正向逻辑的验证,不要考虑太多逆向逻辑的验证,逆向逻辑的情况很多(例如手号输错有很多种情况),验证一方面比较复杂,需要编写大量的脚本,另一方面自动化脚本本身比较脆弱,很多非正常的逻辑的验证能力不强。(我们尽量遵循用户正常使用原则编写脚本即可)

  4.脚本之间不要产生关联性,也就是说编写的每一个脚本都是独立的,不能依赖或影响其他脚本。

  5.如果对数据进行了修改,需要对数据进行还原。

  6.在整个脚本中只对验证点进行验证,不要对整个脚本每一步都做验证。

 最后配合unittest或者testNG单元测试框架,实现分层、数据驱动、断言、截图、日志等全方位功能,得心应手的开展自动化测试工作。

 

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/487356.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ExperimentalWarning: The http2 module is an experimental API.

错误提示 Node.js:ExperimentalWarning: The fs.promises API is experimental原因是node的版本不是最新的,而在项目引入的模块是最新的,node.js的版本低于模块的版本: 解决方法: 1、升级版本 npm install -g npm 更新npm到最新版 npm ins…

MyBatis3源码深度解析(二十一)动态SQL实现原理(二)动态SQL解析过程、#{}和${}的区别

文章目录 前言8.5 动态SQL解析过程8.5.1 SQL配置转换为SqlSource对象8.5.2 SqlSource转换为静态SQL语句 8.6 #{}和${}的区别8.7 小结 前言 在【MyBatis3源码深度解析(二十)动态SQL实现原理(一)动态SQL的核心组件】中研究了MyBatis动态SQL相关的组件,如SqlSource用于…

vue.js制作学习计划表案例

通俗易懂,完成“学习计划表”用于对学习计划进行管理,包括对学习计划进行添加、删除、修改等操作。 一. 初始页面效果展示 二.添加学习计划页面效果展示 三.修改学习计划完成状态的页面效果展示 四.删除学习计划 当学习计划处于“已完成”状态时&…

Linux基础-Makefile

目录 一、Make简介 二、Makefile基本结构 示例: 补充(Makefile): 伪目标: 三、创建和使用变量 变量定义的方式: 简单方式: 递归方式: 用?定义变量 为变量添加值 预定义变量 例 自动变量 例…

C++函数模板详解(结合代码)

目录 1. 模板概念 2. 函数模板语法 3. 函数模板注意事项 4. 函数模板案例 5. 普通函数与函数模板的区别 6. 普通函数与函数模板的调用规则 7. 模板的局限性 1. 模板概念 在C中,模板是一种通用的程序设计工具,它允许我们处理多种数据类型而不是固…

【STM32嵌入式系统设计与开发】——9Timer(定时器中断实验)

这里写目录标题 一、任务描述二、任务实施1、ActiveBeep工程文件夹创建2、函数编辑(1)主函数编辑(2)USART1初始化函数(usart1_init())(3)USART数据发送函数( USART1_Send_Data(&…

【Java基础知识总结 | 第六篇】Java反射知识总结

文章目录 6.Java反射知识总结6.1概述6.1.1什么是反射?6.1.2为什么使用反射? 6.2反射的原理6.3反射的使用6.3.1获取类对象(1)通过具体类的类名获取(2)通过对象实例获取(3)通过class.f…

正式发布:VitePress 1.0 现代化静态站点生成器!

大家好,我是奇兵,今天介绍一下现代化静态站点生成器!,希望能帮到大家。 3 月 21 日, 由 Vue 团队出品的现代化静态站点生成器 VitePress 正式发布 1.0 版本!它专为构建快速、以内容为中心的网站而生,能够轻…

Django之Celery篇(一)

一、介绍 Celery是由Python开发、简单、灵活、可靠的分布式任务队列,是一个处理异步任务的框架,其本质是生产者消费者模型,生产者发送任务到消息队列,消费者负责处理任务。 Celery侧重于实时操作,但对调度支持也很好,其每天可以处理数以百万计的任务。特点: 简单:熟悉…

获取Book里所有sheet的名字,且带上超链接

应用背景: 当一个excel有很多sheet的时候,来回切换sheet会比较复杂,所以我希望excel的第一页有目录,可以随着sheet的增加,减少,改名而随时可以去更新,还希望有超链接可以直接跳到该sheet。 可以…

VPCFormer:一个基于transformer的多视角指静脉识别模型和一个新基准

文章目录 VPCFormer:一个基于transformer的多视角指静脉识别模型和一个新基准总结摘要介绍相关工作单视角指静脉识别多视角指静脉识别Transformer 数据库基本信息 方法总体结构静脉掩膜生成VPC编码器视角内相关性的提取视角间相关关系提取输出融合IFFN近邻感知模块(NPM) patch嵌…

ssm006基于java的少儿编程网上报名系统+vue

少儿编程网上报名系统 摘 要 在国家重视教育影响下,教育部门的密确配合下,对教育进行改革、多样性、质量等等的要求,使教育系统的管理和运营比过去十年前更加理性化。依照这一现实为基础,设计一个快捷而又方便的网上少儿编程网上…

pdf压缩文件怎么压缩最小?一键压缩PDF

pdf文件压缩是为了减小文件大小,以便更轻松地共享、传输和存储文件,通过压缩pdf文件,可以减少文件占用的存储空间,加快文件的上传和下载速度,并节省带宽和存储成本;在本教程中,我们将介绍一些有效的方法来最…

如何自定义一个starter?

在Spring Boot中,创建一个自定义starter可以简化特定功能或组件的配置过程,让其他项目能够轻松地重用这些功能。 一、问题解析 这里我们以自定义一个xxl-job的starter为例,介绍下如何简化配置。 添加依赖 添加Spring Boot的依赖&#xff1a…

关于网格数据导出指定格式的测试(以Gmsh导出nas格式为例)

本文主要讲述Gmsh如何导出nas格式的网格数据,众所周知,Gmsh可以导出多种网格数据格式,比如大家熟悉的msh、stl、inp、cgns(似乎不完善)等等,但是gmsh不支持nas格式的导出,只支持nas格式的导入&a…

Bug定位与分析,软件测试员你中招了吗?

之所以写这一篇文章,是突然想起来曾经在测试过程中被开发嘲讽过,事情是这样的,当时发现了一个疑似前端的Bug就草草提交到了禅道,结果刚来的女前端看到了就有点生气地问我为啥不查清到底是前后端问题就直接派给她前端了&#xff0c…

睿考网:不是会计专业能考中级会计师吗?

不是会计专业也是可以考中级会计师的,中级会计师报名条件中并没有对专业做明确的限制,不同的学历对工作年限的要求不一样,如果考生满足报考条件就可以参加。 1.具备大学专科学历,从事会计工作满5年。 2.具备大学本科学历或学士学…

大数据Doris(七十):全球电商狂欢节万亿级实时大屏解决方案

文章目录 全球电商狂欢节万亿级实时大屏解决方案 一、背景介绍 <

学习vue3第十一节(依赖注入:provide/inject)

本机介绍&#xff1a;provide/inject 注意&#xff1a;大家在看此小节时候&#xff0c;默认大家已经了解一些组件的使用方法 1、依赖注入的用途&#xff1a; 当嵌套层级多的时候&#xff0c;某个子组件需要较远层级的父组件数据时候&#xff0c;如果我们依然使用props 传递数…