您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
web自动化工具selenium介绍与使用
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
web自动化工具selenium介绍与使用
自猿其说Tech
2022-04-06
IP归属:未知
638800浏览
测试
### 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,可以实现简单的脚本执行和录制回放等功能。 2. Selenium Gird是一种自动化测试的辅助工具,可以通过Gird实现多个环境的多个并发运行。 3. Selenium RC是第一代Selenium的核心工具, 在selenium3版本中彻底遗弃此模块,改为通过webdriver实现。Selenium RC 通过自带的代理服务器去访问应用从而将设置好的JS函数嵌入到浏览器页面,从而实现自动化执行的目的。 4. WebDriver是selenium核心组件,通过直接调用每个浏览器内置的自动化支持(各个浏览器提供的自动化插件,chrome为chromedriver,firefox为geckdriver等)来操作浏览器的操作,从而实现自动化执行的目的。相比于RC它旨在提供一个友好的API,它很容易探讨和理解。 <center>![](//img1.jcloudcs.com/developer.jdcloud.com/785476bf-1cef-420c-8bab-8705a7ce7be420220406144818.png) selenium-webdriver架构图</center> ### 3 selenium安装 selenium环境配置: #### 3.1 selenium 安装 使用 pip 命令安装即可 ```python 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 操作浏览器 ```python from selenium import webdriver # 启动浏览器 driver = webdriver.Chrome('D:\\driver\\chromedriver_96.exe') # 打开JD官网 driver.get("https://www.jd.com/") # 最大最小化浏览器 driver.minimize_window() driver.maximize_window() # 执行javaScript driver.execute_script("JS") # 切换标签页, driver.switch_to.window("") # 截屏 driver.save_screenshot("a.png") # 关闭当前标签页 driver.close() # 退出浏览器 driver.quit() ``` #### 4.2 定位元素 web自动化中最为重要的部分就是定位每个元素并针对元素进行操作,首先定位元素selenium提供了八种维度。 - id、name、class:通过元素的id、name、class属性进行定位元素 - tagname:通过元素的标签名,进行定位 - text、link_text:text通过元素的文字进行定位,link_text通过元素的文字进行模糊定位 - css、xpath:css通过css选择器进行定位,xpath通过xpath路径或选择器进行定位 因为id、name、class、tag、text等等因为可能不具备唯一性,推荐使用css或xpath定位。 如有个页面如下: ```html <!DOCTYPE html> <html> <body> <div class="c" name="n" id="i">Hello</div> </body> </html> ``` 如果我们要定位Hello这个元素,按照我们的定位方式,可以如下实现 ```python ele = driver.find_element_by_css_selector("html>body>div") ele = driver.find_element_by_xpath("/html/body/div") ele = driver.find_element_by_class_name("n") ele = driver.find_element_by_link_text("Hello") ele = driver.find_element_by_id("i") ele = driver.find_element_by_name("n") ele = driver.find_element_by_tag_name("div") ele = driver.find_element_by_partial_link_text("H") ``` #### 4.3 操作元素 定位到元素后我们操作元素才能实现我们的输入,点击,等操作,如下为常用的方法: ```python ele = driver.find_element_by_css_selector("html>body>div") # 点击元素 ele.click() # 输入a ele.send_keys("a") # 清空输入房 ele.clear() # 获取元素的文本 text1 = ele.text # 获取元素的标签名 tag = ele.tag_name # 获取元素的class属性 class_name = ele.get_attribute('class') ``` #### 4.4 模拟设备输入 在进行操作时为了方便或特殊操作需要我们用到鼠标或键盘进行一些操作,selenium提供了Action Chains来模拟这些操作。如下为常用的方法: ```python action = ActionChains(driver) # 点击,可以选择某个元素 action.click(on_element=None) # 输入元素,可通过Keys类来实现键盘特殊键的输入 action.send_keys(Keys.TAB) # 点击并按住不放 action.click_and_hold(on_element=None) # 鼠标右击 action.context_click() # 双击 action.double_click(on_element=None) # 拖拽,从source拖到target action.drag_and_drop(source=None, target=None) # 按住某个键,使用这个方法可以方便的实现某些快捷键,比如下面按下Ctrl+c键 action.key_down(Keys.CONTROL).send_keys('c').perform() # 松开某个键,可以配合上面的方法实现按下Ctrl+c并且释放。 action.key_up(Keys.CONTROL, element=None) # 指定鼠标移动到某一个位置,需要给出两个坐标位置 action.move_by_offset(xoffset=None, yoffset=None) # 将鼠标移动到指定的某个元素的位置 action.move_to_element(to_element=None) # 移动鼠标到某个元素位置的偏移位置 action.move_to_element_with_offset(to_element=None, xoffset=None, yoffset=None) # 将之前的一系列的ActionChains执行,写完操作方法后一定跟着perform()才会操作 action.perform() ``` ### 5 实例 如我们要实现一个简单的jd登录,我们应该怎么写: ```python from selenium import webdriver # 启动浏览器 driver = webdriver.Chrome('D:\\code_workspace\\plugins\\chromedriver_96.exe') # 打开JD登录页面 driver.get("https://passport.jd.com/new/login.aspx?ReturnUrl=https%3A%2F%2Fwww.jd.com%2F")driver.maximize_window() # 点击账户登录 driver.find_element_by_css_selector('div.login-tab:nth-child(3) > a:nth-child(1)').click() # 输入账户名和密码 driver.find_element_by_id("loginname").send_keys("login") driver.find_element_by_id("nloginpwd").send_keys("passwort") # 点击确认,进行登录 driver.find_element_by_id('loginsubmit').click() ``` 结果展示如下: ![](//img1.jcloudcs.com/developer.jdcloud.com/22aba525-1519-48db-8651-5fee11b726fc20220406145245.gif) ### 6 常见问题及解决方案 在实现自动化过程中因页面因素或网络因素等等原因,常常会因为各种原因定位失败或操作失败,从而导致自动化执行失败。下面介绍几个常见的失败方法和及其解决方案,如各位同学有其他问题时可自行搜索或联系我进行讨论。 #### 6.1 等待元素 在元素定位中最为常见的失败原因为元素定位失败导致中间某个流程未能操作从而导致整个流程失败,因此我们在定位元素时常用等待相关操作来完成页面元素加载成功,继而进行定位元素操作,从而实现元素的正常定位,常见的等待方式为三种,强制等待、隐性等待、显性等待。 - 强制等待:在定位元素前通过程序暂停来实现等待的要求。优点是代码实现简单。缺点是等待时间设置比较难,如果过短元素未能加载就寻找元素,如果时间过程则效率较低。 - 隐形等待:selenium提供了隐形等待的方法,当启用时每个页面加载时都会等待所有元素加载。优点是代码实现简单,整个的程序运行过程中都会有效,如果加载完成则不会继续等待。缺点是每次等待会等待所有元素,如某个元素加载失败则报错,不能针对每个元素进行等待 - 显性等待:selenium提供了显性等待的方法,针对每个元素进行独立的等待方式和等待时间。优点是 代码执行效率快,无需等待整个页面加载完成,针对不同的元素进行不同的等待方式。缺点是代码实现逻辑较为复杂,每个元素单独处理,但可以通过封装定位的方式降低工作量。 因实际场景原因本人推荐第三种显性等待方式,灵活实用,下面为各个等待方式实现方式: ```python # 强制等待 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 其他常见异常 在元素定位或操作过程中我们会遇到各种各样的定位失败原因,下面我列举下常见的定位失败或操作失败时处理方法。 1)切换frame\iframe或标签页 当新定位的元素在新的frame时我们需要通过切换frame 或 标签页去切换frame或标签页 ```python driver.switch_to.window('a') driver.switch_to.frame('a') ``` 2)元素被遮挡或无法操作 当页面有浮窗或弹窗时,我们操作元素如点击就会失败,那么我们有以下几个方式去进行操作避免元素。 ```python # 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¬ω¬) ``` 3)driver与当前浏览器浏览器不匹配 当某些情况下打开浏览器失败,浏览器操作元素时莫名的失败等等原因时我们首先要确认我们的浏览器版本与driver驱动的版本不匹配导致,我们每次执行前或定时检查,我们的浏览器是否自动升级,我们的driver是否匹配我们的浏览器。 4)定位元素失败或定位错误 当我们定位元素失败或定位的元素不是我们要的元素时,我们要确认我们的定位方式和定位结果是否唯一,如果定位方式错误或定位结果不唯一时会导致定位错误或定位失败,所以本人强烈建议使用css或xpath进行定位。能有效避免定位错误或失败的结果。 ### 7 总结 selenium的简单应用如上,如果只是单纯的简单了解或简单的一些页面操作,以上部分就能满足你的需求,可以通过手动编写或录制工具就能做出一份自动化脚本。但是如果是做一些较为复杂的操作或进行测试的话,在应用过程中因页面渲染,页面变动、元素变动等等原因,编写一个较为稳定的脚本,还是需要多加练习,后续我会将定位方式,使用心得,常见错误,现有框架等等与各位同学进行讨论。 ------------ ###### 自猿其说Tech-JDL京东物流技术与数据智能部 ###### 作者:苏日吉布胡楞
原创文章,需联系作者,授权转载
上一篇:一个宁静祥和没有bug的下午和SqlSession的故事
下一篇:如何保证MySQL和Redis的数据一致性?10分钟带你搞定!
相关文章
安全测试之探索windows游戏扫雷
Jmeter压测实战:Jmeter二次开发之JSF采样器实现
Laputa自动化测试框架介绍
自猿其说Tech
文章数
426
阅读量
2149964
作者其他文章
01
深入JDK中的Optional
本文将从Optional所解决的问题开始,逐层解剖,由浅入深,文中会出现Optioanl方法之间的对比,实践,误用情况分析,优缺点等。与大家一起,对这项Java8中的新特性,进行理解和深入。
01
Taro小程序跨端开发入门实战
为了让小程序开发更简单,更高效,我们采用 Taro 作为首选框架,我们将使用 Taro 的实践经验整理了出来,主要内容围绕着什么是 Taro,为什么用 Taro,以及 Taro 如何使用(正确使用的姿势),还有 Taro 背后的一些设计思想来进行展开,让大家能够对 Taro 有个完整的认识。
01
Flutter For Web实践
Flutter For Web 已经发布一年多时间,它的发布意味着我们可以真正地使用一套代码、一套资源部署整个大前端系统(包括:iOS、Android、Web)。渠道研发组经过一段时间的探索,使用Flutter For Web技术开发了移动端可视化编程平台—Flutter乐高,在这里希望和大家分享下使用Flutter For Web实践过程和踩坑实践
01
配运基础数据缓存瘦身实践
在基础数据的常规能力当中,数据的存取是最基础也是最重要的能力,为了整体提高数据的读取能力,缓存技术在基础数据的场景中得到了广泛的使用,下面会重点展示一下配运组近期针对数据缓存做的瘦身实践。
自猿其说Tech
文章数
426
阅读量
2149964
作者其他文章
01
深入JDK中的Optional
01
Taro小程序跨端开发入门实战
01
Flutter For Web实践
01
配运基础数据缓存瘦身实践
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号