Selenium浏览器自动化测试框架详解

news/2024/5/9 13:19:51

selenium简介

介绍

Selenium [1] 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。

功能

优势

  • 框架底层使用JavaScript模拟真实用户对浏览器进行操作。测试脚本执行时,浏览器自动按照脚本代码做出点击,输入,打开,验证等操作,就像真实用户所做的一样,从终端用户的角度测试应用程序。
  • 使浏览器兼容性测试自动化成为可能,尽管在不同的浏览器上依然有细微的差别。
  • 使用简单,可使用Java,Python等多种语言编写用例脚本。

  Selenium 测试直接在浏览器中运行,就像真实用户所做的一样。Selenium 测试可以在 Windows、Linux 和 Macintosh上的 Internet Explorer、Chrome和 Firefox 中运行。其他测试工具都不能覆盖如此多的平台。使用 Selenium 和在浏览器中运行测试还有很多其他好处。

下面是主要的两大好处:

通过编写模仿用户操作的 Selenium 测试脚本,可以从终端用户的角度来测试应用程序。通过在不同浏览器中运行测试,更容易发现浏览器的不兼容性。Selenium 的核心,也称browser bot,是用 JavaScript 编写的。这使得测试脚本可以在受支持的浏览器中运行。browser bot 负责执行从测试脚本接收到的命令,测试脚本要么是用 HTML 的表布局编写的,要么是使用一种受支持的编程语言编写的。

官方文档

chromedriver下载:

chromedriver与chrome的对应关系表:

基本使用

安装: pip install selenium

  1. from selenium import webdriver

  2. browser = webdriver.Chrome(executable_path='chromedriver.exe') # 声明一个浏览器对象 指定使用chromedriver.exe路径

  3. browser.get("https://www.baidu.com") # 打开Chrome

  4. input = browser.find_element_by_id("kw") # 通过id定位到input框

  5. input.send_keys("python") # 在输入框内输入python

  6. print(browser.current_url) # 打印url

  7. print(browser.get_cookies()) # 打印Cookies

  8. print(browser.page_source) # 打印网页源代码

  9. browser.close() # 关闭浏览器

获取单节点

  1. from selenium import webdriver

  2. browser = webdriver.Chrome()

  3. browser.get("https://www.taobao.com")

  4. # 找到搜索框

  5. input_id = browser.find_element_by_id("q") # 通过id找

  6. input_name = browser.find_element_by_name("q") # 通过name属性值找

  7. input_css = browser.find_element_by_css_selector("#q") # 根据css选择器找

  8. input_xpath = browser.find_element_by_xpath('//*[@id="q"]') # 根据xpath找

  9. print(input_id,input_name,input_css,input_xpath)

  10. browser.close()

  11. """

  12. <selenium.webdriver.remote.webelement.WebElement (session="1dfb3c1ac919b0a5ff778cd3bf6db759", element="84b6d58e-04d6-4483-9a3f-f2e116437075")>

  13. <selenium.webdriver.remote.webelement.WebElement (session="1dfb3c1ac919b0a5ff778cd3bf6db759", element="84b6d58e-04d6-4483-9a3f-f2e116437075")>

  14. <selenium.webdriver.remote.webelement.WebElement (session="1dfb3c1ac919b0a5ff778cd3bf6db759", element="84b6d58e-04d6-4483-9a3f-f2e116437075")>

  15. <selenium.webdriver.remote.webelement.WebElement (session="1dfb3c1ac919b0a5ff778cd3bf6db759", element="84b6d58e-04d6-4483-9a3f-f2e116437075")>

  16. """

  17. # 其他获取单个节点方法

  18. """

  19. find_element_by_link_text

  20. find_element_by_partial_link_text

  21. find_element_by_tag_name

  22. find_element_by_class_name

  23. """

  24. # 通过方法

  25. # find_element(By.ID,"q") # 参数为查找方式和值

获取多节点

  1. from selenium import webdriver

  2. browser = webdriver.Chrome()

  3. browser.get("https://www.taobao.com")

  4. lis = browser.find_elements_by_css_selector(".service-bd li") # 注意是elements多个s

  5. print(lis) # 输出为列表

  6. """

  7. [<selenium.webdriver.remote.webelement.WebElement (session="588f61b0d90f7bf199d3f0ede6f9fb99", element="454d656c-1730-410e-891e-210bfdf0d248")>, <selenium.webdriver.remote.webelement.WebElement (session="588f61b0d90f7bf199d3f0ede6f9fb99", element="119177aa-014a-48c1-8bea-8ca9a50b446e")>, <selenium.webdriver.remote.webelement.WebElement (session="588f61b0d90f7bf199d3f0ede6f9fb99", element="974860cf-1218-4ddf-a745-85f86090e188")>, <selenium.webdriver.remote.webelement.WebElement (session="588f61b0d90f7bf199d3f0ede6f9fb99", element="e5877c0c-f4df-4847-9875-1c81d56f21ee")>]

  8. """

  9. # 其他获取多个节点方法

  10. """

  11. find_elements_by_id("q")

  12. find_elements_by_name("q")

  13. find_elements_by_css_selector("#q")

  14. find_elements_by_xpath('//*[@id="q"]')

  15. find_elements_by_link_text

  16. find_elements_by_partial_link_text

  17. find_elements_by_tag_name

  18. find_elements_by_class_name

  19. """

  20. # 通过方法

  21. # find_elements(By.CSS_SELECTOR,".service-bd li") # 参数为查找方式和值

节点交互

  1. import time

  2. from selenium import webdriver

  3. browser = webdriver.Chrome()

  4. browser.get("https://www.taobao.com")

  5. """

  6. selenium可以驱动浏览器来执行一些动作:

  7. 输入文字用send_keys()

  8. 清空文字用clear()

  9. 点击按钮用click()

  10. """

  11. input = browser.find_element_by_id("q")

  12. input.send_keys("iPhone") #在搜索框输入iPhone

  13. input.clear() # 清空搜索框的文字

  14. time.sleep(2)

  15. input.send_keys("iPad") # 在搜索框输入iPad

  16. button = browser.find_element_by_class_name("btn-search") # 获取点击按钮

  17. button.click() # 点击搜索

动作链#

  1. from selenium import webdriver

  2. from selenium.webdriver import ActionChains # 引入动作链

  3. browser = webdriver.Chrome()

  4. url = "https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"

  5. browser.get(url)

  6. browser.switch_to.frame("iframeResult") # 切换到元素所在的frame[框架]

  7. """

  8. 可以传入id、name、index以及selenium的WebElement对象,index从0开始

  9. """

  10. source = browser.find_element_by_css_selector("#draggable") # 找到被拖拽对象

  11. target = browser.find_element_by_css_selector("#droppable") # 找到目标

  12. actions = ActionChains(browser) # 声明actions对象

  13. actions.drag_and_drop(source,target) # 拖拽元素的起点和终点

  14. actions.perform() # 执行动作

  15. action.click_and_hold() # 点击且长按,更多方法查看官方文档

执行JavaScript代码

  1. from selenium import webdriver

  2. browser = webdriver.Chrome()

  3. url = "https://www.zhihu.com/explore"

  4. browser.get(url)

  5. browser.execute_script("window.scrollTo(0,document.body.scrollHeight)") # 将进度条下拉到最底部

  6. browser.execute_script("alert('hello word')") # 弹出alert提示窗

获取节点信息

  1. from selenium import webdriver

  2. browser = webdriver.Chrome()

  3. url = "https://www.zhihu.com/explore"

  4. browser.get(url)

  5. """

  6. WebElement常用属性:

  7. get_attribute 获取属性值

  8. text 获取文本值

  9. id 获取节点id

  10. location 获取节点在页面中的相对位置

  11. tag_name 获取标签名称

  12. size 获取节点大小(宽和高)

  13. """

  14. # 获取属性

  15. logo = browser.find_element_by_id("zh-top-link-logo") # 获取logo节点

  16. print(logo) # 返回值为WebElement对象

  17. logo_class = logo.get_attribute("class") # 获取zh-top-link-logo节点的class属性值

  18. print(logo_class)

  19. # 获取文本值

  20. text_Ele = browser.find_element_by_css_selector(".question_link") # 通过css选择器获取文本内容所在的标签

  21. text = text_Ele.text # 取出标签内的文本内容

  22. print(text)

  23. # 获取ID 位置 标签名和大小

  24. test = browser.find_element_by_class_name("zu-top-add-question")

  25. print(test.id) # 0bfe7ae6-ebd9-499a-8f4e-35ae34776687

  26. print(test.location) # {'x': 759, 'y': 7}

  27. print(test.tag_name) # button

  28. print(test.size) # {'height': 32, 'width': 66}

切换frame

  1. from selenium import webdriver

  2. browser = webdriver.Chrome()

  3. url = "https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"

  4. browser.get(url)

  5. """

  6. 网页中有一种节点叫做iframe,也就是子Frame,相当于页面的子页面,

  7. 他的结构和外部网页的结构完全一致。

  8. selenium打开页面后,他默认是在父级Frame里面操作,

  9. 而此时如果页面中还有子Frame,他是不能获取到子Frame里面的节点的,

  10. 这时候就需要使用switch_to.frame()方法来切换Frame。

  11. """

  12. browser.switch_to.frame("iframeResult")

  13. logo = browser.find_elements_by_class_name("logo")

  14. print(logo)

  15. # [<selenium.webdriver.remote.webelement.WebElement (session="1ccb11403013c749ce9fceda50a00975", element="88e5924e-d655-44c3-a905-8af1947b9d86")>]

延时等待

  1. ---------------------------隐式等待-------------------------

  2. from selenium import webdriver

  3. browser = webdriver.Chrome()

  4. # 隐式等待

  5. browser.implicitly_wait(2) # 设定等待时间

  6. url = "https://www.zhihu.com/explore"

  7. browser.get(url)

  8. input = browser.find_element_by_class_name("aaa")

  9. print(input)

  10. # 报错信息

  11. """

  12. raise exception_class(message, screen, stacktrace)

  13. selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".aaa"}

  14. (Session info: chrome=75.0.3770.142)

  15. """

  16. """

  17. 如果selenium没有在DOM中找到节点,将继续等待,超出设定事件后,则抛出找不到节点的异常。

  18. 当查找节点而节点并没有立即出现的时候,隐式等待将等待一段时间在查找DOM,默认时间是0

  19. """

  20. --------------------------显式等待------------------------

  21. # 显示等待

  22. from selenium import webdriver

  23. from selenium.webdriver.common.by import By

  24. from selenium.webdriver.support.ui import WebDriverWait

  25. from selenium.webdriver.support import expected_conditions as EC

  26. browser = webdriver.Chrome()

  27. browser.get("https://www.taobao.com/")

  28. wait = WebDriverWait(browser,2)

  29. input = wait.until(EC.presence_of_element_located((By.ID,"q")))

  30. button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,".btn-search")))

  31. print(input,button)

  32. # 等待条件

  33. # EC.presence_of_element_located 节点出现

  34. # EC.element_to_be_clickable 可点击

  35. # 更多等待条件查看260页

  36. """

  37. 引入WebDriverWait对象指定最长等待时间,调用它的until方法,

  38. 传入要等待的条件expected_conditions,比如这里传入例如presence_of_element_located

  39. 这个条件,代表节点出现的意思,其参数是节点的定位元组,也就是ID为q的搜索框。

  40. 这样可以做到的效果就是,在10秒内如果ID为q的节点(即搜索框)成功加载出来,就返回该节点,

  41. 如果10秒还没有加载出来,就抛出异常。

  42. """

  43. """

  44. 异常:

  45. TimeoutException

  46. """

  47. """

  48. 指定要查找的节点,然后指定一个最长等待时间,如果在规定时间内加载出来了这个节点,

  49. 就返回查找的节点,如果到了规定时间依然没有加载出该节点,则抛出【超时】异常

  50. """

前进和后退

  1. import time

  2. from selenium import webdriver

  3. browser = webdriver.Chrome()

  4. browser.get("https://www.baidu.com")

  5. browser.get("https://www.taobao.com")

  6. browser.get("https://www.jd.com")

  7. browser.back() # 后退

  8. time.sleep(2)

  9. browser.forward() # 前进

  10. browser.close() # 关闭浏览器

  11. # 连续访问三个页面

cookies

  1. from selenium import webdriver

  2. browser = webdriver.Chrome()

  3. browser.get("https://www.zhihu.com/explore")

  4. cookies = browser.get_cookies() # 获取cookies

  5. print(cookies)

  6. browser.add_cookie({"name":"name","domain":"www.zhihu.com","vlue":"germey"})

  7. browser.delete_all_cookies() # 删除所有cookies

选项卡管理

  1. import time

  2. from selenium import webdriver

  3. browser = webdriver.Chrome()

  4. browser.get("https://www.baidu.com")

  5. browser.execute_script("window.open()")

  6. print(browser.window_handles)

  7. # ['CDwindow-7106D94FF002752ADF198B986343E31D', 'CDwindow-B669BA9559DBB78D8D6EC9C5AA699C40']

  8. browser.switch_to.window(browser.window_handles[1])

  9. browser.get("https://www.taobao.com")

  10. time.sleep(1)

  11. browser.switch_to.window(browser.window_handles[0])

  12. browser.get("https://jd.com")

  13. """

  14. 1、打开百度网页

  15. 2、新开一个选项卡,调用execute_script()方法传入JavaScript语法window.open()

  16. 3、切换到新打开的选项卡,调用window_handles属性获取当前开启的所有选项卡,返回的是选项卡的代号列表,

  17. 要想切换选项卡只需要调用switch_to.window()方法,这里我们将第二个选项卡代号传入,

  18. 即跳转到第二个选项卡,在第二个选项卡里打开新页面https://www.taobao.com,然后切换回第一个选项卡打开jd页面

  19. """

异常处理

  1. from selenium import webdriver

  2. browser = webdriver.Chrome()

  3. browser.get("https://www.baidu.com")

  4. try:

  5. browser.find_element_by_id("hello")

  6. except Exception as e:

  7. print(e) # 打印错误信息 Exception捕获所有错误信息赋给e

  8. finally:

  9. browser.close()

  10. """

  11. 在使用selenium的过程中,难免遇到一些异常,例如超时、节点未找到错误,

  12. 一旦出现此类错误,程序便不会在继续运行了,这里我们使用try except语句来捕获各种异常

  13. """

选项卡切换

  1. import time

  2. from selenium import webdriver

  3. from selenium.webdriver import ChromeOptions

  4. option = ChromeOptions()

  5. browser = webdriver.Chrome(executable_path='D:\chromedriver.exe',options=option) # 声明一个浏览器对象

  6. option.add_experimental_option('excludeSwitches', ['enable-automation'])

  7. browser.get("https://www.baidu.com") # 打开Chrome

  8. input = browser.find_element_by_id("kw") # 通过id定位到input框

  9. input.send_keys("爱奇艺") # 在输入框内输入python

  10. browser.find_element_by_id("su").click()

  11. time.sleep(3)

  12. browser.find_element_by_xpath('//*[@id="1"]/h3').click()

  13. time.sleep(10)

  14. browser.switch_to_window(browser.window_handles[1]) # 切换到新打开的选项卡定位爱奇艺的搜索框

  15. search = browser.find_element_by_xpath("//input[@class='search-box-input']").send_keys("青春有你")

  16. browser.close() # 关闭浏览器

无头浏览器

  1. from selenium import webdriver

  2. from selenium.webdriver.chrome.options import Options

  3. # 创建chrome参数对象

  4. opt = Options()

  5. # 把chrome设置成无界面模式,不论windows还是linux都可以,自动适配对应参数

  6. opt.add_argument('--headless')

  7. # 创建chrome无界面对象

  8. driver = webdriver.Chrome(options=opt)

  9. driver.get("http://www.baidu.com")

  10. print(driver.page_source)

总结:

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

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

  1. 文档获取方式:

  2. 加入我的软件测试交流群:680748947免费获取~(同行大佬一起学术交流,每晚都有大佬直播分享技术知识点)

这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取


http://www.mrgr.cn/p/13521127

相关文章

【转】linux设置密钥登录(只允许密钥登录)

转, 原文: https://www.cnblogs.com/dyj--php/p/9656016.html ----------------- 一.root用户使用这条命令看看家目录有没有(.ssh文件夹),cd .ssh,如果存在就会进入这个文件夹,不存在就(makedir .ssh),修改.ssh这个文件夹权限(chmod 700 .ssh),查看.ssh文件夹下是…

嵌入式作业2.1 汇编练习

目录原始参考代码(main.s)作业一、翻译汇编成C语言二、修改参考代码 原始参考代码(main.s) 汇编代码: //===================================================================== //文件名称:main.s //功能概要:汇编编程调用GPIO构件控制小灯闪烁(利用printf输出提示信…

window10 安装 Redis

一、下载压缩包(免安装) 地址: https://github.com/tporadowski/redis/releases二、解压解压路径自定义 Logs目录,手动添加的,用于保存redis的日志记录 (下面再补充)下图为解压后的文件三、注册Redis服务以管理员权限打开cmd窗口,执行以下命令# 安装redis服务 redis-se…

Camera基础知识四

MIPI-CSI2的PHY层定义了CSI传输介质的电气特性、帧格式以及时钟等,如下:DPHY Lane States:Escape Mode跟csi无关,是DSI用的LP切换到HS模式切换:差分信号一般100mv - 300mv HS_SETTLE,这段时间,1.2V降到100-300mv需要时间稳定下来。HS_ZERO表示发送为0。 一旦MIPITX发送0…

Spring Cloud 十:Spring Cloud与微前端

Spring Cloud 一&#xff1a;Spring Cloud 简介 Spring Cloud 二&#xff1a;核心组件解析 Spring Cloud 三&#xff1a;API网关深入探索与实战应用 Spring Cloud 四&#xff1a;微服务治理与安全 Spring Cloud 五&#xff1a;Spring Cloud与持续集成/持续部署&#xff08;CI/C…

Fiddler(6)AutoResponder

Fiddler最实用的功能, 它可以抓取在线页面保存到本地进行调试, 大大减少了在线调试的困难, 可以让我们修改服务器端返回的数据的

WinRadius 配置指南

WinRadius 配置指南 1 RADIUS概述 RADIUS 是一种用于在需要认证其链接的网络访问服务器(NAS)和共享认证服务器之间进行认证、授权和记帐信息的文档协议。 RADIUS在运维审计系统中,主要体现的是认证功能。 2 设置WinRadius服务器的操作步骤 (1)运行WinRadius。在真实计算机…

Camera基础知识三

参考资料:极客笔记 侵权联删Camera sensor状态机:状态机:POWER OFF、hardware standby、software、streaming 没电的时候就是power off状态,上电了进入hardware standby状态,xshutdown也就是reset,进入software standby状态。PLL寄存器配置进去之后就进入streaming状态Ca…

C语言例4-15:从键盘输入一个整数,求其绝对值并输出。

代码如下&#xff1a; //从键盘输入一个整数&#xff0c;求其绝对值并输出。 #include<stdio.h> int main(void) {int n;printf("输出一个整数&#xff1a; \n");scanf("%d",&n); //从键盘输入一个整数保存至变量nif(n<0) //…

Linux相关命令(1)

1、找出文件夹下包含 “aaa” 同时不包含 “bbb”的文件&#xff0c;然后把他们重新生成一下。要求只能用一行命令。 find ./ -type f -name "*aaa*" ! -name "*bbb*" -exec touch {} \;文件系统操作命令 df&#xff1a;列出文件系统的整体磁盘使用情况 …

Linux更换默认终端

在更换不同版本的gcc/g++时,提到了update-alternatives这个默认程序,这里同样要用。 下载完终端以后, sudo update-alternatives --config x-terminal-emulator然后运行即可

C语言:文件操作解析

在本文的开篇&#xff0c;我们要探讨为什么要使用文件&#xff1f;我们写的程序的数据是存储在电脑的内存中的&#xff0c;没有文件&#xff0c;如果程序退出&#xff0c;内存收回&#xff0c;数据就会丢失&#xff0c;等再次运行程序的时候&#xff0c;上次程序中的数据就找不…

运行.sh脚本文件

linux中.sh文件是脚本文件(shell脚本) 它可以将不同的命令组合起来,并按确定的顺序自动连续地执行。脚本文件是文本文件,用户可使用文本编辑器来创建脚本文件。 eg. 我利用vim 编写了如下内容: echo 我来了 echo 我走了 echo 这是test.shecho 是一个 Shell 内建命令 ,用来…

第1章 Hive基本概念

1.1 什么是Hivehive简介Hive:由facebook开源用于解决海量结构化日志的数据统计工具。 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL的查询功能。 2) Hive本质:将HQL转化成MapReduce程序。3) Hive的三个要点:Hive处理的数据存储在…

解决element-ui el-select数据过大方案

一、背景 项目中需要用到el-select选择医院,全国医院数据量非常大,通过API读取数据页面直接卡死。二、解决方案 1、组件:el-select + vue虚拟滚动(vue-virtual-scroll-list) 2、安装:npm install vue-virtual-scroll-list --save 3、参考:NPM地址:https://www.npmjs.co…

linux安装/切换不同版本c/c++

查看ubuntu系统上g++的版本:ls /usr/bin/g++*安装指定版本gcc和g++# 以version == 4.9为例 sudo apt-get install gcc-4.9 g++-4.9切换不同版本 当ubuntu系统上安装了不同版本的gcc和g++,可以使用update-alternatives命令设置默认使用哪个版本,典型的如在Ubuntu 16.04里安装…

.ipynb

“.ipynb” 文件是使用 Jupyter Notebook 来编写Python程序时的文件。 它可以在github直接打开,也可以通过网站打开(都没用过) 网站地址——   http:// https://nbviewer.jupyter.org/下载过Anaconda的,它自带jupyte 在菜单打开jupyter notebook(Windows中),就会自动打…

Spring+thymeleaf完成用户管理页面的增删查改功能

目录 知识点&#xff1a; 路由重定向 redirect:/*** 登录 控制层代码 接口 sql配置 页面效果 添加用户 控制层代码 接口 sql配置 页面效果 查看信息 控制层代码 接口 sql配置 页面效果 修改信息 控制层代码 接口 sql配置 页面效果 条件查询 控制层代码 …

PHP页面如何实现设置独立访问密码

PHP网页如果需要查看信息必须输入密码&#xff0c;验证后才可显示出内容的代码如何实现&#xff1f; 对某些php页面设置单独的访问密码,如果密码不正确则无法查看内容,相当于对页面进行了一个加密。 如何实现这个效果&#xff0c;详细教程可以参考&#xff1a;PHP页面如何实现…