Agile Alliance web自动化工具selenium介绍与使用
1 前言
selenium是web自动化工具中较为出色和广为流传的一个工具,因此测试相关同学大多都会使用selenium,一般涉及web自动化时基本都会首选selenium,因此也都了解基本原理和相关用法,但是最近在进行自动化测试时发现开发同学和产品同学也会对自动化测试较为感兴趣,且selenium入门较为简单,因此这次通过这篇文章简单介绍下selenium和其中的selenium webdriver,并使用selenium webdriver实现一些操作。
因本人使用中较多使用python编写selenium,后续安装配置与代码部分均使用python语言及其相关工具,如其他同学想使用java,js等其他语言和工具可以网上搜索相关教程即可,安装与使用并无太多复杂流程和不同之处。
2 selenium介绍
selenium是一款用于Web应用程序测试的工具,它支持多平台、多语言、多浏览去实现自动化测试。selenium(汉语硒)是一种元素,因为硒可以对抗水银,因此也传selenium是QTP杀手(QTP mercury,mercury-水银的意思,QTP为另一种较为广泛使用的自动化工具)。
selenium由selenium IDE,selenium Webdriver, selenium Grid, selenium RC几个关键模块组成。
1.Selenium IDE 是selenium自带的IDE,可以实现简单的脚本执行和录制回放等功能。
1.Selenium Gird是一种自动化测试的辅助工具,可以通过Gird实现多个环境的多个并发运行。
1.Selenium RC是第一代Selenium的核心工具, 在selenium3版本中彻底遗弃此模块,改为通过webdriver实现。Selenium RC 通过自带的代理服务器去访问应用从而将设置好的JS函数嵌入到浏览器页面,从而实现自动化执行的目的。
1.WebDriver是selenium核心组件,通过直接调用每个浏览器内置的自动化支持(各个浏览器提供的自动化插件,chrome为chromedriver,firefox为geckdriver等)来操作浏览器的操作,从而实现自动化执行的目的。相比于RC它旨在提供一个友好的API,它很容易探讨和理解。
selenium-webdriver架构图
3 selenium安装
selenium环境配置:
3.1 selenium 安装
使用 pip 命令安装即可
pip install selenium
3.2 配置driver
需要安装测试浏览器对应的driver才能启用相关浏览器,并进行操作。如driver与浏览器版本不匹配可能会出现不兼容现象,所以得保证driver版本与浏览器版本相匹配。
如chrome的话可以通过谷歌官方(地址:https://chromedriver.chromium.org/downloads)或淘宝镜像(地址:https://registry.npmmirror.com/binary.html?path=chromedriver/)来获取与目标浏览器匹配的driver。如为了方便可以将driver配置到环境变量中或python目录下,后续启动时无需指定
4 selenium-webdriver使用
selenium webdriver提供了比较全面的api,我们可以通过调用提供的方法实现自动化测试。
4.1 操作浏览器
from selenium import webdriver
启动浏览器
driver = webdriver.Chrome(‘D:\driver\chromedriver_96.exe’)
打开美术宝官网
driver.get(“https://www.https://logis-test.meishubao.com/warehouse/warehouse-list.com/”)
最大最小化浏览器
driver.minimize_window()
driver.maximize_window()
执行javaScript
driver.execute_script(“JS”)
切换标签页,
driver.switch_to.window(“”)
截屏
driver.save_screenshot(“a.png”)
关闭当前标签页
driver.close()
退出浏览器
driver.
4.2 定位元素
web自动化中最为重要的部分就是定位每个元素并针对元素进行操作,首先定位元素selenium提供了八种维度。
1.id、name、class:通过元素的id、name、class属性进行定位元素
1.tagname:通过元素的标签名,进行定位
1.text、link_text:text通过元素的文字进行定位,link_text通过元素的文字进行模糊定位
1.css、xpath:css通过css选择器进行定位,xpath通过xpath路径或选择器进行定位
因为id、name、class、tag、text等等因为可能不具备唯一性,推荐使用css或xpath定位。
如有个页面如下:
6 常见问题及解决方案
在实现自动化过程中因页面因素或网络因素等等原因,常常会因为各种原因定位失败或操作失败,从而导致自动化执行失败。下面介绍几个常见的失败方法和及其解决方案,如各位同学有其他问题时可自行搜索或联系我进行讨论。
6.1 等待元素
在元素定位中最为常见的失败原因为元素定位失败导致中间某个流程未能操作从而导致整个流程失败,因此我们在定位元素时常用等待操作来完成页面元素加载成功,继而进行定位元素操作,从而实现元素的正常定位,常见的等待方式为三种,强制等待、隐性等待、显性等待。
强制等待:在定位元素前通过程序暂停来实现等待的要求。优点是代码实现简单。缺点是等待时间设置比较难,如果过短元素未能加载就寻找元素,如果时间过程则效率较低。
隐形等待:selenium提供了隐形等待的方法,当启用时每个页面加载时都会等待所有元素加载。优点是代码实现简单,整个的程序运行过程中都会有效,如果加载完成则不会继续等待。缺点是每次等待会等待所有元素,如某个元素加载失败则报错,不能针对每个元素进行等待
显性等待:selenium提供了显性等待的方法,针对每个元素进行独立的等待方式和等待时间。优点是 代码执行效率快,无需等待整个页面加载完成,针对不同的元素进行不同的等待方式。缺点是代码实现逻辑较为复杂,每个元素单独处理,但可以通过封装定位的方式降低工作量。
因实际场景原因本人推荐第三种显性等待方式,灵活实用,下面为各个等待方式实现方式:
强制等待
time.sleep(3)
driver.find_element_by_id(‘a’)
隐形等待
driver.implicitly_wait(20)
driver.find_element_by_id(‘a’)
显性等待
expected_conditions 提供了多种等待方式如判断元素是否存在,元素是否可以点击等等,具体方法可自行搜索
from selenium.webdriver.support.wait import WebDriverWait
WebDriverWait(driver, 10).until(expected_conditions.presence_of_element_located((By.ID, ‘a’))).send_keys(‘123’)
WebDriverWait(driver, 10).until(expected_conditions.element_to_be_clickable((By.ID, ‘a’))).click()
6.2 其他常见异常
在元素定位或操作过程中我们会遇到各种各样的定位失败原因,下面我列举下常见的定位失败或操作失败时处理方法。
切换frame\iframe或标签页
当新定位的元素在新的frame时我们需要通过切换frame 或 标签页去切换frame或标签页
driver.switch_to.window(‘a’)
driver.switch_to.frame(‘a’)
元素被遮挡或无法操作
当页面有浮窗或弹窗时,我们操作元素如点击就会失败,那么我们有以下几个方式去进行操作避免元素。
1、通过js将点击元素移动至页面最上方
driver.execute_script(“arguments[0].scrollIntoView();”, driver.find_element_by_id(‘a’))
driver.find_element_by_id(‘a’).click()
2、元素被弹窗遮挡,关闭
driver.switch_to.alert().accept()
3、其他情况按照实际情况进行处理(lll¬ω¬)
driver与当前浏览器浏览器不匹配
当某些情况下打开浏览器失败,浏览器操作元素时莫名的失败等等原因时我们首先要确认我们的浏览器版本与driver驱动的版本不匹配导致,我们每次执行前或定时检查,我们的浏览器是否自动升级,我们的driver是否匹配我们的浏览器。
定位元素失败或定位错误
当我们定位元素失败或定位的元素不是我们要的元素时,我们要确认我们的定位方式和定位结果是否唯一,如果定位方式错误或定位结果不唯一时会导致定位错误或定位失败,所以本人强烈建议使用css或xpath进行定位。能有效避免定位错误或失败的结果。
7 总结
selenium的简单应用如上,如果只是单纯的简单了解或简单的一些页面操作,以上部分就能满足你的需求,可以通过手动编写或录制工具就能做出一份自动化脚本。但是如果是做一些较为复杂的操作或进行测试的话,在应用过程中因页面渲染,页面变动、元素变动等等原因,编写一个较为稳定的脚本,还是需要多加练习,后续我会将定位方式,使用心得,常见错误,现有框架等等与各位同学进行讨论。
欢迎各位同学讨论、指正、提出意见。