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单元测试框架,实现分层、数据驱动、断言、截图、日志等全方位功能,得心应手的开展自动化测试工作。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/nhb687095/article/details/135883226

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ajax的应用

1. Ajax Ajax是Asynchronous Javascript And XML(异步JavaScript和XML)的缩写。 Ajax技术描述了使用脚本操纵HTTP和Web服务器进行数据交换,在页面不刷新的情况下,实现页面的局部更新。 重点: Ajax 是一种在无需重新加…

气膜结构的使用寿命及其优势—轻空间

气膜结构以其独特的构造方式和显著的优势,在体育馆、展览馆、临时建筑等领域越来越受欢迎。尽管气膜结构的使用寿命与传统钢结构相比可能较短,但其在成本、建造速度、灵活性等方面的优势使其成为许多应用场景中的理想选择。本文将详细探讨气膜结构的使用…

如何基于Excel文件图形化从零建表并导入数据(以MySQL和SQLynx为例)

目录 1. 准备Excel数据 2. 导入Excel数据 a. 登录SQLynx b. 导入Excel文件 3. 验证数据 4. 使用和管理表 5. 总结 在实际的业务过程中,我们经常会有很多数据存储在Excel中,但在Excel中的数据分析不如使用SQL和数据库方便,数据量大些的…

C++ //练习 14.14 你觉得为什么调用operator+=来定义operator+比其他方法更有效?

C Primer(第5版) 练习 14.14 练习 14.14 你觉得为什么调用operator来定义operator比其他方法更有效? 环境:Linux Ubuntu(云服务器) 工具:vim 解释 使用更简洁,因为结果直接会累计…

location.href = ‘welcome.html‘;报错 - Completed 406 NOT_ACCEPTABLE

巧妙解决方案,使用服务端进行redirect即可 。 package com.aliyun.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping;Controller public class RedirectController {GetMapping("/r…

盲盒App开发时有哪些技术框架可以借鉴

在开发盲盒App时,技术框架的选择对于应用的性能、稳定性和用户体验都至关重要。以下是几个可以借鉴的技术框架,它们在不同方面提供了优势,并且结合了参考文章中的相关信息: 前端技术框架 微信小程序框架: 优点&#…

PostgreSQL ,OVER 子句妙用

在 PostgreSQL 中,OVER 子句是窗口函数定义的一部分,用于指定窗口函数的窗口范围。窗口函数允许你对一组行执行计算,这些行构成了一个结果集中的窗口。OVER 子句定义了这个窗口的开始和结束行。 以下是 OVER 子句的一些关键点: 默…

Interlinks Manager评测:WordPress 的最佳内部链接插件?

在这篇Interlinks Manager评测中,我们将彻底查看它是否真的是 WordPress 最佳内部链接插件!我们还将检查它是否值得您尝试。现在就开始吧 快速浏览一下插件,你就会对其提供的功能有一个基本的了解。 Interlinks Manager是一款 SEO 插件&…

加速“芯”动力 | 2024集成电路测试工程师研修班(苏州场)报名通知

6月19日—20日,加速“芯”动力——2024集成电路测试工程师研修班正式开课。本次培训课程内容包括芯片设计测试技术分享、解决方案分享、ATE编程接口介绍、ATE向量微指令、ATE量产界面介绍、测试开发基础培训、程序开发实训等内容,感兴趣的小伙伴&#xf…

建议收藏!亚马逊卖家必须知道的37个常用术语解释

运营亚马逊,经常会看到很多个专业术语,想必大部分新手卖家都比较陌生,熟悉这些常用术语的含义有助于你更好地运营亚马逊。下面为各位整理了37个在亚马逊跨境电商中常见的术语及其解释,建议收藏! 1、SKU Stock Keeping…

PaddleDetection安装文档

PaddlePaddle/PaddleDetection 配置环境 安装paddlepaddle conda create -n py39_paddledet python3.9conda activate py39_paddledetpython -m pip install paddlepaddle-gpu2.6.1.post112 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html验证是否安装成…

gnss变形监测基础(一)

文章目录 一、GNSS(Global Navigation Satellite System)二、GNSS传感器三、GNSS变形监测 一、GNSS(Global Navigation Satellite System) GNSS是全球导航卫星系统(Global Navigation Satellite System)的…

Go基础编程 - 05 - 数组与切片

目录 1. 数组2. 切片2.1. slice 声明、初始化2.2. slice 操作2.3. append() 追加切片、扩容2.4. 字符串和切片 3. Copy4. Array、Slice 内存布局 上一篇:基本类型、常量和变量 下一篇:指针 1. 数组 数组是同一种类型固定长度的序列(有长度、…

工业 web4.0 的 UI 风格,独树一帜

工业 web4.0 的 UI 风格,独树一帜

[深度学习]基于C++和onnxruntime部署yolov10的onnx模型

基于C和ONNX Runtime部署YOLOv10的ONNX模型,可以遵循以下步骤: 准备环境:首先,确保已经下载后指定版本opencv和onnruntime的C库。 模型转换:按照官方源码:https://github.com/THU-MIG/yolov10 安装好yolov…

【计算机网络】TCP报文详解

认识TCP报头 其实协议的形式都是一个结构化的数据,TCP协议也不例外。一起来看看TCP协议的报头是怎么样的。 以上就是TCP报头,实际上是一个结构化的数据,也就是一个结构体。例如: struct tcp_hdr {unsigned int stc_port : 16;un…

光储充一体化,开启绿色出行新篇章

一、追光逐梦,绿色能源点亮未来 在蔚蓝的天空下,光伏发电板如同一片片金色的叶子,静静地捕捉着太阳的光芒。它们不仅为大地带来光明,更是绿色出行的强大后盾。光储充一体化充电站,以光伏为源,储能为桥&…

linux 环境下动态链接库试验

1.概要 2.代码 2.1 main.c #include <stdio.h> #include "lib1.h"int main(){printf("hello word\n");int a add(2,3);printf("%d\n",a);return 0; } 2.2 lib1.c #include "lib1.h" int add(int a,int b){return ab; } 2…

Kubernetes集群部署Prometheus和Grafana

目录 一、部署Node-Exporter 二、Prometheus安装和配置 1.创建账号并予以授权 2.创建存储卷存储Prometheus配置信息 3.通过Deployment方式部署Prometheus 4.创建Service 三、Prometheus配置热加载 四、Grafana安装 五、K8s部署Kube-State-Metrics 1.创建Kube-State-M…

C#开发-集合使用和技巧(一)常用集合和方法介绍

C#开发-集合使用和技巧 &#xff08;一&#xff09;常用集合和方法介绍常用集合和方法介绍 C#开发-集合使用和技巧1. 集合基础集合介绍集合跟数组对比 2.我们常用的集合类型列表List<T>键值对集合Dictionary<TKey,TValue>队列Queue<T>其他一些集合类型堆栈St…