selenium自动化测试的问题解决及优化

2023-11-16

一,安装出现的问题

1,webdriver has no attribute “find_element_by_id”

在这里插入图片描述

原因:下载selenium没有指定版本,导致版本过高,当前语法不支持
解决办法:cmd执行:1)pip uninstall selenium
2)pip install Selenium==3.12.0

2,gecodriver needs to be in PATH

在这里插入图片描述原因:驱动存放路径没有添加系统环境变量
解决办法:
1)找到驱动存放路径,复制路径
2)将复制的路径添加到系统环境变量中(PATH里)

3,安装了selenium报错has no attribute Chrome或者Firefox

在这里插入图片描述
原因:pycharm没有加上selenium包
解决办法:步骤五重新再执行一遍,点击确定就会出现当前python环境下安装的最新的包
在这里插入图片描述

二,测试中的问题

1,driver = webdriver.chrome() TypeError: ‘module‘ object is not callable

在这里插入图片描述
解决办法
方法一:
chrome的首字母应该为大写,如下:
driver=webdriver.Chrome()
修改代码后程序即可正常运行

from selenium import webdriver
driver = webdriver.Chrome()

方法二:
你也可以将路径传递给你的Chromedriver,将executable_path设置为你的chromedriver所在的位置(指向chromedriver.exe的路径,或者,对于非Windows用户,它被称为chromedriver):

driver = webdriver.Chrome(executable_path='C:/path/to/chromedriver.exe')

方法三:
driver = webdriver.Chrome()是因为没有chromedriver.exe这个文件
(1)下载一个chromedriver.exe 下载的链接为:
http://chromedriver.chromium.org/downloads
(2)然后根据自己的系统去下载不同的chromedriver.exe文件,windows只有32的但是都可以用
(3)解压后挡在这个目录的Scripts下面
在这里插入图片描述

2,ImprotError:No module named 'cv2’

在这里插入图片描述
利用以下命令:

pip install opencv-python

在这里插入图片描述

3,定位不到元素

原因:

  • 元素定位方式编写错误
  • 点击速度过快,页面没有加载出来就需要点击页面上的元
  • frame/iframe表单嵌套
  • 页面跳转到新的标签页,未切换handle窗口
  • 使用了动态属性进行定位元素

解决办法:

(1).Frame/Iframe原因定位不到元素:
这个是最常见的原因,首先要理解下frame的实质,frame中实际上是嵌入了另一个页面,而webdriver每次只能在一个页面识别,因此需要先定位到相应的frame,对那个页面里的元素进行定位。
解决方案:
如果iframe有name或id的话,直接使用switch_to_frame(“name值”)或switch_to_frame(“id值”)。如下:

driver=webdriver.Firefox()
driver.get(r’http://www.126.com/)
driver.switch_to_frame(‘x-URS-iframe’) #需先跳转到iframe框架
username=driver.find_element_by_name(‘email’)
username.clear()

如果iframe没有name或id的话,则可以通过下面的方式定位:

  • 先定位到iframe
    elementi= driver.find_element_by_class_name(‘APP-editor-iframe’)
  • 再将定位对象传给switch_to_frame()方法
    driver.switch_to_frame(elementi)

(2)还未加载出元素就开始定位元素

  • 强制等待sleep(3)
    不管元素,是否在页面出现都等 3 秒,再去操作它,是强制性。但是这种情况往往一般都只用在脚本的调试,真正的自动化测试用例中一般不会使用。
  • 隐式等待implicitly_wait(3)
    是设置的全局等待,等待时间是对页面中的所有元素设置加载时间,如果超出了设置时间的则抛出异常。缺点:隐式等待的三秒钟就是在等待这个页面的所有 js 和图片加载出来,就算需要操作的按钮出来了,还要去等 页面js、img 加载完成
  • 显示等待WebDriverWait(3)
    是针对于某个特定的元素设置的等待时间,在设置时间内,默认每隔一段时间检测一次当前页面某个元素是否存在,如果在规定的时间内找到了元素,则直接执行,即找到元素就执行相关操作,如果超过设置时间检测不到则抛出异常。默认检测频率为0.5s,默认抛出异常为:NoSuchElementException

4,自动化测试的异常

在这里插入图片描述
解决办法:

  • 1.try:要执行的代码块
    except 异常名称:
    print(“异常提示”)
  • 2.try:要执行的代码块
    except (异常名称)as 别名:
    print(“异常提示”)
  • 3.try:要执行的代码块
    except (异常名称)as 别名:
    print(“异常提示”)
    finally:
    最终必须要执行的代码块
  • 4.raise直接抛出异常

三,优化

1,Selenium中如何保证操作元素的成功率或者稳定性?

•减少操作步骤,例如需要多次操作进入测试页面,直接通过网址来打开,减少不必要的操作
•合理的使用等待操作:time.sleep()、driver.implicitly_wait()、WebDriverWait()
•使用多种方式进行id/name/class/xpath/css selector不同方式进行定位
•为了减少用例之间相互影响,所以设计用例时,尽量降低用例的耦合度
•多用try捕捉处理异常
•针对一些不稳定的动态控件经过JS实现操作
• 框架中使用用例失败重试,提升测试用例成功率

2,如何提高selenium脚本的执行速度?

•减少操作步骤,例如需要多次操作进入测试页面,直接通过网址来打开,减少不必要的操作
•中断页面加载,如果页面加载的内容过多,我们可以查看一下加载慢的原因,如果加载的内容不影响我们测试,就设置超时时间,中断页面加载
•服务器允许的情况下,尽量设置多线程运行,提高执行速度,前提用例之间没有耦合度
•使用更高配置的电脑和选择更快的网络环境
•不要加太多的sleep,尽量使用显式等待

3,定期检查测试

自动化测试的有效性需要通过维护去保持,定期重新审查就是一种测试脚本的维护手段,是非常有必要的。而频率则需要结合团队对测试脚本维护的力度来看,复审的主要的方法与开发完成之后的初次审查是一样的,只是关注点会稍有不同。检查测试有助于过滤掉不再相关的不必要和过时的数据。这有助于降低成本和维护工作

4,生成丰富的相关测试数据

高质量的数据对于良好的测试是必不可少的。因此,重要的是要确保数据是正确的、准确的及最新的,需涵盖系统内几乎所有的场景和功能。这里可以采用通用数据生成器ZenData来生成所需的大规模数据,支持多种语言,数据格式可自定义,一键生成百万条数据,毫无压力。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

selenium自动化测试的问题解决及优化 的相关文章

随机推荐

  • 1024 CodeGenerator

    答 水一下 CodeGenerator package com example springtest author LeCodeYang version 1 0 description TODO date 2022 7 11 15 22 i
  • Spring集成log4j,日志初始化过程详解

    以前研究过slf4j log4j的使用 但具体初始化过程不是很清楚 今天闲下来 翻了一下源码 一探究竟 日志组件介绍 url http www blogjava net daiyongzhi archive 2014 04 13 41236
  • Shell脚本定时清理Postgres数据库中历史数据

    Shell脚本定时清理Postgres数据库中历史数据 在系统日常运行中 会产生大量的日志 日志表会越来越加庞大 特别是对于云服务器使用者来说 每一块的空间都是很宝贵的 所以定时清理掉无用的历史日志 就显得很有意义了 其实实现数据库的日志清
  • 类的继承层次结构的宽度和深度

    最近在项目开发中 各位兄弟对于现有的架构有所诟病 主要是继承的问题 层次比较深 层次之间没有很明确的功能划分 造成一定的混乱 我来承担工作 想出一套新的方案 满足大家平时开发的需求 先总结下现在项目的问题 一个是层次深 一个是抽象的不好 大
  • linux16.04 从零开始搭建maskrcnn (!!亲测有效!!)

    文章参考 https github com pytorch vision blob temp tutorial tutorials torchvision finetuning instance segmentation ipynb 环境搭
  • STL源码分析:空间配置器浅析

    目录 allocator alloc 一级配置器 二级配置器 自由链表 内存分配allocate S refill函数 S chunk alloc函数 内存释放deallocate 为什么要使用free list 为什么free list要
  • Java-spring数据库编程(idea)实现学生账号登录以及管理员增删改查功能

    通过所学的Spring数据库编程知识 实现学生管理系统的登录及增删改查的功能 要求学生在控制台输入用户名密码 如果用户账号密码正确则显示登录成功 如果登录失败则显示登录失败 登录成功后 可以进行增删改的功能 思路分析 根据学生管理系统及其登
  • 【数据结构详细学习笔记2】单链表的定义和表示

    目录 1 单链表基础知识 1 1线性表链式存储结构的特点 1 2 与链式存储有关的术语 1 3链表的类型 1 4表示空表 1 5设置头结点的好处 2 单链表代码实现 附源码 3 实现单链表遇到问题 1 单链表基础知识 1 1线性表链式存储结
  • matlab 算法集锦

    算法集锦 决策树 划分点 function n h huafendian1 x n返回增益 h返回划分点 假设0代表第一类 假设1代表第二类 输入x第一列为属性 第二列为用于学习的分类结果 m sort x 1 按小到大排序 x x m t
  • Guava 之 Multimap

    Multimap 是 guava 包下的一个接口 是一个 key collection 类型的集合 Multimap 接口方法 GwtCompatible public interface Multimap
  • Git rebase变基操作

    先讲个例子理解一下什么是变基 A B C dev D E F G master 两个分支master dev 其中dev分支是在master分支上的提交点E拉出的分支 在两个分支合并之前 master分支有了新的提交F G 此时想在gitl
  • C的泛型编程

    C的泛型编程 C语言支持泛型编程吗 Generic关键字 泛型算法 C99的tgmath h void 指针 总结 泛型编程 generic programming 是程序设计语言的一种风格或范式 泛型允许程序员在强类型程序设计语言中编写代
  • RocketMQ经典高频面试题大全(附答案)

    编程界的小学生 0 彩蛋 1 说说你们公司线上生产环境用的是什么消息中间件 2 多个mq如何选型 3 为什么要使用MQ 4 RocketMQ由哪些角色组成 每个角色作用和特点是什么 5 RocketMQ中的Topic和JMS的queue有什
  • AQS(AbstractQueuedSynchronizer)阻塞队列

    AQS 队列同步器是用来构建锁或其他同步组件的基础框架 它使用一个 volatile int state 变量作为共享资源 如果线程获取资源失败 则进入同步队列等待 如果获取成功就执行临界区代码 释放资源时会通知同步队列中的等待线程 同步器
  • PyTorch YOLOv8入门解读与Python实现

    PyTorch YOLOv8入门解读与Python实现 YOLOv8是一种基于PyTorch框架实现的目标检测算法 它能够快速准确地检测图像中的多个目标 本文将详细解读YOLOv8的原理 并提供相应的Python代码实现 YOLOv8简介
  • Oracle--初学小白基础篇(第一版)

    文章目录 一 Oracle11g介绍 1 Oracle11g安装和卸载 Oracle11g安装 Oracle11g卸载 1 使用Oracle Universal Installer管理工具卸载 2 使用 deinstall bat 批处理文
  • Redis事务、持久化、发布订阅

    文章目录 Redis事务 Redis持久化 RDB Redis DataBase 快照方式 AOF Append Only File 日志形式 Redis发布订阅 发布订阅模型 实例 Redis发布订阅命令 原理 Redis事务 Redis
  • flutter 字符串的常用属性及方法

    1 字符串长度 var str 字符串的长度 print 打印 str length 打印 6 var str1 hello dart print 打印 str1 length 打印 10 2 是否为空 str isEmpty为空true
  • 关于ElasticSearch的Update By Query的那些著名的坑

    提起es的Update By Query很多人一定也不陌生 它对应的就是关系型数据库的update set where 语句 这对应一般的存储引擎而言算是最基本的功能 但它的坑确不少 多到让你使用起来很奔溃 比如批量更新时非事务模式执行 允
  • selenium自动化测试的问题解决及优化

    目录 一 安装出现的问题 1 webdriver has no attribute find element by id 2 gecodriver needs to be in PATH 3 安装了selenium报错has no attr